diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2785022..f63f9bc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,23 @@ updates: directory: '/' schedule: interval: 'weekly' + day: 'friday' + time: '06:00' + timezone: 'Australia/Perth' + groups: + minor-patch: + update-types: + - 'minor' + - 'patch' - package-ecosystem: 'gomod' directory: '/' schedule: interval: 'weekly' + day: 'friday' + time: '06:00' + timezone: 'Australia/Perth' + groups: + minor-patch: + update-types: + - 'minor' + - 'patch' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c1334c3..f60ae65 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ name: Release on: push: tags: - - "v*" + - 'v*' # Releases need permissions to read and write the repository contents. # GitHub considers creating releases and uploading assets as writing contents. @@ -14,6 +14,10 @@ permissions: contents: write jobs: + test: + uses: ./.github/workflows/test.yaml + secrets: inherit + goreleaser: runs-on: ubuntu-latest steps: @@ -23,7 +27,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 with: - go-version-file: "go.mod" + go-version-file: 'go.mod' cache: true - name: Import GPG key uses: crazy-max/ghaction-import-gpg@01dd5d3ca463c7f10f7f4f7b4f177225ac661ee4 # v6.1.0 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index ed1f0e9..70ba654 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -15,6 +15,8 @@ jobs: name: Acceptance Tests runs-on: ubuntu-latest environment: test + concurrency: + group: test steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v4 @@ -24,7 +26,16 @@ jobs: with: terraform_version: '1.5.*' terraform_wrapper: false - - run: go test -v -cover ./... + - name: Check if generated files are up to date + run: | + go generate + git diff --color --exit-code + if [ $? -ne 0 ]; then + echo "generated files are not up to date, please run 'go generate' and commit the changes" >&2 + exit 1 + fi + - name: Run tests + run: go test -v -cover ./internal/provider/... env: TF_ACC: '1' BINARYLANE_API_TOKEN: ${{ secrets.BINARYLANE_API_TOKEN }} diff --git a/examples/k3s/main.tf b/examples/k3s/main.tf index 70c0f8a..71d1ef4 100644 --- a/examples/k3s/main.tf +++ b/examples/k3s/main.tf @@ -134,15 +134,14 @@ resource "binarylane_server_firewall_rules" "example" { server_id = each.value.id firewall_rules = [ - # TODO: Due to a bug, this only works if you uncomment AFTER creating servers - # { - # description = "K3s supervisor and Kubernetes API Server" - # protocol = "tcp" - # source_addresses = ["0.0.0.0/0"] - # destination_addresses = local.server_ips - # destination_ports = ["6443"] - # action = "accept" - # }, + { + description = "K3s supervisor and Kubernetes API Server" + protocol = "tcp" + source_addresses = ["0.0.0.0/0"] + destination_addresses = local.server_ips + destination_ports = ["6443"] + action = "accept" + }, { description = "Flannel VXLAN" protocol = "udp" diff --git a/generate.go b/generate.go index 4ff8fbd..aa4d6e9 100644 --- a/generate.go +++ b/generate.go @@ -8,4 +8,4 @@ package main //go:generate mkdir -p internal/resources internal/data_sources //go:generate go run github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework generate resources --input=./provider_code_spec.json --output=./internal/resources --package=resources //go:generate go run github.com/hashicorp/terraform-plugin-codegen-framework/cmd/tfplugingen-framework generate data-sources --input=./provider_code_spec.json --output=./internal/data_sources --package=data_sources -//go:generate tfplugindocs generate +//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs generate diff --git a/go.mod b/go.mod index 3d19c47..403d7df 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,15 @@ module terraform-provider-binarylane -go 1.22.3 +go 1.22.7 require ( github.com/deepmap/oapi-codegen v1.16.3 - github.com/hashicorp/terraform-plugin-codegen-framework v0.4.0 + github.com/hashicorp/terraform-plugin-codegen-framework v0.4.1 github.com/hashicorp/terraform-plugin-codegen-openapi v0.3.0 github.com/hashicorp/terraform-plugin-docs v0.19.4 - github.com/hashicorp/terraform-plugin-framework v1.11.0 + github.com/hashicorp/terraform-plugin-framework v1.12.0 github.com/hashicorp/terraform-plugin-framework-validators v0.13.0 - github.com/hashicorp/terraform-plugin-go v0.23.0 + github.com/hashicorp/terraform-plugin-go v0.24.0 github.com/hashicorp/terraform-plugin-log v0.9.0 github.com/hashicorp/terraform-plugin-testing v1.10.0 github.com/oapi-codegen/oapi-codegen/v2 v2.3.0 @@ -58,11 +58,11 @@ require ( github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/terraform-exec v0.21.0 // indirect github.com/hashicorp/terraform-json v0.22.1 // indirect - github.com/hashicorp/terraform-plugin-codegen-spec v0.1.1 // indirect + github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0 // indirect github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 // indirect github.com/hashicorp/terraform-registry-address v0.2.3 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/invopop/yaml v0.2.0 // indirect @@ -106,8 +106,8 @@ require ( golang.org/x/text v0.18.0 // indirect golang.org/x/tools v0.22.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/grpc v1.66.2 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61 // indirect + google.golang.org/grpc v1.67.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 5621dbd..90641c7 100644 --- a/go.sum +++ b/go.sum @@ -139,20 +139,20 @@ github.com/hashicorp/terraform-exec v0.21.0 h1:uNkLAe95ey5Uux6KJdua6+cv8asgILFVW github.com/hashicorp/terraform-exec v0.21.0/go.mod h1:1PPeMYou+KDUSSeRE9szMZ/oHf4fYUmB923Wzbq1ICg= github.com/hashicorp/terraform-json v0.22.1 h1:xft84GZR0QzjPVWs4lRUwvTcPnegqlyS7orfb5Ltvec= github.com/hashicorp/terraform-json v0.22.1/go.mod h1:JbWSQCLFSXFFhg42T7l9iJwdGXBYV8fmmD6o/ML4p3A= -github.com/hashicorp/terraform-plugin-codegen-framework v0.4.0 h1:xB96Rakulnn7ZxikDj8glCyojKpTbW+SGm6QxipoNxU= -github.com/hashicorp/terraform-plugin-codegen-framework v0.4.0/go.mod h1:nXlVjqHFBDr6EXnKTT9RCLmwnuTYj/3LE4ffkIdOtog= +github.com/hashicorp/terraform-plugin-codegen-framework v0.4.1 h1:eaI/3dsu2T5QAXbA+7N+B+UBj20GdtYnsRuYypKh3S4= +github.com/hashicorp/terraform-plugin-codegen-framework v0.4.1/go.mod h1:kpYM23L7NtcfaQdWAN0QFkV/lU0w16qJ2ddAPCI4zAg= github.com/hashicorp/terraform-plugin-codegen-openapi v0.3.0 h1:IKpc337XKk50QyQPSxLrHwdqSo1E2XqCMxFkWsZcTvc= github.com/hashicorp/terraform-plugin-codegen-openapi v0.3.0/go.mod h1:tT6wl80h7nsMBw+1yZRgJXi+Ys85PUai11weDqysvp4= -github.com/hashicorp/terraform-plugin-codegen-spec v0.1.1 h1:7djpLeqtz0x6w01W4hckWwINJUnfXn2zGr/EhSC8rek= -github.com/hashicorp/terraform-plugin-codegen-spec v0.1.1/go.mod h1:PQn6bDD8UWoAVJoHXqFk2i/RmLbeQBjbiP38i+E+YIw= +github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0 h1:91dQG1A/DxP6vRz9GiytDTrZTXDbhHPvmpYnAyWA/Vw= +github.com/hashicorp/terraform-plugin-codegen-spec v0.2.0/go.mod h1:fywrEKpordQypmAjz/HIfm2LuNVmyJ6KDe8XT9GdJxQ= github.com/hashicorp/terraform-plugin-docs v0.19.4 h1:G3Bgo7J22OMtegIgn8Cd/CaSeyEljqjH3G39w28JK4c= github.com/hashicorp/terraform-plugin-docs v0.19.4/go.mod h1:4pLASsatTmRynVzsjEhbXZ6s7xBlUw/2Kt0zfrq8HxA= -github.com/hashicorp/terraform-plugin-framework v1.11.0 h1:M7+9zBArexHFXDx/pKTxjE6n/2UCXY6b8FIq9ZYhwfE= -github.com/hashicorp/terraform-plugin-framework v1.11.0/go.mod h1:qBXLDn69kM97NNVi/MQ9qgd1uWWsVftGSnygYG1tImM= +github.com/hashicorp/terraform-plugin-framework v1.12.0 h1:7HKaueHPaikX5/7cbC1r9d1m12iYHY+FlNZEGxQ42CQ= +github.com/hashicorp/terraform-plugin-framework v1.12.0/go.mod h1:N/IOQ2uYjW60Jp39Cp3mw7I/OpC/GfZ0385R0YibmkE= github.com/hashicorp/terraform-plugin-framework-validators v0.13.0 h1:bxZfGo9DIUoLLtHMElsu+zwqI4IsMZQBRRy4iLzZJ8E= github.com/hashicorp/terraform-plugin-framework-validators v0.13.0/go.mod h1:wGeI02gEhj9nPANU62F2jCaHjXulejm/X+af4PdZaNo= -github.com/hashicorp/terraform-plugin-go v0.23.0 h1:AALVuU1gD1kPb48aPQUjug9Ir/125t+AAurhqphJ2Co= -github.com/hashicorp/terraform-plugin-go v0.23.0/go.mod h1:1E3Cr9h2vMlahWMbsSEcNrOCxovCZhOOIXjFHbjc/lQ= +github.com/hashicorp/terraform-plugin-go v0.24.0 h1:2WpHhginCdVhFIrWHxDEg6RBn3YaWzR2o6qUeIEat2U= +github.com/hashicorp/terraform-plugin-go v0.24.0/go.mod h1:tUQ53lAsOyYSckFGEefGC5C8BAaO0ENqzFd3bQeuYQg= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= github.com/hashicorp/terraform-plugin-sdk/v2 v2.34.0 h1:kJiWGx2kiQVo97Y5IOGR4EMcZ8DtMswHhUuFibsCQQE= @@ -163,8 +163,8 @@ github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTV github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= @@ -393,10 +393,10 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= -google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61 h1:N9BgCIAUvn/M+p4NJccWPWb3BWh88+zyL0ll9HgbEeM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240924160255-9d4c2d233b61/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= +google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/internal/resources/server_firewall_rules_resource_gen.go b/internal/resources/server_firewall_rules_resource_gen.go index 13fb355..0724d9c 100644 --- a/internal/resources/server_firewall_rules_resource_gen.go +++ b/internal/resources/server_firewall_rules_resource_gen.go @@ -621,11 +621,19 @@ func (v FirewallRulesValue) String() string { func (v FirewallRulesValue) ToObjectValue(ctx context.Context) (basetypes.ObjectValue, diag.Diagnostics) { var diags diag.Diagnostics - destinationAddressesVal, d := types.ListValue(types.StringType, v.DestinationAddresses.Elements()) - - diags.Append(d...) + var destinationAddressesVal basetypes.ListValue + switch { + case v.DestinationAddresses.IsUnknown(): + destinationAddressesVal = types.ListUnknown(types.StringType) + case v.DestinationAddresses.IsNull(): + destinationAddressesVal = types.ListNull(types.StringType) + default: + var d diag.Diagnostics + destinationAddressesVal, d = types.ListValue(types.StringType, v.DestinationAddresses.Elements()) + diags.Append(d...) + } - if d.HasError() { + if diags.HasError() { return types.ObjectUnknown(map[string]attr.Type{ "action": basetypes.StringType{}, "description": basetypes.StringType{}, @@ -642,11 +650,19 @@ func (v FirewallRulesValue) ToObjectValue(ctx context.Context) (basetypes.Object }), diags } - destinationPortsVal, d := types.ListValue(types.StringType, v.DestinationPorts.Elements()) - - diags.Append(d...) + var destinationPortsVal basetypes.ListValue + switch { + case v.DestinationPorts.IsUnknown(): + destinationPortsVal = types.ListUnknown(types.StringType) + case v.DestinationPorts.IsNull(): + destinationPortsVal = types.ListNull(types.StringType) + default: + var d diag.Diagnostics + destinationPortsVal, d = types.ListValue(types.StringType, v.DestinationPorts.Elements()) + diags.Append(d...) + } - if d.HasError() { + if diags.HasError() { return types.ObjectUnknown(map[string]attr.Type{ "action": basetypes.StringType{}, "description": basetypes.StringType{}, @@ -663,11 +679,19 @@ func (v FirewallRulesValue) ToObjectValue(ctx context.Context) (basetypes.Object }), diags } - sourceAddressesVal, d := types.ListValue(types.StringType, v.SourceAddresses.Elements()) - - diags.Append(d...) + var sourceAddressesVal basetypes.ListValue + switch { + case v.SourceAddresses.IsUnknown(): + sourceAddressesVal = types.ListUnknown(types.StringType) + case v.SourceAddresses.IsNull(): + sourceAddressesVal = types.ListNull(types.StringType) + default: + var d diag.Diagnostics + sourceAddressesVal, d = types.ListValue(types.StringType, v.SourceAddresses.Elements()) + diags.Append(d...) + } - if d.HasError() { + if diags.HasError() { return types.ObjectUnknown(map[string]attr.Type{ "action": basetypes.StringType{}, "description": basetypes.StringType{},