diff --git a/.github/workflows/go-validate.yml b/.github/workflows/go-validate.yml deleted file mode 100644 index 7765a187..00000000 --- a/.github/workflows/go-validate.yml +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - -# -# This GitHub action runs basic linting checks for Packer. -# - -name: "Go Validate" - -on: - push: - branches: - - 'main' - pull_request: - -permissions: - contents: read - -jobs: - get-go-version: - runs-on: ubuntu-latest - outputs: - go-version: ${{ steps.get-go-version.outputs.go-version }} - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - name: 'Determine Go version' - id: get-go-version - run: | - echo "Found Go $(cat .go-version)" - echo "go-version=$(cat .go-version)" >> $GITHUB_OUTPUT - check-mod-tidy: - needs: - - get-go-version - runs-on: ubuntu-latest - name: Go Mod Tidy - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 - with: - go-version: ${{ needs.get-go-version.outputs.go-version }} - - run: go mod tidy - check-lint: - needs: - - get-go-version - runs-on: ubuntu-latest - name: Lint check - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 - with: - go-version: ${{ needs.get-go-version.outputs.go-version }} - - uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3.6.0 - with: - version: v1.53.3 - only-new-issues: true - check-fmt: - needs: - - get-go-version - runs-on: ubuntu-latest - name: Gofmt check - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 - with: - go-version: ${{ needs.get-go-version.outputs.go-version }} - - run: | - go fmt ./... - echo "==> Checking that code complies with go fmt requirements..." - git diff --exit-code; if [ $$? -eq 1 ]; then \ - echo "Found files that are not fmt'ed."; \ - echo "You can use the command: \`go fmt ./...\` to reformat code."; \ - exit 1; \ - fi - check-generate: - needs: - - get-go-version - runs-on: ubuntu-latest - name: Generate check - steps: - - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4.1.0 - with: - go-version: ${{ needs.get-go-version.outputs.go-version }} - - run: | - export PATH=$PATH:$(go env GOPATH)/bin - make generate - git diff --exit-code || ( echo "Found diffs in generated code" \ - && echo "You can use the command: \`make generate\` to reformat code." \ - && false ) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..827610e3 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,51 @@ +name: Lint + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + cache: false + + - uses: golangci/golangci-lint-action@v3 + with: + version: v1.55.1 # renovate: datasource=github-releases depName=golangci/golangci-lint + + check-mod-tidy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + + - run: go mod tidy + - run: | + if ! git diff --exit-code; then + echo "::error::Found changes in code, don't forget to run 'go mod tidy' before you commit." + fi + + check-generate: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + + - run: make generate + - run: | + if ! git diff --exit-code; then + echo "::error::Found changes in generated code, don't forget to run 'make generate' before you commit." + fi diff --git a/.golangci.yml b/.golangci.yml index 78b774dc..2d42fb9c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,125 +1,42 @@ -# Copyright (c) HashiCorp, Inc. -# SPDX-License-Identifier: MPL-2.0 - -issues: - # List of regexps of issue texts to exclude, empty list by default. - # But independently from this option we use default exclude patterns, - # it can be disabled by `exclude-use-default: false`. To list all - # excluded by default patterns execute `golangci-lint run --help` - - exclude-rules: - # Exclude gosimple bool check - - linters: - - gosimple - text: "S(1002|1008|1021)" - # Exclude failing staticchecks for now - - linters: - - staticcheck - text: "SA(1006|1019|4006|4010|4017|5007|6005|9004):" - # Exclude lll issues for long lines with go:generate - - linters: - - lll - source: "^//go:generate " - - # Maximum issues count per one linter. Set to 0 to disable. Default is 50. - max-issues-per-linter: 0 - - # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. - max-same-issues: 0 +--- +linters-settings: + gci: + sections: + - standard + - default + - prefix(github.com/hetznercloud) + exhaustive: + default-signifies-exhaustive: true + misspell: + locale: "US" + revive: + rules: + - name: var-naming + disabled: true linters: disable-all: true enable: + - bodyclose + - dupl - errcheck + - exhaustive + - exportloopref + - gci + - gocritic + - gofmt - goimports + - gomodguard + - gosec - gosimple - govet - ineffassign + - misspell + - revive + - rowserrcheck - staticcheck + - typecheck - unconvert + - unparam - unused - fast: true - -# 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: 10m - - # exit code when at least one issue was found, default is 1 - issues-exit-code: 1 - - # include test files or not, default is true - tests: true - - # list of build tags, all linters use it. Default is empty list. - #build-tags: - # - mytag - - # which dirs to skip: issues from them won't be reported; - # can use regexp here: generated.*, regexp is applied on full path; - # default value is empty list, but default dirs are skipped independently - # from this option's value (see skip-dirs-use-default). - #skip-dirs: - # - src/external_libs - # - autogenerated_by_my_lib - - # default is true. Enables skipping of directories: - # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ - skip-dirs-use-default: true - - # which files to skip: they will be analyzed, but issues from them - # won't be reported. Default value is empty list, but there is - # no need to include all autogenerated files, we confidently recognize - # autogenerated files. If it's not please let us know. - skip-files: - - ".*\\.hcl2spec\\.go$" - # - lib/bad.go - - # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": - # If invoked with -mod=readonly, the go command is disallowed from the implicit - # automatic updating of go.mod described above. Instead, it fails when any changes - # to go.mod are needed. This setting is most useful to check that go.mod does - # not need updates, such as in a continuous integration and testing system. - # If invoked with -mod=vendor, the go command assumes that the vendor - # directory holds the correct copies of dependencies and ignores - # the dependency descriptions in go.mod. - # modules-download-mode: vendor - - -# output configuration options -output: - # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" - format: colored-line-number - - # print lines of code with issue, default is true - print-issued-lines: true - - # print linter name in the end of issue text, default is true - print-linter-name: true - - # make issues output unique by line, default is true - uniq-by-line: true - - -# all available settings of specific linters -linters-settings: - errcheck: - # report about not checking of errors in type assetions: `a := b.(MyStruct)`; - # default is false: such cases aren't reported by default. - check-type-assertions: false - - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; - # default is false: such cases aren't reported by default. - check-blank: false - - # [deprecated] comma-separated list of pairs of the form pkg:regex - # the regex is used to ignore names within pkg. (default "fmt:.*"). - # see https://github.com/kisielk/errcheck#the-deprecated-method for details - ignore: fmt:.*,io/ioutil:^Read.*,io:Close - - # path to a file containing a list of functions to exclude from checking - # see https://github.com/kisielk/errcheck#excluding-functions for details - #exclude: /path/to/file.txt + - whitespace diff --git a/builder/hcloud/builder.go b/builder/hcloud/builder.go index 495d61c1..ff37bf03 100644 --- a/builder/hcloud/builder.go +++ b/builder/hcloud/builder.go @@ -12,8 +12,8 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" "github.com/hashicorp/packer-plugin-sdk/multistep/commonsteps" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" - "github.com/hetznercloud/hcloud-go/v2/hcloud" + "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/hetznercloud/packer-plugin-hcloud/version" ) @@ -41,7 +41,7 @@ func (b *Builder) Run(ctx context.Context, ui packersdk.Ui, hook packersdk.Hook) opts := []hcloud.ClientOption{ hcloud.WithToken(b.config.HCloudToken), hcloud.WithEndpoint(b.config.Endpoint), - hcloud.WithPollInterval(b.config.PollInterval), + hcloud.WithBackoffFunc(hcloud.ConstantBackoff(b.config.PollInterval)), hcloud.WithApplication("hcloud-packer", version.PluginVersion.String()), } b.hcloudClient = hcloud.NewClient(opts...) diff --git a/builder/hcloud/config.go b/builder/hcloud/config.go index 8dc238b9..e195934e 100644 --- a/builder/hcloud/config.go +++ b/builder/hcloud/config.go @@ -18,8 +18,9 @@ import ( "github.com/hashicorp/packer-plugin-sdk/template/config" "github.com/hashicorp/packer-plugin-sdk/template/interpolate" "github.com/hashicorp/packer-plugin-sdk/uuid" - "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/mitchellh/mapstructure" + + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) type Config struct { diff --git a/builder/hcloud/step_create_server.go b/builder/hcloud/step_create_server.go index 509c9689..35602fa6 100644 --- a/builder/hcloud/step_create_server.go +++ b/builder/hcloud/step_create_server.go @@ -6,12 +6,13 @@ package hcloud import ( "context" "fmt" - "io/ioutil" + "os" "sort" "strings" "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) @@ -30,7 +31,7 @@ func (s *stepCreateServer) Run(ctx context.Context, state multistep.StateBag) mu userData := c.UserData if c.UserDataFile != "" { - contents, err := ioutil.ReadFile(c.UserDataFile) + contents, err := os.ReadFile(c.UserDataFile) if err != nil { state.Put("error", fmt.Errorf("Problem reading user data file: %s", err)) return multistep.ActionHalt @@ -85,7 +86,7 @@ func (s *stepCreateServer) Run(ctx context.Context, state multistep.StateBag) mu } if c.UpgradeServerType != "" { - serverCreateOpts.StartAfterCreate = hcloud.Bool(false) + serverCreateOpts.StartAfterCreate = hcloud.Ptr(false) } serverCreateResult, _, err := client.Server.Create(ctx, serverCreateOpts) @@ -199,7 +200,7 @@ func (s *stepCreateServer) Cleanup(state multistep.StateBag) { // Destroy the server we just created ui.Say("Destroying server...") - _, err := client.Server.Delete(context.TODO(), &hcloud.Server{ID: s.serverId}) + _, _, err := client.Server.DeleteWithResult(context.TODO(), &hcloud.Server{ID: s.serverId}) if err != nil { ui.Error(fmt.Sprintf( "Error destroying server. Please destroy it manually: %s", err)) diff --git a/builder/hcloud/step_create_server_test.go b/builder/hcloud/step_create_server_test.go index a124f39e..0df9b837 100644 --- a/builder/hcloud/step_create_server_test.go +++ b/builder/hcloud/step_create_server_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/hetznercloud/hcloud-go/v2/hcloud/schema" ) @@ -142,7 +143,6 @@ func setupStepCreateServer( checker Checker, ) (*multistep.BasicStateBag, func()) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - buf, err := io.ReadAll(r.Body) if err != nil { errors <- fmt.Errorf("fake server: reading request: %s", err) diff --git a/builder/hcloud/step_create_snapshot.go b/builder/hcloud/step_create_snapshot.go index 92f7c311..bbb6bf02 100644 --- a/builder/hcloud/step_create_snapshot.go +++ b/builder/hcloud/step_create_snapshot.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) @@ -28,7 +29,7 @@ func (s *stepCreateSnapshot) Run(ctx context.Context, state multistep.StateBag) result, _, err := client.Server.CreateImage(ctx, &hcloud.Server{ID: serverID}, &hcloud.ServerCreateImageOpts{ Type: hcloud.ImageTypeSnapshot, Labels: c.SnapshotLabels, - Description: hcloud.String(c.SnapshotName), + Description: hcloud.Ptr(c.SnapshotName), }) if err != nil { err := fmt.Errorf("Error creating snapshot: %s", err) diff --git a/builder/hcloud/step_create_snapshot_test.go b/builder/hcloud/step_create_snapshot_test.go index ffc5c71e..6e17cc47 100644 --- a/builder/hcloud/step_create_snapshot_test.go +++ b/builder/hcloud/step_create_snapshot_test.go @@ -14,6 +14,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/hetznercloud/hcloud-go/v2/hcloud/schema" ) @@ -127,7 +128,8 @@ func setupStepCreateSnapshot( Status: "success", } - if r.Method == http.MethodPost && r.URL.Path == "/servers/42/actions/create_image" { + switch { + case r.Method == http.MethodPost && r.URL.Path == "/servers/42/actions/create_image": if failCause == FailCreateImage { w.WriteHeader(http.StatusBadRequest) return @@ -135,7 +137,7 @@ func setupStepCreateSnapshot( w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) response = schema.ServerActionCreateImageResponse{Action: action} - } else if r.Method == http.MethodGet && r.URL.Path == "/actions/13" { + case r.Method == http.MethodGet && r.URL.Path == "/actions/13": if failCause == FailWatchProgress { w.WriteHeader(http.StatusBadRequest) return @@ -143,13 +145,14 @@ func setupStepCreateSnapshot( w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) response = schema.ActionGetResponse{Action: action} - } else if r.Method == http.MethodDelete && r.URL.Path == "/images/33" { + case r.Method == http.MethodDelete && r.URL.Path == "/images/33": if failCause == FailDeleteImage { w.WriteHeader(http.StatusBadRequest) return } w.WriteHeader(http.StatusNoContent) return + default: } if response != nil { diff --git a/builder/hcloud/step_create_sshkey.go b/builder/hcloud/step_create_sshkey.go index 32a0dc13..21b54de5 100644 --- a/builder/hcloud/step_create_sshkey.go +++ b/builder/hcloud/step_create_sshkey.go @@ -11,6 +11,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" "github.com/hashicorp/packer-plugin-sdk/uuid" + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) diff --git a/builder/hcloud/step_pre_validate.go b/builder/hcloud/step_pre_validate.go index 2574d653..3f5acb07 100644 --- a/builder/hcloud/step_pre_validate.go +++ b/builder/hcloud/step_pre_validate.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) diff --git a/builder/hcloud/step_pre_validate_test.go b/builder/hcloud/step_pre_validate_test.go index cb969e89..b0627008 100644 --- a/builder/hcloud/step_pre_validate_test.go +++ b/builder/hcloud/step_pre_validate_test.go @@ -15,6 +15,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" "github.com/hetznercloud/hcloud-go/v2/hcloud/schema" ) diff --git a/builder/hcloud/step_shutdown_server.go b/builder/hcloud/step_shutdown_server.go index 1bfd8796..c174b4ea 100644 --- a/builder/hcloud/step_shutdown_server.go +++ b/builder/hcloud/step_shutdown_server.go @@ -9,6 +9,7 @@ import ( "github.com/hashicorp/packer-plugin-sdk/multistep" packersdk "github.com/hashicorp/packer-plugin-sdk/packer" + "github.com/hetznercloud/hcloud-go/v2/hcloud" ) @@ -43,7 +44,6 @@ func (s *stepShutdownServer) Run(ctx context.Context, state multistep.StateBag) ui.Error(err.Error()) return multistep.ActionHalt } - } } } diff --git a/main.go b/main.go index 73876d63..1cc44184 100644 --- a/main.go +++ b/main.go @@ -7,10 +7,10 @@ import ( "fmt" "os" + "github.com/hashicorp/packer-plugin-sdk/plugin" + "github.com/hetznercloud/packer-plugin-hcloud/builder/hcloud" "github.com/hetznercloud/packer-plugin-hcloud/version" - - "github.com/hashicorp/packer-plugin-sdk/plugin" ) func main() {