From 9752d63f7e2d162b3970c311eb11bef089a8ff6f Mon Sep 17 00:00:00 2001 From: "Marcel S. Henselin" Date: Thu, 29 Jan 2026 10:05:13 +0100 Subject: [PATCH] chore: work save --- .github/actions/build/action.yaml | 23 +- .github/workflows/publish.yaml | 136 +++-- .gitignore | 4 +- cmd/cmd/buildCmd.go | 17 + cmd/cmd/publishCmd.go | 498 ++++++++++++++++++ cmd/cmd/rootCmd.go | 23 + cmd/main.go | 34 +- golang-ci.bck.yaml | 96 ---- pkg/kmsbeta/model_key.go | 24 +- pkg/kmsbeta/model_key_ring.go | 24 +- pkg/kmsbeta/model_wrapping_key.go | 24 +- .../model_get_instance_response.go | 48 +- pkg/vpnalpha/api_default.go | 20 +- pkg/vpnalpha/model_connection.go | 48 ++ pkg/vpnalpha/model_connection_request.go | 48 ++ ...model_create_gateway_connection_payload.go | 48 ++ ...model_update_gateway_connection_payload.go | 48 ++ .../internal/wait/postgresflexalpha/wait.go | 43 +- tools/main.go | 6 +- 19 files changed, 1003 insertions(+), 209 deletions(-) create mode 100644 cmd/cmd/buildCmd.go create mode 100644 cmd/cmd/publishCmd.go create mode 100644 cmd/cmd/rootCmd.go delete mode 100644 golang-ci.bck.yaml diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml index 89980ba5..9da06b1a 100644 --- a/.github/actions/build/action.yaml +++ b/.github/actions/build/action.yaml @@ -4,14 +4,31 @@ description: "Build pipeline" inputs: go-version: description: "Go version to install" + default: '1.25' required: true + golang-cilint-version: + description: "Golangci-lint version to install" + default: "2.7.2" + required: true + runs: using: "composite" steps: - name: Install Go ${{ inputs.go-version }} - uses: actions/setup-go@v5 + uses: actions/setup-go@v6 with: go-version: ${{ inputs.go-version }} - - name: Install project tools and dependencies + check-latest: true + go-version-file: 'go.mod' + + # - name: Run golangci-lint + # uses: golangci/golangci-lint-action@v9 + # with: + # version: ${{ inputs.golang-cilint-version }} + + - name: Install needed tools shell: bash - run: make project-tools \ No newline at end of file + run: | + set -e + go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@${{ inputs.golang-cilint-version }} + go install github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs@v0.24.0 diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml index 151a5178..70897b20 100644 --- a/.github/workflows/publish.yaml +++ b/.github/workflows/publish.yaml @@ -13,7 +13,7 @@ env: CODE_COVERAGE_ARTIFACT_NAME: "code-coverage" jobs: - main: + prep: name: prepare runs-on: ubuntu-latest permissions: @@ -22,6 +22,11 @@ jobs: contents: read # Required to checkout repository. pull-requests: write # Required to add PR comment. steps: + - name: Install prerequisites + run: | + apt-get -qq -y update + apt-get -qq -y install unzip zip + - name: Checkout uses: actions/checkout@v6 @@ -46,15 +51,15 @@ jobs: # - run: echo ${{ steps.plan.outputs.exitcode }} # Run plan by default, or apply on merge. - - uses: op5dev/tf-via-pr@v13 - with: - working-directory: path/to/directory - command: ${{ github.event_name == 'push' && 'apply' || 'plan' }} - arg-lock: ${{ github.event_name == 'push' }} - arg-backend-config: env/dev.tfbackend - arg-var-file: env/dev.tfvars - arg-workspace: dev-use1 - plan-encrypt: ${{ secrets.PASSPHRASE }} +# - uses: op5dev/tf-via-pr@v13 +# with: +# working-directory: path/to/directory +# command: ${{ github.event_name == 'push' && 'apply' || 'plan' }} +# arg-lock: ${{ github.event_name == 'push' }} +# arg-backend-config: env/dev.tfbackend +# arg-var-file: env/dev.tfvars +# arg-workspace: dev-use1 +# plan-encrypt: ${{ secrets.PASSPHRASE }} # - name: "Ensure docs are up-to-date" # if: ${{ github.event_name == 'pull_request' }} @@ -65,15 +70,15 @@ jobs: # if: ${{ github.event_name == 'pull_request' }} # run: go mod tidy - - name: golangci-lint - uses: golangci/golangci-lint-action@v9 - with: - version: v2.7 - args: --config=golang-ci.yaml --allow-parallel-runners --timeout=5m +# - name: golangci-lint +# uses: golangci/golangci-lint-action@v9 +# with: +# version: v2.7 +# args: --config=golang-ci.yaml --allow-parallel-runners --timeout=5m # - name: Lint # run: make lint - + # - name: Test # run: make test @@ -99,9 +104,9 @@ jobs: code_coverage: name: "Code coverage report" - if: github.event_name == 'pull_request' # Do not run when workflow is triggered by push to main branch + if: github.event_name == 'pull_request' || (github.event_name == 'push' && contains(github.ref, 'refs/tags/')) runs-on: ubuntu-latest - needs: main + needs: prep permissions: contents: read actions: read # to download code coverage results from "main" job @@ -116,20 +121,87 @@ jobs: root-package: 'tfregistry.sysops.stackit.rocks/mhenselin/stackitprivatepreview' publish: - name: "Publish artifact" + name: "Publish provider" + # if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + if: github.event_name == 'push' runs-on: ubuntu-latest + permissions: + actions: read # Required to identify workflow run. + checks: write # Required to add status summary. + contents: read # Required to checkout repository. + pull-requests: write # Required to add PR comment. steps: - - name: Set up S3cmd cli tool - uses: s3-actions/s3cmd@v2.0.1 - with: - provider: aws # default is linode - region: 'eu01' - access_key: ${{ secrets.S3_ACCESS_KEY }} - secret_key: ${{ secrets.S3_SECRET_KEY }} - - - name: Interact with object storage + - name: Install needed tools run: | - s3cmd ls - # s3cmd sync --recursive --acl-public dist s3://awesome.blog/ - # s3cmd put dist/style.css --mime-type 'text/css' --acl-public s3://awesome.blog/style.css - s3cmd info s3://awesome.blog + apt-get -y -qq update + apt-get -y -qq install jq python3 python3-pip python-is-python3 s3cmd git make wget + + - name: Checkout + uses: actions/checkout@v6 + + - name: Install Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v6 + with: + go-version: ${{ env.GO_VERSION }} + + - name: Install go tools + run: | + go install golang.org/x/tools/cmd/goimports@latest + go install github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework@latest + go install github.com/hashicorp/terraform-plugin-codegen-openapi/cmd/tfplugingen-openapi@latest + + - uses: actions/setup-java@v5 + with: + distribution: 'temurin' # See 'Supported distributions' for available options + java-version: '21' + + - name: Run build pkg directory + run: | + go run cmd/main.go build + + - name: Set up s3cfg + run: | + cat <<'EOF' >> ~/.s3cfg + [default] + host_base = https://object.storage.eu01.onstackit.cloud + host_bucket = https://%(bucket).object.storage.eu01.onstackit.cloud + check_ssl_certificate = False + access_key = ${{ secrets.S3_ACCESS_KEY }} + secret_key = ${{ secrets.S3_SECRET_KEY }} + EOF + + - name: Import GPG key + run: | + gpg --import private.key + + - name: Run GoReleaser + id: goreleaser + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GPG_FINGERPRINT: ${{ secrets.GPG_FINGERPRINT }} + uses: goreleaser/goreleaser-action@v6 + with: + args: release --skip publish --clean --snapshot + + - name: Prepare key file + run: | + echo $(echo ${{ secrets.KEY_FILE_B64 }} | base64 -d) >public_key.pem + + - name: Prepare provider directory structure + run: | + VERSION=$(jq -c .version < dist/metadata.json) + go run main.go \ + -ns=mhenselin \ + -p=stackitprivatepreview \ + -r=terraform-provider-stackitprivatepreview \ + -d=tfregistry.sysops.stackit.rocks \ + -gf=${{ secrets.GPG_FINGERPRINT }} \ + -gk=public_key.pem \ + -v=${VERSION} + + - name: Publish provider to S3 + run: | + set -e + cd release/ + s3cmd put --recursive v1 s3://terraform-provider-privatepreview/ + s3cmd put --recursive .well-known s3://terraform-provider-privatepreview/ diff --git a/.gitignore b/.gitignore index 56ab626b..d47a0ae2 100644 --- a/.gitignore +++ b/.gitignore @@ -40,4 +40,6 @@ coverage.out coverage.html generated stackit-sdk-generator -dist \ No newline at end of file +dist + +.secrets diff --git a/cmd/cmd/buildCmd.go b/cmd/cmd/buildCmd.go new file mode 100644 index 00000000..78ab41de --- /dev/null +++ b/cmd/cmd/buildCmd.go @@ -0,0 +1,17 @@ +package cmd + +import ( + "github.com/mhenselin/terraform-provider-stackitprivatepreview/tools" + "github.com/spf13/cobra" +) + +func NewBuildCmd() *cobra.Command { + return &cobra.Command{ + Use: "build", + Short: "Build the necessary boilerplate", + Long: `...`, + RunE: func(cmd *cobra.Command, args []string) error { + return tools.Build() + }, + } +} diff --git a/cmd/cmd/publishCmd.go b/cmd/cmd/publishCmd.go new file mode 100644 index 00000000..05e9106f --- /dev/null +++ b/cmd/cmd/publishCmd.go @@ -0,0 +1,498 @@ +package cmd + +import ( + "bufio" + "errors" + "fmt" + "io" + "io/fs" + "log" + "os" + "path" + "path/filepath" + "strings" + + "github.com/spf13/cobra" +) + +var ( + namespace string + domain string + providerName string + distPath string + repoName string + version string + gpgFingerprint string + gpgPubKeyFile string +) + +var rootCmd = &cobra.Command{ + Use: "publish", + Short: "Publish terraform provider", + Long: `...`, + RunE: func(cmd *cobra.Command, args []string) error { + return publish() + }, +} + +func init() { // nolint: gochecknoinits + rootCmd.Flags().StringVarP(&namespace, "namespace", "n", "", "Namespace for the Terraform registry.") + rootCmd.Flags().StringVarP(&domain, "domain", "d", "", "Domain for the Terraform registry.") + rootCmd.Flags().StringVarP(&providerName, "providerName", "p", "", "ProviderName for the Terraform registry.") + rootCmd.Flags().StringVarP(&distPath, "distPath", "x", "dist", "Dist Path for the Terraform registry.") + rootCmd.Flags().StringVarP(&repoName, "repoName", "r", "", "RepoName for the Terraform registry.") + rootCmd.Flags().StringVarP(&version, "version", "v", "", "Version for the Terraform registry.") + rootCmd.Flags().StringVarP(&gpgFingerprint, "gpgFingerprint", "f", "", "GPG Fingerprint for the Terraform registry.") + rootCmd.Flags().StringVarP(&gpgPubKeyFile, "gpgPubKeyFile", "k", "", "GPG PubKey file name for the Terraform registry.") + + err := rootCmd.MarkFlagRequired("namespace") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("domain") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("providerName") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("gpgFingerprint") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("gpgPubKeyFile") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("repoName") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("version") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("gpgFingerprint") + if err != nil { + return + } + err = rootCmd.MarkFlagRequired("gpgPubKeyFile") + if err != nil { + return + } +} + +func NewPublishCmd() *cobra.Command { + return rootCmd +} + +func publish() error { + log.Println("📦 Packaging Terraform Provider for private registry...") + + distPath = filepath.Clean(distPath) + "/" + + // Create release dir - only the contents of this need to be uploaded to S3 + err := createDir("release") + if err != nil { + return fmt.Errorf("error creating 'release' dir: %s", err) + } + + // Create .wellKnown directory and terraform.json file + err = wellKnown() + if err != nil { + return fmt.Errorf("error creating '.wellKnown' dir: %s", err) + } + + // Create v1 directory + err = provider(namespace, providerName, distPath, repoName, version, gpgFingerprint, gpgPubKeyFile, domain) + if err != nil { + return fmt.Errorf("error creating 'v1' dir: %s", err) + } + + log.Println("📦 Packaged Terraform Provider for private registry.") + return nil +} + +// This establishes the "API" as a TF provider by responding with the correct JSON payload, by using static files +func wellKnown() error { + log.Println("* Creating .well-known directory") + + err := createDir("release/.well-known") + if err != nil { + return err + } + + terraformJson := []byte(`{"providers.v1": "/v1/providers/"}`) + + log.Println(" - Writing to .well-known/terraform.json file") + err = writeFile("release/.well-known/terraform.json", terraformJson) + if err != nil { + return err + } + + return nil +} + +// provider is the Terraform name +// repoName is the Repository name +func provider(namespace, provider, distPath, repoName, version, gpgFingerprint, gpgPubKeyFile, domain string) error { + // Path to semantic version dir + versionPath := providerDirs(namespace, provider, version) + + // Files to create under v1/providers/[namespace]/[provider_name] + err := createVersionsFile(namespace, provider, distPath, repoName, version) + if err != nil { + return err + } // Creates version file one above download, which is why downloadPath isn't used + + // Files/Directories to create under v1/providers/[namespace]/[provider_name]/[version] + copyShaFiles(versionPath, distPath, repoName, version) + downloadPath, err := createDownloadsDir(versionPath) + if err != nil { + return err + } + + // Create darwin, freebsd, linux, windows dirs + err = createTargetDirs(*downloadPath) + if err != nil { + return err + } + + // Copy all zips + err = copyBuildZips(*downloadPath, distPath, repoName, version) + if err != nil { + return err + } + + // Create all individual files for build targets and each architecture for the build targets + err = createArchitectureFiles(namespace, provider, distPath, repoName, version, gpgFingerprint, gpgPubKeyFile, domain) + if err != nil { + return err + } + + return nil +} + +// Create the directories with a path format v1/providers/[namespace]/[provider_name]/[version] +func providerDirs(namespace, repoName, version string) string { + log.Println("* Creating release/v1/providers/[namespace]/[repo]/[version] directories") + + providerPathArr := [6]string{"release", "v1", "providers", namespace, repoName, version} + + var currentPath string + for _, v := range providerPathArr { + currentPath = currentPath + v + "/" + err := createDir(currentPath) + if err != nil { + return "" + } + } + + return currentPath +} + +// Create the versions file under v1/providers/[namespace]/[provider_name] +func createVersionsFile(namespace, provider, distPath, repoName, version string) error { + log.Println("* Writing to release/v1/providers/[namespace]/[repo]/versions file") + + versionPath := fmt.Sprintf("release/v1/providers/%s/%s/versions", namespace, provider) + + shaSumContents, err := getShaSumContents(distPath, repoName, version) + if err != nil { + return err + } + + // Build the versions file... + platforms := "" + for _, line := range shaSumContents { + fileName := line[1] // zip file name + + // get os and arch from filename + removeFileExtension := strings.Split(fileName, ".zip") + fileNameSplit := strings.Split(removeFileExtension[0], "_") + + // Get build target and architecture from the zip file name + target := fileNameSplit[2] + arch := fileNameSplit[3] + + platforms += "{" + platforms += fmt.Sprintf(`"os": "%s",`, target) + platforms += fmt.Sprintf(`"arch": "%s"`, arch) + platforms += "}" + platforms += "," + } + platforms = strings.TrimRight(platforms, ",") // remove trailing comma, json does not allow + + var versions = []byte(fmt.Sprintf(` +{ + "versions": [ + { + "version": "%s", + "protocols": [ + "4.0", + "5.1", + "6.0" + ], + "platform": [ + %s + ] + } + ] +} +`, version, platforms)) + + err = writeFile(versionPath, versions) + if err != nil { + return err + } + + return nil +} + +func copyShaFiles(destPath, srcPath, repoName, version string) { + log.Printf("* Copying SHA files in %s directory", srcPath) + + // Copy files from srcPath + shaSum := repoName + "_" + version + "_SHA256SUMS" + shaSumPath := srcPath + "/" + shaSum + + // _SHA256SUMS file + _, err := copyFile(shaSumPath, destPath+shaSum) + if err != nil { + log.Println(err) + } + + // _SHA256SUMS.sig file + _, err = copyFile(shaSumPath+".sig", destPath+shaSum+".sig") + if err != nil { + log.Println(err) + } +} + +func createDownloadsDir(destPath string) (*string, error) { + log.Printf("* Creating download/ in %s directory", destPath) + + downloadPath := path.Join(destPath, "download") + + err := createDir(downloadPath) + if err != nil { + return nil, err + } + + return &downloadPath, nil +} + +func createTargetDirs(destPath string) error { + log.Printf("* Creating target dirs in %s directory", destPath) + + targets := [4]string{"darwin", "freebsd", "linux", "windows"} + + for _, v := range targets { + err := createDir(destPath + v) + if err != nil { + return err + } + } + + return nil +} + +func copyBuildZips(destPath, distPath, repoName, version string) error { + log.Println("* Copying build zips") + + shaSumContents, err := getShaSumContents(distPath, repoName, version) + if err != nil { + return err + } + + // Loop through and copy each + for _, v := range shaSumContents { + zipName := v[1] + zipSrcPath := distPath + zipName + zipDestPath := destPath + zipName + + log.Printf(" - Zip Source: %s", zipSrcPath) + log.Printf(" - Zip Dest: %s", zipDestPath) + + // Copy the zip + _, err := copyFile(zipSrcPath, zipDestPath) + if err != nil { + return err + } + } + + return nil +} + +func getShaSumContents(distPath, repoName, version string) ([][]string, error) { + shaSumFileName := repoName + "_" + version + "_SHA256SUMS" + shaSumPath := distPath + "/" + shaSumFileName + + shaSumLine, err := readFile(shaSumPath) + if err != nil { + return nil, err + } + + buildsAndShaSums := [][]string{} + + for _, line := range shaSumLine { + lineSplit := strings.Split(line, " ") + + row := []string{lineSplit[0], lineSplit[1]} + buildsAndShaSums = append(buildsAndShaSums, row) + } + + // log.Println(buildsAndShaSums) + + return buildsAndShaSums, nil +} + +// Create architecture files for each build target +func createArchitectureFiles(namespace, provider, distPath, repoName, version, gpgFingerprint, gpgPubKeyFile, domain string) error { + log.Println("* Creating architecture files in target directories") + + // filename = terraform-provider-[provider]_0.0.1_darwin_amd64.zip - provider_name + version + target + architecture + .zip + prefix := fmt.Sprintf("v1/providers/%s/%s/%s/", namespace, provider, version) + pathPrefix := fmt.Sprintf("release/%s", prefix) + urlPrefix := fmt.Sprintf("https://%s/%s", domain, prefix) + + // download url = https://example.com/v1/providers/namespace/provider/0.0.1/download/terraform-provider_0.0.1_darwin_amd64.zip + downloadUrlPrefix := urlPrefix + "download/" + downloadPathPrefix := pathPrefix + "download/" + + // shasums url = https://example.com/v1/providers/namespace/provider/0.0.1/terraform-provider_0.0.1_SHA256SUMS + shasumsUrl := urlPrefix + fmt.Sprintf("%s_%s_SHA256SUMS", repoName, version) + // shasums_signature_url = https://example.com/v1/providers/namespace/provider/0.0.1/terraform-provider_0.0.1_SHA256SUMS.sig + shasumsSigUrl := shasumsUrl + ".sig" + + shaSumContents, err := getShaSumContents(distPath, repoName, version) + if err != nil { + return err + } + + // Get contents of GPG key + gpgFile, err := readFile(gpgPubKeyFile) + if err != nil { + log.Printf("Error reading '%s' file: %s", gpgPubKeyFile, err) + } + + // loop through every line and stick with \\n + gpgAsciiPub := "" + for _, line := range gpgFile { + gpgAsciiPub = gpgAsciiPub + line + "\\n" + } + // log.Println(gpgAsciiPub) + + for _, line := range shaSumContents { + shasum := line[0] // shasum of the zip + fileName := line[1] // zip file name + + downloadUrl := downloadUrlPrefix + fileName + + // get os and arch from filename + removeFileExtension := strings.Split(fileName, ".zip") + fileNameSplit := strings.Split(removeFileExtension[0], "_") + + // Get build target and architecture from the zip file name + target := fileNameSplit[2] + arch := fileNameSplit[3] + + // build filepath + archFileName := downloadPathPrefix + target + "/" + arch + + var architectureTemplate = []byte(fmt.Sprintf(` +{ + "protocols": [ + "4.0", + "5.1" + ], + "os": "%s", + "arch": "%s", + "filename": "%s", + "download_url": "%s", + "shasums_url": "%s", + "shasums_signature_url": "%s", + "shasum": "%s", + "signing_keys": { + "gpg_public_keys": [ + { + "key_id": "%s", + "ascii_armor": "%s", + "trust_signature": "", + "source": "", + "source_url": "" + } + ] + } +} +`, target, arch, fileName, downloadUrl, shasumsUrl, shasumsSigUrl, shasum, gpgFingerprint, gpgAsciiPub)) + + log.Printf(" - Arch file: %s", archFileName) + + err := writeFile(archFileName, architectureTemplate) + if err != nil { + return err + } + } + + return nil +} + +func createDir(path string) error { + log.Printf("* Creating %s directory", path) + err := os.Mkdir(path, os.ModePerm) + if errors.Is(err, fs.ErrExist) { + return nil + } + return err +} + +func copyFile(src, dst string) (int64, error) { + sourceFileStat, err := os.Stat(src) + if err != nil { + return 0, err + } + + if !sourceFileStat.Mode().IsRegular() { + return 0, fmt.Errorf("%s is not a regular file", src) + } + + source, err := os.Open(src) + if err != nil { + return 0, err + } + defer source.Close() + + destination, err := os.Create(dst) + if err != nil { + return 0, err + } + defer destination.Close() + nBytes, err := io.Copy(destination, source) + return nBytes, err +} + +func readFile(filePath string) ([]string, error) { + rFile, err := os.Open(filePath) + + if err != nil { + return nil, err + } + fileScanner := bufio.NewScanner(rFile) + fileScanner.Split(bufio.ScanLines) + var fileLines []string + + for fileScanner.Scan() { + fileLines = append(fileLines, fileScanner.Text()) + } + + rFile.Close() + + return fileLines, nil +} + +func writeFile(fileName string, fileContents []byte) error { + err := os.WriteFile(fileName, fileContents, 0644) + return err +} diff --git a/cmd/cmd/rootCmd.go b/cmd/cmd/rootCmd.go new file mode 100644 index 00000000..924d8794 --- /dev/null +++ b/cmd/cmd/rootCmd.go @@ -0,0 +1,23 @@ +package cmd + +import ( + "github.com/spf13/cobra" +) + +func NewRootCmd() *cobra.Command { + return &cobra.Command{ + Use: "build-tools", + Short: "...", + Long: "...", + SilenceErrors: true, // Error is beautified in a custom way before being printed + SilenceUsage: true, + DisableAutoGenTag: true, + RunE: func(cmd *cobra.Command, _ []string) error { + err := cmd.Help() + if err != nil { + return err + } + return nil + }, + } +} diff --git a/cmd/main.go b/cmd/main.go index f3487bf2..40fbbfef 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -4,29 +4,23 @@ import ( "log" "os" - "github.com/mhenselin/terraform-provider-stackitprivatepreview/tools" - "github.com/spf13/cobra" + "github.com/mhenselin/terraform-provider-stackitprivatepreview/cmd/cmd" ) -func NewRootCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "builder", - Short: "...", - Long: "...", - SilenceErrors: true, // Error is beautified in a custom way before being printed - SilenceUsage: true, - DisableAutoGenTag: true, - RunE: func(_ *cobra.Command, _ []string) error { - return tools.Build() - }, - } - cmd.SetOut(os.Stdout) - return cmd -} - func main() { - cmd := NewRootCmd() - err := cmd.Execute() + rootCmd := cmd.NewRootCmd() + //rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") + //rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution") + //rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project") + + rootCmd.SetOut(os.Stdout) + + rootCmd.AddCommand( + cmd.NewBuildCmd(), + cmd.NewPublishCmd(), + ) + + err := rootCmd.Execute() if err != nil { log.Fatal(err) } diff --git a/golang-ci.bck.yaml b/golang-ci.bck.yaml deleted file mode 100644 index e51289fc..00000000 --- a/golang-ci.bck.yaml +++ /dev/null @@ -1,96 +0,0 @@ - -# This file contains all available configuration options -# with their default values. - -# options for analysis running -run: - # default concurrency is a available CPU number - concurrency: 4 - - # timeout for analysis, e.g. 30s, 5m, default is 1m - timeout: 5m -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 - - errorlint - - 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 diff --git a/pkg/kmsbeta/model_key.go b/pkg/kmsbeta/model_key.go index 946e7f64..54afbcfa 100644 --- a/pkg/kmsbeta/model_key.go +++ b/pkg/kmsbeta/model_key.go @@ -410,8 +410,7 @@ type Key struct { // This date is set when a key is pending deletion and refers to the scheduled date of deletion DeletionDate KeyGetDeletionDateAttributeType `json:"deletionDate,omitempty"` // A user chosen description to distinguish multiple keys. - // REQUIRED - Description KeyGetDescriptionAttributeType `json:"description" required:"true"` + Description KeyGetDescriptionAttributeType `json:"description,omitempty"` // The display name to distinguish multiple keys. // REQUIRED DisplayName KeyGetDisplayNameAttributeType `json:"displayName" required:"true"` @@ -439,13 +438,12 @@ type _Key Key // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewKey(accessScope KeyGetAccessScopeArgType, algorithm KeyGetAlgorithmArgType, backend KeyGetBackendArgType, createdAt KeyGetCreatedAtArgType, description KeyGetDescriptionArgType, displayName KeyGetDisplayNameArgType, id KeyGetIdArgType, importOnly KeygetImportOnlyArgType, keyRingId KeyGetKeyRingIdArgType, protection KeyGetProtectionArgType, purpose KeyGetPurposeArgType, state KeyGetStateArgType) *Key { +func NewKey(accessScope KeyGetAccessScopeArgType, algorithm KeyGetAlgorithmArgType, backend KeyGetBackendArgType, createdAt KeyGetCreatedAtArgType, displayName KeyGetDisplayNameArgType, id KeyGetIdArgType, importOnly KeygetImportOnlyArgType, keyRingId KeyGetKeyRingIdArgType, protection KeyGetProtectionArgType, purpose KeyGetPurposeArgType, state KeyGetStateArgType) *Key { this := Key{} setKeyGetAccessScopeAttributeType(&this.AccessScope, accessScope) setKeyGetAlgorithmAttributeType(&this.Algorithm, algorithm) setKeyGetBackendAttributeType(&this.Backend, backend) setKeyGetCreatedAtAttributeType(&this.CreatedAt, createdAt) - setKeyGetDescriptionAttributeType(&this.Description, description) setKeyGetDisplayNameAttributeType(&this.DisplayName, displayName) setKeyGetIdAttributeType(&this.Id, id) setKeygetImportOnlyAttributeType(&this.ImportOnly, importOnly) @@ -562,19 +560,25 @@ func (o *Key) SetDeletionDate(v KeyGetDeletionDateRetType) { setKeyGetDeletionDateAttributeType(&o.DeletionDate, v) } -// GetDescription returns the Description field value -func (o *Key) GetDescription() (ret KeyGetDescriptionRetType) { - ret, _ = o.GetDescriptionOk() - return ret +// GetDescription returns the Description field value if set, zero value otherwise. +func (o *Key) GetDescription() (res KeyGetDescriptionRetType) { + res, _ = o.GetDescriptionOk() + return } -// GetDescriptionOk returns a tuple with the Description field value +// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise // and a boolean to check if the value has been set. func (o *Key) GetDescriptionOk() (ret KeyGetDescriptionRetType, ok bool) { return getKeyGetDescriptionAttributeTypeOk(o.Description) } -// SetDescription sets field value +// HasDescription returns a boolean if a field has been set. +func (o *Key) HasDescription() bool { + _, ok := o.GetDescriptionOk() + return ok +} + +// SetDescription gets a reference to the given string and assigns it to the Description field. func (o *Key) SetDescription(v KeyGetDescriptionRetType) { setKeyGetDescriptionAttributeType(&o.Description, v) } diff --git a/pkg/kmsbeta/model_key_ring.go b/pkg/kmsbeta/model_key_ring.go index 4615a058..c5a460a6 100644 --- a/pkg/kmsbeta/model_key_ring.go +++ b/pkg/kmsbeta/model_key_ring.go @@ -234,8 +234,7 @@ type KeyRing struct { // REQUIRED CreatedAt KeyRingGetCreatedAtAttributeType `json:"createdAt" required:"true"` // A user chosen description to distinguish multiple key rings. - // REQUIRED - Description KeyRingGetDescriptionAttributeType `json:"description" required:"true"` + Description KeyRingGetDescriptionAttributeType `json:"description,omitempty"` // The display name to distinguish multiple key rings. // REQUIRED DisplayName KeyRingGetDisplayNameAttributeType `json:"displayName" required:"true"` @@ -253,10 +252,9 @@ type _KeyRing KeyRing // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewKeyRing(createdAt KeyRingGetCreatedAtArgType, description KeyRingGetDescriptionArgType, displayName KeyRingGetDisplayNameArgType, id KeyRingGetIdArgType, state KeyRingGetStateArgType) *KeyRing { +func NewKeyRing(createdAt KeyRingGetCreatedAtArgType, displayName KeyRingGetDisplayNameArgType, id KeyRingGetIdArgType, state KeyRingGetStateArgType) *KeyRing { this := KeyRing{} setKeyRingGetCreatedAtAttributeType(&this.CreatedAt, createdAt) - setKeyRingGetDescriptionAttributeType(&this.Description, description) setKeyRingGetDisplayNameAttributeType(&this.DisplayName, displayName) setKeyRingGetIdAttributeType(&this.Id, id) setKeyRingGetStateAttributeType(&this.State, state) @@ -288,19 +286,25 @@ func (o *KeyRing) SetCreatedAt(v KeyRingGetCreatedAtRetType) { setKeyRingGetCreatedAtAttributeType(&o.CreatedAt, v) } -// GetDescription returns the Description field value -func (o *KeyRing) GetDescription() (ret KeyRingGetDescriptionRetType) { - ret, _ = o.GetDescriptionOk() - return ret +// GetDescription returns the Description field value if set, zero value otherwise. +func (o *KeyRing) GetDescription() (res KeyRingGetDescriptionRetType) { + res, _ = o.GetDescriptionOk() + return } -// GetDescriptionOk returns a tuple with the Description field value +// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise // and a boolean to check if the value has been set. func (o *KeyRing) GetDescriptionOk() (ret KeyRingGetDescriptionRetType, ok bool) { return getKeyRingGetDescriptionAttributeTypeOk(o.Description) } -// SetDescription sets field value +// HasDescription returns a boolean if a field has been set. +func (o *KeyRing) HasDescription() bool { + _, ok := o.GetDescriptionOk() + return ok +} + +// SetDescription gets a reference to the given string and assigns it to the Description field. func (o *KeyRing) SetDescription(v KeyRingGetDescriptionRetType) { setKeyRingGetDescriptionAttributeType(&o.Description, v) } diff --git a/pkg/kmsbeta/model_wrapping_key.go b/pkg/kmsbeta/model_wrapping_key.go index fdc36727..3a568ae1 100644 --- a/pkg/kmsbeta/model_wrapping_key.go +++ b/pkg/kmsbeta/model_wrapping_key.go @@ -407,8 +407,7 @@ type WrappingKey struct { // REQUIRED CreatedAt WrappingKeyGetCreatedAtAttributeType `json:"createdAt" required:"true"` // A user chosen description to distinguish multiple wrapping keys. - // REQUIRED - Description WrappingKeyGetDescriptionAttributeType `json:"description" required:"true"` + Description WrappingKeyGetDescriptionAttributeType `json:"description,omitempty"` // The display name to distinguish multiple wrapping keys. // REQUIRED DisplayName WrappingKeyGetDisplayNameAttributeType `json:"displayName" required:"true"` @@ -438,13 +437,12 @@ type _WrappingKey WrappingKey // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewWrappingKey(accessScope WrappingKeyGetAccessScopeArgType, algorithm WrappingKeyGetAlgorithmArgType, backend WrappingKeyGetBackendArgType, createdAt WrappingKeyGetCreatedAtArgType, description WrappingKeyGetDescriptionArgType, displayName WrappingKeyGetDisplayNameArgType, expiresAt WrappingKeyGetExpiresAtArgType, id WrappingKeyGetIdArgType, keyRingId WrappingKeyGetKeyRingIdArgType, protection WrappingKeyGetProtectionArgType, purpose WrappingKeyGetPurposeArgType, state WrappingKeyGetStateArgType) *WrappingKey { +func NewWrappingKey(accessScope WrappingKeyGetAccessScopeArgType, algorithm WrappingKeyGetAlgorithmArgType, backend WrappingKeyGetBackendArgType, createdAt WrappingKeyGetCreatedAtArgType, displayName WrappingKeyGetDisplayNameArgType, expiresAt WrappingKeyGetExpiresAtArgType, id WrappingKeyGetIdArgType, keyRingId WrappingKeyGetKeyRingIdArgType, protection WrappingKeyGetProtectionArgType, purpose WrappingKeyGetPurposeArgType, state WrappingKeyGetStateArgType) *WrappingKey { this := WrappingKey{} setWrappingKeyGetAccessScopeAttributeType(&this.AccessScope, accessScope) setWrappingKeyGetAlgorithmAttributeType(&this.Algorithm, algorithm) setWrappingKeyGetBackendAttributeType(&this.Backend, backend) setWrappingKeyGetCreatedAtAttributeType(&this.CreatedAt, createdAt) - setWrappingKeyGetDescriptionAttributeType(&this.Description, description) setWrappingKeyGetDisplayNameAttributeType(&this.DisplayName, displayName) setWrappingKeyGetExpiresAtAttributeType(&this.ExpiresAt, expiresAt) setWrappingKeyGetIdAttributeType(&this.Id, id) @@ -536,19 +534,25 @@ func (o *WrappingKey) SetCreatedAt(v WrappingKeyGetCreatedAtRetType) { setWrappingKeyGetCreatedAtAttributeType(&o.CreatedAt, v) } -// GetDescription returns the Description field value -func (o *WrappingKey) GetDescription() (ret WrappingKeyGetDescriptionRetType) { - ret, _ = o.GetDescriptionOk() - return ret +// GetDescription returns the Description field value if set, zero value otherwise. +func (o *WrappingKey) GetDescription() (res WrappingKeyGetDescriptionRetType) { + res, _ = o.GetDescriptionOk() + return } -// GetDescriptionOk returns a tuple with the Description field value +// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise // and a boolean to check if the value has been set. func (o *WrappingKey) GetDescriptionOk() (ret WrappingKeyGetDescriptionRetType, ok bool) { return getWrappingKeyGetDescriptionAttributeTypeOk(o.Description) } -// SetDescription sets field value +// HasDescription returns a boolean if a field has been set. +func (o *WrappingKey) HasDescription() bool { + _, ok := o.GetDescriptionOk() + return ok +} + +// SetDescription gets a reference to the given string and assigns it to the Description field. func (o *WrappingKey) SetDescription(v WrappingKeyGetDescriptionRetType) { setWrappingKeyGetDescriptionAttributeType(&o.Description, v) } diff --git a/pkg/postgresflexalpha/model_get_instance_response.go b/pkg/postgresflexalpha/model_get_instance_response.go index 8d4a16a4..100d415d 100644 --- a/pkg/postgresflexalpha/model_get_instance_response.go +++ b/pkg/postgresflexalpha/model_get_instance_response.go @@ -38,6 +38,26 @@ func setGetInstanceResponseGetBackupScheduleAttributeType(arg *GetInstanceRespon type GetInstanceResponseGetBackupScheduleArgType = string type GetInstanceResponseGetBackupScheduleRetType = string +/* + types and functions for connectionInfo +*/ + +// isModel +type GetInstanceResponseGetConnectionInfoAttributeType = *InstanceConnectionInfo +type GetInstanceResponseGetConnectionInfoArgType = InstanceConnectionInfo +type GetInstanceResponseGetConnectionInfoRetType = InstanceConnectionInfo + +func getGetInstanceResponseGetConnectionInfoAttributeTypeOk(arg GetInstanceResponseGetConnectionInfoAttributeType) (ret GetInstanceResponseGetConnectionInfoRetType, ok bool) { + if arg == nil { + return ret, false + } + return *arg, true +} + +func setGetInstanceResponseGetConnectionInfoAttributeType(arg *GetInstanceResponseGetConnectionInfoAttributeType, val GetInstanceResponseGetConnectionInfoRetType) { + *arg = &val +} + /* types and functions for encryption */ @@ -267,6 +287,8 @@ type GetInstanceResponse struct { // The schedule for on what time and how often the database backup will be created. The schedule is written as a cron schedule. // REQUIRED BackupSchedule GetInstanceResponseGetBackupScheduleAttributeType `json:"backupSchedule" required:"true"` + // REQUIRED + ConnectionInfo GetInstanceResponseGetConnectionInfoAttributeType `json:"connectionInfo" required:"true"` Encryption GetInstanceResponseGetEncryptionAttributeType `json:"encryption,omitempty"` // The id of the instance flavor. // REQUIRED @@ -303,9 +325,10 @@ type _GetInstanceResponse GetInstanceResponse // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewGetInstanceResponse(backupSchedule GetInstanceResponseGetBackupScheduleArgType, flavorId GetInstanceResponseGetFlavorIdArgType, id GetInstanceResponseGetIdArgType, isDeletable GetInstanceResponsegetIsDeletableArgType, name GetInstanceResponseGetNameArgType, network GetInstanceResponseGetNetworkArgType, replicas GetInstanceResponseGetReplicasArgType, retentionDays GetInstanceResponseGetRetentionDaysArgType, status GetInstanceResponseGetStatusArgType, storage GetInstanceResponseGetStorageArgType, version GetInstanceResponseGetVersionArgType) *GetInstanceResponse { +func NewGetInstanceResponse(backupSchedule GetInstanceResponseGetBackupScheduleArgType, connectionInfo GetInstanceResponseGetConnectionInfoArgType, flavorId GetInstanceResponseGetFlavorIdArgType, id GetInstanceResponseGetIdArgType, isDeletable GetInstanceResponsegetIsDeletableArgType, name GetInstanceResponseGetNameArgType, network GetInstanceResponseGetNetworkArgType, replicas GetInstanceResponseGetReplicasArgType, retentionDays GetInstanceResponseGetRetentionDaysArgType, status GetInstanceResponseGetStatusArgType, storage GetInstanceResponseGetStorageArgType, version GetInstanceResponseGetVersionArgType) *GetInstanceResponse { this := GetInstanceResponse{} setGetInstanceResponseGetBackupScheduleAttributeType(&this.BackupSchedule, backupSchedule) + setGetInstanceResponseGetConnectionInfoAttributeType(&this.ConnectionInfo, connectionInfo) setGetInstanceResponseGetFlavorIdAttributeType(&this.FlavorId, flavorId) setGetInstanceResponseGetIdAttributeType(&this.Id, id) setGetInstanceResponsegetIsDeletableAttributeType(&this.IsDeletable, isDeletable) @@ -344,6 +367,23 @@ func (o *GetInstanceResponse) SetBackupSchedule(v GetInstanceResponseGetBackupSc setGetInstanceResponseGetBackupScheduleAttributeType(&o.BackupSchedule, v) } +// GetConnectionInfo returns the ConnectionInfo field value +func (o *GetInstanceResponse) GetConnectionInfo() (ret GetInstanceResponseGetConnectionInfoRetType) { + ret, _ = o.GetConnectionInfoOk() + return ret +} + +// GetConnectionInfoOk returns a tuple with the ConnectionInfo field value +// and a boolean to check if the value has been set. +func (o *GetInstanceResponse) GetConnectionInfoOk() (ret GetInstanceResponseGetConnectionInfoRetType, ok bool) { + return getGetInstanceResponseGetConnectionInfoAttributeTypeOk(o.ConnectionInfo) +} + +// SetConnectionInfo sets field value +func (o *GetInstanceResponse) SetConnectionInfo(v GetInstanceResponseGetConnectionInfoRetType) { + setGetInstanceResponseGetConnectionInfoAttributeType(&o.ConnectionInfo, v) +} + // GetEncryption returns the Encryption field value if set, zero value otherwise. func (o *GetInstanceResponse) GetEncryption() (res GetInstanceResponseGetEncryptionRetType) { res, _ = o.GetEncryptionOk() @@ -542,6 +582,12 @@ func (o GetInstanceResponse) ToMap() (map[string]interface{}, error) { if val, ok := getGetInstanceResponseGetBackupScheduleAttributeTypeOk(o.BackupSchedule); ok { toSerialize["BackupSchedule"] = val } + if val, ok := getGetInstanceResponseGetConnectionInfoAttributeTypeOk(o.ConnectionInfo); ok { + toSerialize["ConnectionInfo"] = val + } + if val, ok := getGetInstanceResponseGetEncryptionAttributeTypeOk(o.Encryption); ok { + toSerialize["Encryption"] = val + } if val, ok := getGetInstanceResponseGetFlavorIdAttributeTypeOk(o.FlavorId); ok { toSerialize["FlavorId"] = val } diff --git a/pkg/vpnalpha/api_default.go b/pkg/vpnalpha/api_default.go index 38c1d6a1..4fca6326 100644 --- a/pkg/vpnalpha/api_default.go +++ b/pkg/vpnalpha/api_default.go @@ -354,6 +354,7 @@ type ApiGetVPNGatewayStatusRequest interface { } type ApiListGatewayConnectionsRequest interface { + LabelSelector(labelSelector map[string]string) ApiListGatewayConnectionsRequest Execute() (*ConnectionList, error) } @@ -1860,11 +1861,17 @@ func (a *APIClient) GetVPNGatewayStatusExecute(ctx context.Context, projectId st } type ListGatewayConnectionsRequest struct { - ctx context.Context - apiService *DefaultApiService - projectId string - region Region - gatewayName string + ctx context.Context + apiService *DefaultApiService + projectId string + region Region + gatewayName string + labelSelector *map[string]string +} + +func (r ListGatewayConnectionsRequest) LabelSelector(labelSelector map[string]string) ApiListGatewayConnectionsRequest { + r.labelSelector = &labelSelector + return r } func (r ListGatewayConnectionsRequest) Execute() (*ConnectionList, error) { @@ -1893,6 +1900,9 @@ func (r ListGatewayConnectionsRequest) Execute() (*ConnectionList, error) { localVarQueryParams := url.Values{} localVarFormParams := url.Values{} + if r.labelSelector != nil { + parameterAddToHeaderOrQuery(localVarQueryParams, "label_selector", r.labelSelector, "") + } // to determine the Content-Type header localVarHTTPContentTypes := []string{} diff --git a/pkg/vpnalpha/model_connection.go b/pkg/vpnalpha/model_connection.go index c308b66b..22c7bfda 100644 --- a/pkg/vpnalpha/model_connection.go +++ b/pkg/vpnalpha/model_connection.go @@ -37,6 +37,26 @@ func setConnectiongetEnabledAttributeType(arg *ConnectiongetEnabledAttributeType *arg = &val } +/* + types and functions for labels +*/ + +// isContainer +type ConnectionGetLabelsAttributeType = *map[string]string +type ConnectionGetLabelsArgType = map[string]string +type ConnectionGetLabelsRetType = map[string]string + +func getConnectionGetLabelsAttributeTypeOk(arg ConnectionGetLabelsAttributeType) (ret ConnectionGetLabelsRetType, ok bool) { + if arg == nil { + return ret, false + } + return *arg, true +} + +func setConnectionGetLabelsAttributeType(arg *ConnectionGetLabelsAttributeType, val ConnectionGetLabelsRetType) { + *arg = &val +} + /* types and functions for localSubnets */ @@ -142,6 +162,8 @@ func setConnectionGetTunnel2AttributeType(arg *ConnectionGetTunnel2AttributeType type Connection struct { // This flag decides whether this connection should be enabled or disabled Enabled ConnectiongetEnabledAttributeType `json:"enabled,omitempty"` + // Map of custom labels. Key and values must be max 63 chars, start/end with alphanumeric. + Labels ConnectionGetLabelsAttributeType `json:"labels,omitempty"` // List of local subnets (IPv4 CIDR). // REQUIRED LocalSubnets ConnectionGetLocalSubnetsAttributeType `json:"localSubnets" required:"true"` @@ -204,6 +226,29 @@ func (o *Connection) SetEnabled(v ConnectiongetEnabledRetType) { setConnectiongetEnabledAttributeType(&o.Enabled, v) } +// GetLabels returns the Labels field value if set, zero value otherwise. +func (o *Connection) GetLabels() (res ConnectionGetLabelsRetType) { + res, _ = o.GetLabelsOk() + return +} + +// GetLabelsOk returns a tuple with the Labels field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *Connection) GetLabelsOk() (ret ConnectionGetLabelsRetType, ok bool) { + return getConnectionGetLabelsAttributeTypeOk(o.Labels) +} + +// HasLabels returns a boolean if a field has been set. +func (o *Connection) HasLabels() bool { + _, ok := o.GetLabelsOk() + return ok +} + +// SetLabels gets a reference to the given map[string]string and assigns it to the Labels field. +func (o *Connection) SetLabels(v ConnectionGetLabelsRetType) { + setConnectionGetLabelsAttributeType(&o.Labels, v) +} + // GetLocalSubnets returns the LocalSubnets field value func (o *Connection) GetLocalSubnets() (ret ConnectionGetLocalSubnetsRetType) { ret, _ = o.GetLocalSubnetsOk() @@ -294,6 +339,9 @@ func (o Connection) ToMap() (map[string]interface{}, error) { if val, ok := getConnectiongetEnabledAttributeTypeOk(o.Enabled); ok { toSerialize["Enabled"] = val } + if val, ok := getConnectionGetLabelsAttributeTypeOk(o.Labels); ok { + toSerialize["Labels"] = val + } if val, ok := getConnectionGetLocalSubnetsAttributeTypeOk(o.LocalSubnets); ok { toSerialize["LocalSubnets"] = val } diff --git a/pkg/vpnalpha/model_connection_request.go b/pkg/vpnalpha/model_connection_request.go index d59382f5..2651839d 100644 --- a/pkg/vpnalpha/model_connection_request.go +++ b/pkg/vpnalpha/model_connection_request.go @@ -37,6 +37,26 @@ func setConnectionRequestgetEnabledAttributeType(arg *ConnectionRequestgetEnable *arg = &val } +/* + types and functions for labels +*/ + +// isContainer +type ConnectionRequestGetLabelsAttributeType = *map[string]string +type ConnectionRequestGetLabelsArgType = map[string]string +type ConnectionRequestGetLabelsRetType = map[string]string + +func getConnectionRequestGetLabelsAttributeTypeOk(arg ConnectionRequestGetLabelsAttributeType) (ret ConnectionRequestGetLabelsRetType, ok bool) { + if arg == nil { + return ret, false + } + return *arg, true +} + +func setConnectionRequestGetLabelsAttributeType(arg *ConnectionRequestGetLabelsAttributeType, val ConnectionRequestGetLabelsRetType) { + *arg = &val +} + /* types and functions for localSubnets */ @@ -142,6 +162,8 @@ func setConnectionRequestGetTunnel2AttributeType(arg *ConnectionRequestGetTunnel type ConnectionRequest struct { // This flag decides whether this connection should be enabled or disabled Enabled ConnectionRequestgetEnabledAttributeType `json:"enabled,omitempty"` + // Map of custom labels. Key and values must be max 63 chars, start/end with alphanumeric. + Labels ConnectionRequestGetLabelsAttributeType `json:"labels,omitempty"` // List of local subnets (IPv4 CIDR). // REQUIRED LocalSubnets ConnectionRequestGetLocalSubnetsAttributeType `json:"localSubnets" required:"true"` @@ -204,6 +226,29 @@ func (o *ConnectionRequest) SetEnabled(v ConnectionRequestgetEnabledRetType) { setConnectionRequestgetEnabledAttributeType(&o.Enabled, v) } +// GetLabels returns the Labels field value if set, zero value otherwise. +func (o *ConnectionRequest) GetLabels() (res ConnectionRequestGetLabelsRetType) { + res, _ = o.GetLabelsOk() + return +} + +// GetLabelsOk returns a tuple with the Labels field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *ConnectionRequest) GetLabelsOk() (ret ConnectionRequestGetLabelsRetType, ok bool) { + return getConnectionRequestGetLabelsAttributeTypeOk(o.Labels) +} + +// HasLabels returns a boolean if a field has been set. +func (o *ConnectionRequest) HasLabels() bool { + _, ok := o.GetLabelsOk() + return ok +} + +// SetLabels gets a reference to the given map[string]string and assigns it to the Labels field. +func (o *ConnectionRequest) SetLabels(v ConnectionRequestGetLabelsRetType) { + setConnectionRequestGetLabelsAttributeType(&o.Labels, v) +} + // GetLocalSubnets returns the LocalSubnets field value func (o *ConnectionRequest) GetLocalSubnets() (ret ConnectionRequestGetLocalSubnetsRetType) { ret, _ = o.GetLocalSubnetsOk() @@ -294,6 +339,9 @@ func (o ConnectionRequest) ToMap() (map[string]interface{}, error) { if val, ok := getConnectionRequestgetEnabledAttributeTypeOk(o.Enabled); ok { toSerialize["Enabled"] = val } + if val, ok := getConnectionRequestGetLabelsAttributeTypeOk(o.Labels); ok { + toSerialize["Labels"] = val + } if val, ok := getConnectionRequestGetLocalSubnetsAttributeTypeOk(o.LocalSubnets); ok { toSerialize["LocalSubnets"] = val } diff --git a/pkg/vpnalpha/model_create_gateway_connection_payload.go b/pkg/vpnalpha/model_create_gateway_connection_payload.go index 8e806898..1c4d42a8 100644 --- a/pkg/vpnalpha/model_create_gateway_connection_payload.go +++ b/pkg/vpnalpha/model_create_gateway_connection_payload.go @@ -37,6 +37,26 @@ func setCreateGatewayConnectionPayloadgetEnabledAttributeType(arg *CreateGateway *arg = &val } +/* + types and functions for labels +*/ + +// isContainer +type CreateGatewayConnectionPayloadGetLabelsAttributeType = *map[string]string +type CreateGatewayConnectionPayloadGetLabelsArgType = map[string]string +type CreateGatewayConnectionPayloadGetLabelsRetType = map[string]string + +func getCreateGatewayConnectionPayloadGetLabelsAttributeTypeOk(arg CreateGatewayConnectionPayloadGetLabelsAttributeType) (ret CreateGatewayConnectionPayloadGetLabelsRetType, ok bool) { + if arg == nil { + return ret, false + } + return *arg, true +} + +func setCreateGatewayConnectionPayloadGetLabelsAttributeType(arg *CreateGatewayConnectionPayloadGetLabelsAttributeType, val CreateGatewayConnectionPayloadGetLabelsRetType) { + *arg = &val +} + /* types and functions for localSubnets */ @@ -142,6 +162,8 @@ func setCreateGatewayConnectionPayloadGetTunnel2AttributeType(arg *CreateGateway type CreateGatewayConnectionPayload struct { // This flag decides whether this connection should be enabled or disabled Enabled CreateGatewayConnectionPayloadgetEnabledAttributeType `json:"enabled,omitempty"` + // Map of custom labels. Key and values must be max 63 chars, start/end with alphanumeric. + Labels CreateGatewayConnectionPayloadGetLabelsAttributeType `json:"labels,omitempty"` // List of local subnets (IPv4 CIDR). // REQUIRED LocalSubnets CreateGatewayConnectionPayloadGetLocalSubnetsAttributeType `json:"localSubnets" required:"true"` @@ -204,6 +226,29 @@ func (o *CreateGatewayConnectionPayload) SetEnabled(v CreateGatewayConnectionPay setCreateGatewayConnectionPayloadgetEnabledAttributeType(&o.Enabled, v) } +// GetLabels returns the Labels field value if set, zero value otherwise. +func (o *CreateGatewayConnectionPayload) GetLabels() (res CreateGatewayConnectionPayloadGetLabelsRetType) { + res, _ = o.GetLabelsOk() + return +} + +// GetLabelsOk returns a tuple with the Labels field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *CreateGatewayConnectionPayload) GetLabelsOk() (ret CreateGatewayConnectionPayloadGetLabelsRetType, ok bool) { + return getCreateGatewayConnectionPayloadGetLabelsAttributeTypeOk(o.Labels) +} + +// HasLabels returns a boolean if a field has been set. +func (o *CreateGatewayConnectionPayload) HasLabels() bool { + _, ok := o.GetLabelsOk() + return ok +} + +// SetLabels gets a reference to the given map[string]string and assigns it to the Labels field. +func (o *CreateGatewayConnectionPayload) SetLabels(v CreateGatewayConnectionPayloadGetLabelsRetType) { + setCreateGatewayConnectionPayloadGetLabelsAttributeType(&o.Labels, v) +} + // GetLocalSubnets returns the LocalSubnets field value func (o *CreateGatewayConnectionPayload) GetLocalSubnets() (ret CreateGatewayConnectionPayloadGetLocalSubnetsRetType) { ret, _ = o.GetLocalSubnetsOk() @@ -294,6 +339,9 @@ func (o CreateGatewayConnectionPayload) ToMap() (map[string]interface{}, error) if val, ok := getCreateGatewayConnectionPayloadgetEnabledAttributeTypeOk(o.Enabled); ok { toSerialize["Enabled"] = val } + if val, ok := getCreateGatewayConnectionPayloadGetLabelsAttributeTypeOk(o.Labels); ok { + toSerialize["Labels"] = val + } if val, ok := getCreateGatewayConnectionPayloadGetLocalSubnetsAttributeTypeOk(o.LocalSubnets); ok { toSerialize["LocalSubnets"] = val } diff --git a/pkg/vpnalpha/model_update_gateway_connection_payload.go b/pkg/vpnalpha/model_update_gateway_connection_payload.go index f4407ddb..8263b56f 100644 --- a/pkg/vpnalpha/model_update_gateway_connection_payload.go +++ b/pkg/vpnalpha/model_update_gateway_connection_payload.go @@ -37,6 +37,26 @@ func setUpdateGatewayConnectionPayloadgetEnabledAttributeType(arg *UpdateGateway *arg = &val } +/* + types and functions for labels +*/ + +// isContainer +type UpdateGatewayConnectionPayloadGetLabelsAttributeType = *map[string]string +type UpdateGatewayConnectionPayloadGetLabelsArgType = map[string]string +type UpdateGatewayConnectionPayloadGetLabelsRetType = map[string]string + +func getUpdateGatewayConnectionPayloadGetLabelsAttributeTypeOk(arg UpdateGatewayConnectionPayloadGetLabelsAttributeType) (ret UpdateGatewayConnectionPayloadGetLabelsRetType, ok bool) { + if arg == nil { + return ret, false + } + return *arg, true +} + +func setUpdateGatewayConnectionPayloadGetLabelsAttributeType(arg *UpdateGatewayConnectionPayloadGetLabelsAttributeType, val UpdateGatewayConnectionPayloadGetLabelsRetType) { + *arg = &val +} + /* types and functions for localSubnets */ @@ -142,6 +162,8 @@ func setUpdateGatewayConnectionPayloadGetTunnel2AttributeType(arg *UpdateGateway type UpdateGatewayConnectionPayload struct { // This flag decides whether this connection should be enabled or disabled Enabled UpdateGatewayConnectionPayloadgetEnabledAttributeType `json:"enabled,omitempty"` + // Map of custom labels. Key and values must be max 63 chars, start/end with alphanumeric. + Labels UpdateGatewayConnectionPayloadGetLabelsAttributeType `json:"labels,omitempty"` // List of local subnets (IPv4 CIDR). // REQUIRED LocalSubnets UpdateGatewayConnectionPayloadGetLocalSubnetsAttributeType `json:"localSubnets" required:"true"` @@ -204,6 +226,29 @@ func (o *UpdateGatewayConnectionPayload) SetEnabled(v UpdateGatewayConnectionPay setUpdateGatewayConnectionPayloadgetEnabledAttributeType(&o.Enabled, v) } +// GetLabels returns the Labels field value if set, zero value otherwise. +func (o *UpdateGatewayConnectionPayload) GetLabels() (res UpdateGatewayConnectionPayloadGetLabelsRetType) { + res, _ = o.GetLabelsOk() + return +} + +// GetLabelsOk returns a tuple with the Labels field value if set, nil otherwise +// and a boolean to check if the value has been set. +func (o *UpdateGatewayConnectionPayload) GetLabelsOk() (ret UpdateGatewayConnectionPayloadGetLabelsRetType, ok bool) { + return getUpdateGatewayConnectionPayloadGetLabelsAttributeTypeOk(o.Labels) +} + +// HasLabels returns a boolean if a field has been set. +func (o *UpdateGatewayConnectionPayload) HasLabels() bool { + _, ok := o.GetLabelsOk() + return ok +} + +// SetLabels gets a reference to the given map[string]string and assigns it to the Labels field. +func (o *UpdateGatewayConnectionPayload) SetLabels(v UpdateGatewayConnectionPayloadGetLabelsRetType) { + setUpdateGatewayConnectionPayloadGetLabelsAttributeType(&o.Labels, v) +} + // GetLocalSubnets returns the LocalSubnets field value func (o *UpdateGatewayConnectionPayload) GetLocalSubnets() (ret UpdateGatewayConnectionPayloadGetLocalSubnetsRetType) { ret, _ = o.GetLocalSubnetsOk() @@ -294,6 +339,9 @@ func (o UpdateGatewayConnectionPayload) ToMap() (map[string]interface{}, error) if val, ok := getUpdateGatewayConnectionPayloadgetEnabledAttributeTypeOk(o.Enabled); ok { toSerialize["Enabled"] = val } + if val, ok := getUpdateGatewayConnectionPayloadGetLabelsAttributeTypeOk(o.Labels); ok { + toSerialize["Labels"] = val + } if val, ok := getUpdateGatewayConnectionPayloadGetLocalSubnetsAttributeTypeOk(o.LocalSubnets); ok { toSerialize["LocalSubnets"] = val } diff --git a/stackit/internal/wait/postgresflexalpha/wait.go b/stackit/internal/wait/postgresflexalpha/wait.go index b7ec7bbf..e0fe3b44 100644 --- a/stackit/internal/wait/postgresflexalpha/wait.go +++ b/stackit/internal/wait/postgresflexalpha/wait.go @@ -67,6 +67,9 @@ func CreateInstanceWaitHandler( if s == nil || s.Id == nil || *s.Id != instanceId || s.Status == nil { return false, nil, nil } + tflog.Debug(ctx, "waiting for instance ready", map[string]interface{}{ + "status": *s.Status, + }) switch *s.Status { default: return true, s, fmt.Errorf("instance with id %s has unexpected status %s", instanceId, *s.Status) @@ -92,17 +95,19 @@ func CreateInstanceWaitHandler( if extendedTimeout < 3 { maxWait = maxWait + time.Minute*5 extendedTimeout = extendedTimeout + 1 - if s.Network == nil || s.Network.InstanceAddress == nil { - tflog.Warn(ctx, "Waiting for instance_address") - return false, nil, nil - } - if s.Network.RouterAddress == nil { - tflog.Warn(ctx, "Waiting for router_address") - return false, nil, nil - } - if s.Status == nil { - tflog.Warn(ctx, "Waiting for status") - return false, nil, nil + if *s.Network.AccessScope == "SNA" { + ready := true + if s.Network == nil || s.Network.InstanceAddress == nil { + tflog.Warn(ctx, "Waiting for instance_address") + ready = false + } + if s.Network.RouterAddress == nil { + tflog.Warn(ctx, "Waiting for router_address") + ready = false + } + if !ready { + return false, nil, nil + } } if s.IsDeletable == nil { tflog.Warn(ctx, "Waiting for is_deletable") @@ -113,13 +118,15 @@ func CreateInstanceWaitHandler( instanceCreated = true instanceGetResponse = s case InstanceStateSuccess: - if s.Network == nil || s.Network.InstanceAddress == nil { - tflog.Warn(ctx, "Waiting for instance_address") - return false, nil, nil - } - if s.Network.RouterAddress == nil { - tflog.Info(ctx, "Waiting for router_address") - return false, nil, nil + if *s.Network.AccessScope == "SNA" { + if s.Network == nil || s.Network.InstanceAddress == nil { + tflog.Warn(ctx, "Waiting for instance_address") + return false, nil, nil + } + if s.Network.RouterAddress == nil { + tflog.Info(ctx, "Waiting for router_address") + return false, nil, nil + } } instanceCreated = true instanceGetResponse = s diff --git a/tools/main.go b/tools/main.go index 04c239fb..9d65da5d 100644 --- a/tools/main.go +++ b/tools/main.go @@ -135,7 +135,7 @@ func Build() error { if err = cmd.Wait(); err != nil { var exitErr *exec.ExitError if errors.As(err, &exitErr) { - slog.Error("cmd.Wait", "code", exitErr.ExitCode()) + slog.Error("cmd.Wait", "code", exitErr.ExitCode(), "error", err, "stdout", stdOut.String(), "stderr", stdErr.String()) return fmt.Errorf("%s", stdErr.String()) } if err != nil { @@ -486,7 +486,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { if err = cmd2.Wait(); err != nil { var exitErr *exec.ExitError if errors.As(err, &exitErr) { - slog.Error("cmd.Wait", "code", exitErr.ExitCode()) + slog.Error("cmd.Wait", "code", exitErr.ExitCode(), "error", err) return fmt.Errorf("%s", stdErr.String()) } if err != nil { @@ -528,7 +528,7 @@ func generateServiceFiles(rootDir, generatorDir string) error { if err = cmd3.Wait(); err != nil { var exitErr *exec.ExitError if errors.As(err, &exitErr) { - slog.Error("cmd.Wait", "code", exitErr.ExitCode()) + slog.Error("cmd.Wait", "code", exitErr.ExitCode(), "error", err) return fmt.Errorf("%s", stdErr.String()) } if err != nil {