diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b03c75..8c77299 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: - name: Setup Go uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.24.10" + go-version: "1.25.6" - name: Import GPG Key id: import_gpg uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 348566f..fc887d7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -36,9 +36,9 @@ jobs: - run: go build -v . - name: Run linters - uses: golangci/golangci-lint-action@2226d7cb06a077cd73e56eedd38eecad18e5d837 # v6.5.0 + uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8.0.0 with: - version: latest + version: v2.8.0 generate: runs-on: ubuntu-latest @@ -112,7 +112,7 @@ jobs: - uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0 with: - go-version: "1.24.10" + go-version-file: "go.mod" id: go - uses: hashicorp/setup-terraform@b9cd54a3c349d3f38e8881555d616ced269862dd # v3.1.2 diff --git a/.golangci.yml b/.golangci.yml index 7efde44..9685167 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,3 +1,5 @@ +version: "2" + # Visit https://golangci-lint.run/ for usage documentation and information on # other useful linters issues: @@ -5,14 +7,12 @@ issues: max-same-issues: 0 linters: - disable-all: true + default: none enable: - durationcheck - errcheck - forcetypeassert - godot - - gofmt - - gosimple - govet - ineffassign - makezero @@ -25,9 +25,12 @@ linters: - unparam - unused - usetesting + settings: + paralleltest: + # Terraform acceptance subtests all share a Coder instance, and cannot run + # in parallel. + ignore-missing-subtests: true -linters-settings: - paralleltest: - # Terraform acceptance subtests all share a Coder instance, and cannot run - # in parallel. - ignore-missing-subtests: true +formatters: + enable: + - gofmt diff --git a/docs/data-sources/organization.md b/docs/data-sources/organization.md index f8cf537..7209b45 100644 --- a/docs/data-sources/organization.md +++ b/docs/data-sources/organization.md @@ -54,3 +54,4 @@ resource "coderd_group" "example" { - `created_at` (Number) Unix timestamp when the organization was created. - `members` (Set of String) Members of the organization, by ID - `updated_at` (Number) Unix timestamp when the organization was last updated. +- `workspace_sharing` (String) Workspace sharing setting for the organization. Valid values are `everyone` and `none`. diff --git a/docs/resources/organization.md b/docs/resources/organization.md index 2848cbe..11c8aa4 100644 --- a/docs/resources/organization.md +++ b/docs/resources/organization.md @@ -62,6 +62,7 @@ resource "coderd_organization" "blueberry" { - `icon` (String) - `org_sync_idp_groups` (Set of String) Claims from the IdP provider that will give users access to this organization. - `role_sync` (Block, Optional) Role sync settings to sync organization roles from an IdP. (see [below for nested schema](#nestedblock--role_sync)) +- `workspace_sharing` (String) Workspace sharing setting for the organization. Valid values are `everyone` and `none`. ### Read-Only diff --git a/go.mod b/go.mod index c22eb63..8588486 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module github.com/coder/terraform-provider-coderd -go 1.24.10 +go 1.25.6 require ( - cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145 - github.com/coder/coder/v2 v2.29.2 + cdr.dev/slog/v3 v3.0.0-rc1 + github.com/coder/coder/v2 v2.30.0 github.com/docker/docker v28.5.2+incompatible github.com/docker/go-connections v0.6.0 github.com/google/uuid v1.6.0 @@ -53,14 +53,17 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.2.0 // indirect github.com/bmatcuk/doublestar/v4 v4.9.1 // indirect + github.com/brianvoe/gofakeit/v7 v7.14.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 // indirect - github.com/coder/serpent v0.12.0 // indirect + github.com/coder/serpent v0.13.0 // indirect github.com/coder/terraform-provider-coder/v2 v2.13.1 // indirect - github.com/coder/websocket v1.8.13 // indirect + github.com/coder/websocket v1.8.14 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/coreos/go-oidc/v3 v3.17.0 // indirect @@ -111,7 +114,7 @@ require ( github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect github.com/microcosm-cc/bluemonday v1.0.27 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect @@ -119,7 +122,6 @@ require ( github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect - github.com/moby/moby v28.5.0+incompatible // indirect github.com/moby/sys/atomicwriter v0.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -156,7 +158,7 @@ require ( github.com/tinylib/msgp v1.2.5 // indirect github.com/tklauser/go-sysconf v0.3.15 // indirect github.com/tklauser/numcpus v0.10.0 // indirect - github.com/valyala/fasthttp v1.68.0 // indirect + github.com/valyala/fasthttp v1.69.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect @@ -174,38 +176,38 @@ require ( go.opentelemetry.io/collector/pdata/pprofile v0.121.0 // indirect go.opentelemetry.io/collector/semconv v0.123.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect - go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel v1.39.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/otel/sdk v1.38.0 // indirect - go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/sdk v1.39.0 // indirect + go.opentelemetry.io/otel/trace v1.39.0 // indirect go.opentelemetry.io/proto/otlp v1.7.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect - golang.org/x/crypto v0.45.0 // indirect + golang.org/x/crypto v0.47.0 // indirect golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/net v0.47.0 // indirect - golang.org/x/oauth2 v0.33.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/sys v0.38.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect + golang.org/x/mod v0.32.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/tools v0.41.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 // indirect - google.golang.org/grpc v1.77.0 // indirect - google.golang.org/protobuf v1.36.10 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260120174246-409b4a993575 // indirect + google.golang.org/grpc v1.78.0 // indirect + google.golang.org/protobuf v1.36.11 // indirect gopkg.in/DataDog/dd-trace-go.v1 v1.74.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - storj.io/drpc v0.0.33 // indirect + storj.io/drpc v0.0.34 // indirect tailscale.com v1.80.3 // indirect ) diff --git a/go.sum b/go.sum index 2d0e32d..926e3be 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,13 @@ -cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145 h1:Mk4axSLxKw3hjkf3PffBLQYta7nPVIWObuKCPDWgQLc= -cdr.dev/slog v1.6.2-0.20250703074222-9df5e0a6c145/go.mod h1:NaoTA7KwopCrnaSb0JXTC0PTp/O/Y83Lndnq0OEV3ZQ= -cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= +cdr.dev/slog/v3 v3.0.0-rc1 h1:EN7Zim6GvTpAeHQjI0ERDEfqKbTyXRvgH4UhlzLpvWM= +cdr.dev/slog/v3 v3.0.0-rc1/go.mod h1:iO/OALX1VxlI03mkodCGdVP7pXzd2bRMvu3ePvlJ9ak= +cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c= cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= -cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= -cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= -cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/logging v1.13.1 h1:O7LvmO0kGLaHY/gq8cV7T0dyp6zJhYAOtZPX4TF3QtY= +cloud.google.com/go/logging v1.13.1/go.mod h1:XAQkfkMBxQRjQek96WLPNze7vsOmay9H5PqfsNYDqvw= +cloud.google.com/go/longrunning v0.7.0 h1:FV0+SYF1RIj59gyoWDRi45GiYUMM3K1qO51qoboQT1E= +cloud.google.com/go/longrunning v0.7.0/go.mod h1:ySn2yXmjbK9Ba0zsQqunhDkYi0+9rlXIwnoAf+h+TPY= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -89,8 +89,8 @@ github.com/bmatcuk/doublestar/v4 v4.9.1 h1:X8jg9rRZmJd4yRy7ZeNDRnM+T3ZfHv15JiBJ/ github.com/bmatcuk/doublestar/v4 v4.9.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bool64/shared v0.1.5 h1:fp3eUhBsrSjNCQPcSdQqZxxh9bBwrYiZ+zOKFkM0/2E= github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6MHJlPs= -github.com/brianvoe/gofakeit/v7 v7.9.0 h1:6NsaMy9D5ZKVwIZ1V8L//J2FrOF3546FcXDElWLx994= -github.com/brianvoe/gofakeit/v7 v7.9.0/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= +github.com/brianvoe/gofakeit/v7 v7.14.0 h1:R8tmT/rTDJmD2ngpqBL9rAKydiL7Qr2u3CXPqRt59pk= +github.com/brianvoe/gofakeit/v7 v7.14.0/go.mod h1:QXuPeBw164PJCzCUZVmgpgHJ3Llj49jSLVkKPMtxtxA= github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -112,18 +112,22 @@ github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQ github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= +github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= -github.com/coder/coder/v2 v2.29.2 h1:ZHJKddiMV14r9R9USUuJaDCqnvRKXkBkLtBZaFLJJ5I= -github.com/coder/coder/v2 v2.29.2/go.mod h1:wgxhzQOeUEagmkZ2HErUVDSe+ANdPLV7UIAb6wVtN1s= +github.com/coder/coder/v2 v2.30.0 h1:Fz9kvZJ9Sq1V5oufBHJftu695Oh0gNzBLcobeKEB9OI= +github.com/coder/coder/v2 v2.30.0/go.mod h1:vWpHZehX7lFrezmQqDEYtUl53JNZ19ya2IIk+m2Ub1s= github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs= github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc= -github.com/coder/serpent v0.12.0 h1:fUu3qVjeRvVy3DB/C2EFFvOctm+f2HKyckyfA86O63Q= -github.com/coder/serpent v0.12.0/go.mod h1:mPEpD8Cq106E0glBs5ROAAGoALLtD5HAAMVZmjf4zO0= +github.com/coder/serpent v0.13.0 h1:6EoWjpEypkb8cS6i0eCF4qoAv9vrEVaX26RW+3FMMvo= +github.com/coder/serpent v0.13.0/go.mod h1:7OIvFBYMd+OqarMy5einBl8AtRr8LliopVU7pyrwucY= github.com/coder/terraform-provider-coder/v2 v2.13.1 h1:dtPaJUvueFm+XwBPUMWQCc5Z1QUQBW4B4RNyzX4h4y8= github.com/coder/terraform-provider-coder/v2 v2.13.1/go.mod h1:2irB3W8xRUo73nP5w6lN/dhN3abeCIKpqg8zElKIX/I= -github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE= -github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= +github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g= +github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -292,8 +296,8 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= -github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -313,8 +317,8 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= -github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= @@ -333,8 +337,6 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= -github.com/moby/moby v28.5.0+incompatible h1:eN6ksRE7BojoGW18USJGfyqhx/FWJPLs0jqaTNlfSsM= -github.com/moby/moby v28.5.0+incompatible/go.mod h1:fDXVQ6+S340veQPv35CzDahGBmHsiclFwfEygB/TWMc= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= @@ -407,7 +409,6 @@ github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++ github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= @@ -464,8 +465,8 @@ github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfj github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.68.0 h1:v12Nx16iepr8r9ySOwqI+5RBJ/DqTxhOy1HrHoDFnok= -github.com/valyala/fasthttp v1.68.0/go.mod h1:5EXiRfYQAoiO/khu4oU9VISC/eVY6JqmSpPJoHCKsz4= +github.com/valyala/fasthttp v1.69.0 h1:fNLLESD2SooWeh2cidsuFtOcrEi4uB4m1mPrkJMZyVI= +github.com/valyala/fasthttp v1.69.0/go.mod h1:4wA4PfAraPlAsJ5jMSqCE2ug5tqUPwKXxVj8oNECGcw= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= @@ -542,8 +543,8 @@ go.opentelemetry.io/collector/semconv v0.123.0 h1:hFjhLU1SSmsZ67pXVCVbIaejonkYf5 go.opentelemetry.io/collector/semconv v0.123.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= @@ -554,14 +555,14 @@ go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iL go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= -go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= -go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -581,8 +582,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -590,8 +591,8 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -604,10 +605,10 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= -golang.org/x/oauth2 v0.33.0 h1:4Q+qn+E5z8gPRJfmRy7C2gGG3T4jIprK6aSYgTXGRpo= -golang.org/x/oauth2 v0.33.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -615,8 +616,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -642,8 +643,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -651,8 +652,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -661,8 +662,8 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -672,32 +673,32 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= 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 v0.0.0-20250715232539-7130f93afb79 h1:Nt6z9UHqSlIdIGJdz6KhTIs2VRx/iOsA5iE8bmQNcxs= -google.golang.org/genproto v0.0.0-20250715232539-7130f93afb79/go.mod h1:kTmlBHMPqR5uCZPBvwa2B18mvubkjyY3CRLI0c6fj0s= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4= -google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101 h1:tRPGkdGHuewF4UisLzzHHr1spKw92qLM98nIzxbC0wY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251103181224-f26f9409b101/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= -google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= -google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217 h1:GvESR9BIyHUahIb0NcTum6itIWtdoglGX+rnGxm2934= +google.golang.org/genproto v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:yJ2HH4EHEDTd3JiLmhds6NkJ17ITVYOdV3m3VKOnws0= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120174246-409b4a993575 h1:vzOYHDZEHIsPYYnaSYo60AqHkJronSu0rzTz/s4quL0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260120174246-409b4a993575/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/DataDog/dd-trace-go.v1 v1.74.0 h1:wScziU1ff6Bnyr8MEyxATPSLJdnLxKz3p6RsA8FUaek= gopkg.in/DataDog/dd-trace-go.v1 v1.74.0/go.mod h1:ReNBsNfnsjVC7GsCe80zRcykL/n+nxvsNrg3NbjuleM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -721,7 +722,7 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -storj.io/drpc v0.0.33 h1:yCGZ26r66ZdMP0IcTYsj7WDAUIIjzXk6DJhbhvt9FHI= -storj.io/drpc v0.0.33/go.mod h1:vR804UNzhBa49NOJ6HeLjd2H3MakC1j5Gv8bsOQT6N4= +storj.io/drpc v0.0.34 h1:q9zlQKfJ5A7x8NQNFk8x7eKUF78FMhmAbZLnFK+og7I= +storj.io/drpc v0.0.34/go.mod h1:Y9LZaa8esL1PW2IDMqJE7CFSNq7d5bQ3RI7mGPtmKMg= tailscale.com v1.80.3 h1:uGLWZdl61YbhvhoU6qdnHPF7zuuqGGRaTfbECur035Y= tailscale.com v1.80.3/go.mod h1:HTOFVeo5RY0qBl5Uy+LXHwgp0PLXgVSfgqWI34gSrPA= diff --git a/integration/integration.go b/integration/integration.go index 391d864..b22eeb4 100644 --- a/integration/integration.go +++ b/integration/integration.go @@ -19,23 +19,66 @@ import ( "github.com/stretchr/testify/require" ) -func StartCoder(ctx context.Context, t *testing.T, name string, useLicense bool) *codersdk.Client { - coderImg := os.Getenv("CODER_IMAGE") - if coderImg == "" { - coderImg = "ghcr.io/coder/coder" +// User-configurable options for coder backend. +// Using the pattern from +// https://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis +type coderOptions struct { + useLicense bool + image string + version string + experiments string +} + +func UseLicense(opts *coderOptions) { + opts.useLicense = true +} +func CoderImage(image string) func(opts *coderOptions) { + return func(opts *coderOptions) { + opts.image = image + } +} +func CoderVersion(version string) func(opts *coderOptions) { + return func(opts *coderOptions) { + opts.version = version + } +} +func CoderExperiments(experiments string) func(opts *coderOptions) { + return func(opts *coderOptions) { + opts.experiments = experiments + } +} + +func StartCoder(ctx context.Context, t *testing.T, name string, options ...func(*coderOptions)) *codersdk.Client { + // Start with the defaults. + opts := coderOptions{ + useLicense: false, + image: "ghcr.io/coder/coder", + version: "latest", + experiments: "", } - coderVersion := os.Getenv("CODER_VERSION") - if coderVersion == "" { - coderVersion = "latest" + // Apply user-selected options. + for _, option := range options { + option(&opts) + } + + // Env vars override user-selected options. + if v, ok := os.LookupEnv("CODER_IMAGE"); ok { + opts.image = v + } + if v, ok := os.LookupEnv("CODER_VERSION"); ok { + opts.version = v + } + if v, ok := os.LookupEnv("CODER_EXPERIMENTS"); ok { + opts.experiments = v } coderLicense := os.Getenv("CODER_ENTERPRISE_LICENSE") - if useLicense && coderLicense == "" { + if opts.useLicense && coderLicense == "" { t.Skip("Skipping tests that require a license.") } - t.Logf("using coder image %s:%s", coderImg, coderVersion) + t.Logf("using coder image %s:%s", opts.image, opts.version) cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) require.NoError(t, err, "init docker client") @@ -43,19 +86,29 @@ func StartCoder(ctx context.Context, t *testing.T, name string, useLicense bool) p := randomPort(t) t.Logf("random port is %d", p) // Stand up a temporary Coder instance - puller, err := cli.ImagePull(ctx, coderImg+":"+coderVersion, image.PullOptions{}) + puller, err := cli.ImagePull(ctx, opts.image+":"+opts.version, image.PullOptions{}) require.NoError(t, err, "pull coder image") - defer puller.Close() + defer func() { + if err := puller.Close(); err != nil { + t.Logf("error closing image puller: %v", err) + } + }() _, err = io.Copy(os.Stderr, puller) require.NoError(t, err, "pull coder image") + + env := []string{ + "CODER_HTTP_ADDRESS=0.0.0.0:3000", // Listen on all interfaces inside the container. + "CODER_ACCESS_URL=http://localhost:3000", // Avoid creating try.coder.app URLs. + "CODER_TELEMETRY_ENABLE=false", // Avoid creating noise. + "CODER_DANGEROUS_DISABLE_RATE_LIMITS=true", // Avoid hitting file rate limit in tests. + } + if opts.experiments != "" { + env = append(env, "CODER_EXPERIMENTS="+opts.experiments) + } + ctr, err := cli.ContainerCreate(ctx, &container.Config{ - Image: coderImg + ":" + coderVersion, - Env: []string{ - "CODER_HTTP_ADDRESS=0.0.0.0:3000", // Listen on all interfaces inside the container - "CODER_ACCESS_URL=http://localhost:3000", // Set explicitly to avoid creating try.coder.app URLs. - "CODER_TELEMETRY_ENABLE=false", // Avoid creating noise. - "CODER_DANGEROUS_DISABLE_RATE_LIMITS=true", // Avoid hitting file rate limit in tests. - }, + Image: opts.image + ":" + opts.version, + Env: env, Labels: map[string]string{}, ExposedPorts: map[nat.Port]struct{}{nat.Port("3000/tcp"): {}}, }, &container.HostConfig{ @@ -109,7 +162,7 @@ func StartCoder(ctx context.Context, t *testing.T, name string, useLicense bool) }) require.NoError(t, err, "login to coder instance with password") client.SetSessionToken(resp.SessionToken) - if useLicense { + if opts.useLicense { _, err := client.AddLicense(ctx, codersdk.AddLicenseRequest{ License: coderLicense, }) diff --git a/integration/integration_test.go b/integration/integration_test.go index ad2f212..d91112a 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -187,7 +187,7 @@ func TestIntegration(t *testing.T) { t.Run(tt.name, func(t *testing.T) { t.Parallel() - client := StartCoder(ctx, t, tt.name, true) + client := StartCoder(ctx, t, tt.name, UseLicense) wd, err := os.Getwd() require.NoError(t, err) srcDir := filepath.Join(wd, tt.name) diff --git a/internal/provider/group_data_source_test.go b/internal/provider/group_data_source_test.go index 3cd43f2..2476fb1 100644 --- a/internal/provider/group_data_source_test.go +++ b/internal/provider/group_data_source_test.go @@ -20,7 +20,7 @@ func TestAccGroupDataSource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "group_data_acc", true) + client := integration.StartCoder(ctx, t, "group_data_acc", integration.UseLicense) firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) diff --git a/internal/provider/group_resource_test.go b/internal/provider/group_resource_test.go index 3c1b589..7329cc1 100644 --- a/internal/provider/group_resource_test.go +++ b/internal/provider/group_resource_test.go @@ -20,7 +20,7 @@ func TestAccGroupResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "group_acc", true) + client := integration.StartCoder(ctx, t, "group_acc", integration.UseLicense) firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) @@ -138,7 +138,7 @@ func TestAccGroupResourceAGPL(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "group_acc_agpl", false) + client := integration.StartCoder(ctx, t, "group_acc_agpl") firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) diff --git a/internal/provider/license_resource_test.go b/internal/provider/license_resource_test.go index d9c8ffb..47cb1c4 100644 --- a/internal/provider/license_resource_test.go +++ b/internal/provider/license_resource_test.go @@ -17,7 +17,7 @@ func TestAccLicenseResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "license_acc", false) + client := integration.StartCoder(ctx, t, "license_acc") license := os.Getenv("CODER_ENTERPRISE_LICENSE") if license == "" { diff --git a/internal/provider/logger.go b/internal/provider/logger.go index a17fc65..20e2be3 100644 --- a/internal/provider/logger.go +++ b/internal/provider/logger.go @@ -3,7 +3,7 @@ package provider import ( "context" - "cdr.dev/slog" + "cdr.dev/slog/v3" "github.com/hashicorp/terraform-plugin-log/tflog" ) diff --git a/internal/provider/organization_data_source.go b/internal/provider/organization_data_source.go index 835a2ed..1a8fa58 100644 --- a/internal/provider/organization_data_source.go +++ b/internal/provider/organization_data_source.go @@ -33,8 +33,9 @@ type OrganizationDataSourceModel struct { IsDefault types.Bool `tfsdk:"is_default"` Name types.String `tfsdk:"name"` - CreatedAt types.Int64 `tfsdk:"created_at"` - UpdatedAt types.Int64 `tfsdk:"updated_at"` + CreatedAt types.Int64 `tfsdk:"created_at"` + UpdatedAt types.Int64 `tfsdk:"updated_at"` + WorkspaceSharing types.String `tfsdk:"workspace_sharing"` // TODO: This could reasonably store some User object - though we may need to make additional queries depending on what fields we // want, or to have one consistent user type for all data sources. Members types.Set `tfsdk:"members"` @@ -77,6 +78,11 @@ This data source is only compatible with Coder version [2.13.0](https://github.c MarkdownDescription: "Unix timestamp when the organization was last updated.", Computed: true, }, + "workspace_sharing": schema.StringAttribute{ + MarkdownDescription: "Workspace sharing setting for the organization. " + + "Valid values are `everyone` and `none`.", + Computed: true, + }, "members": schema.SetAttribute{ MarkdownDescription: "Members of the organization, by ID", @@ -175,6 +181,13 @@ func (d *OrganizationDataSource) Read(ctx context.Context, req datasource.ReadRe data.IsDefault = types.BoolValue(org.IsDefault) data.CreatedAt = types.Int64Value(org.CreatedAt.Unix()) data.UpdatedAt = types.Int64Value(org.UpdatedAt.Unix()) + workspaceSharing, err := fetchWorkspaceSharingValue(ctx, client, org.ID.String()) + if err != nil { + resp.Diagnostics.AddError( + "Client Error", fmt.Sprintf("Unable to get organization workspace sharing settings, got error: %s", err)) + return + } + data.WorkspaceSharing = workspaceSharing members, err := client.OrganizationMembers(ctx, org.ID) if err != nil { resp.Diagnostics.AddError("Client Error", fmt.Sprintf("Unable to get organization members, got error: %s", err)) diff --git a/internal/provider/organization_data_source_test.go b/internal/provider/organization_data_source_test.go index 1bedc4f..b73aa37 100644 --- a/internal/provider/organization_data_source_test.go +++ b/internal/provider/organization_data_source_test.go @@ -14,17 +14,54 @@ import ( "github.com/stretchr/testify/require" ) +// Happy path: current version of Coder, necessary experiments +// enabled. All checks should pass, including the experimental ones. func TestAccOrganizationDataSource(t *testing.T) { t.Parallel() if os.Getenv("TF_ACC") == "" { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "org_data_acc", false) + client := integration.StartCoder(ctx, t, "org_data_acc", integration.CoderExperiments("workspace-sharing")) firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) - defaultCheckFn := resource.ComposeAggregateTestCheckFunc( + runOrganizationDataSourceTests(t, client, &firstUser, true) +} + +// Current version of Coder, no experiments enabled. Perform all +// checks except the experimental ones (workspace sharing). +func TestAccOrganizationDataSourceNoExperiments(t *testing.T) { + t.Parallel() + if os.Getenv("TF_ACC") == "" { + t.Skip("Acceptance tests are disabled.") + } + ctx := t.Context() + client := integration.StartCoder(ctx, t, "org_data_acc_noexp") + firstUser, err := client.User(ctx, codersdk.Me) + require.NoError(t, err) + + runOrganizationDataSourceTests(t, client, &firstUser, false) +} + +// Older version of coder (doesn't have the experiments). Perform all +// checks except the experimental ones. +func TestAccOrganizationDataSourceBackwardCompatibility(t *testing.T) { + t.Parallel() + if os.Getenv("TF_ACC") == "" { + t.Skip("Acceptance tests are disabled.") + } + ctx := t.Context() + client := integration.StartCoder(ctx, t, "org_data_acc_back", integration.CoderVersion("v2.29.5")) + firstUser, err := client.User(ctx, codersdk.Me) + require.NoError(t, err) + + runOrganizationDataSourceTests(t, client, &firstUser, false) +} + +func runOrganizationDataSourceTests(t *testing.T, client *codersdk.Client, firstUser *codersdk.User, enableExperimentalChecks bool) { + t.Helper() + checks := []resource.TestCheckFunc{ resource.TestCheckResourceAttr("data.coderd_organization.test", "id", firstUser.OrganizationIDs[0].String()), resource.TestCheckResourceAttr("data.coderd_organization.test", "is_default", "true"), resource.TestCheckResourceAttr("data.coderd_organization.test", "name", "coder"), @@ -32,7 +69,11 @@ func TestAccOrganizationDataSource(t *testing.T) { resource.TestCheckTypeSetElemAttr("data.coderd_organization.test", "members.*", firstUser.ID.String()), resource.TestCheckResourceAttrSet("data.coderd_organization.test", "created_at"), resource.TestCheckResourceAttrSet("data.coderd_organization.test", "updated_at"), - ) + } + if enableExperimentalChecks { + checks = append(checks, resource.TestCheckResourceAttrSet("data.coderd_organization.test", "workspace_sharing")) + } + defaultCheckFn := resource.ComposeAggregateTestCheckFunc(checks...) t.Run("DefaultOrgByIDOk", func(t *testing.T) { cfg := testAccOrganizationDataSourceConfig{ diff --git a/internal/provider/organization_group_sync_resource_test.go b/internal/provider/organization_group_sync_resource_test.go index bd0a88c..1e5b1c9 100644 --- a/internal/provider/organization_group_sync_resource_test.go +++ b/internal/provider/organization_group_sync_resource_test.go @@ -24,7 +24,7 @@ func TestAccOrganizationGroupSyncResource(t *testing.T) { } ctx := t.Context() - client := integration.StartCoder(ctx, t, "organization_group_sync_acc", true) + client := integration.StartCoder(ctx, t, "organization_group_sync_acc", integration.UseLicense) _, err := client.User(ctx, codersdk.Me) require.NoError(t, err) diff --git a/internal/provider/organization_resource.go b/internal/provider/organization_resource.go index c1a40ae..405b4c4 100644 --- a/internal/provider/organization_resource.go +++ b/internal/provider/organization_resource.go @@ -2,8 +2,11 @@ package provider import ( "context" + "errors" "fmt" + "net/http" "regexp" + "strings" "github.com/coder/coder/v2/coderd/util/slice" "github.com/coder/coder/v2/codersdk" @@ -36,10 +39,11 @@ type OrganizationResource struct { type OrganizationResourceModel struct { ID UUID `tfsdk:"id"` - Name types.String `tfsdk:"name"` - DisplayName types.String `tfsdk:"display_name"` - Description types.String `tfsdk:"description"` - Icon types.String `tfsdk:"icon"` + Name types.String `tfsdk:"name"` + DisplayName types.String `tfsdk:"display_name"` + Description types.String `tfsdk:"description"` + Icon types.String `tfsdk:"icon"` + WorkspaceSharing types.String `tfsdk:"workspace_sharing"` OrgSyncIdpGroups types.Set `tfsdk:"org_sync_idp_groups"` GroupSync types.Object `tfsdk:"group_sync"` @@ -135,6 +139,15 @@ This resource is only compatible with Coder version [2.16.0](https://github.com/ Computed: true, Default: stringdefault.StaticString(""), }, + "workspace_sharing": schema.StringAttribute{ + MarkdownDescription: "Workspace sharing setting for the organization. " + + "Valid values are `everyone` and `none`.", + Optional: true, + Computed: true, + Validators: []validator.String{ + stringvalidator.OneOf(workspaceSharingNone, workspaceSharingEveryone), + }, + }, "org_sync_idp_groups": schema.SetAttribute{ ElementType: types.StringType, @@ -321,6 +334,15 @@ func (r *OrganizationResource) Read(ctx context.Context, req resource.ReadReques data.RoleSync = roleSyncData.ValueObject() } + // `workspace_sharing` is optional+computed, so we fetch it from the backend + // even if not specified. + workspaceSharing, err := fetchWorkspaceSharingValue(ctx, r.Client, org.ID.String()) + if err != nil { + resp.Diagnostics.AddError( + "Client Error", fmt.Sprintf("unable to get organization workspace sharing settings, got error: %s", err)) + return + } + // We've fetched the organization ID from state, and the latest values for // everything else from the backend. Ensure that any mutable data is synced // with the backend. @@ -328,6 +350,7 @@ func (r *OrganizationResource) Read(ctx context.Context, req resource.ReadReques data.DisplayName = types.StringValue(org.DisplayName) data.Description = types.StringValue(org.Description) data.Icon = types.StringValue(org.Icon) + data.WorkspaceSharing = workspaceSharing // Save updated data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) @@ -409,6 +432,40 @@ func (r *OrganizationResource) Create(ctx context.Context, req resource.CreateRe } } + // Apply workspace sharing settings, if specified and available. + if !data.WorkspaceSharing.IsNull() && !data.WorkspaceSharing.IsUnknown() { + tflog.Trace(ctx, "updating workspace sharing", map[string]any{ + "orgID": orgID, + }) + + _, err := r.Client.PatchWorkspaceSharingSettings(ctx, orgID.String(), codersdk.WorkspaceSharingSettings{ + SharingDisabled: workspaceSharingDisabledFromValue(data.WorkspaceSharing.ValueString()), + }) + if err != nil { + if isNotFound(err) { + // User wants to update an attribute that's not + // supported because their coderd is too old. + resp.Diagnostics.AddError(workspaceSharingNotFoundSummary, workspaceSharingNotFoundDetail) + return + } + // If coderd is current but the workspace-sharing + // experiment is not enabled, the endpoint returns a + // user-friendly message that we show as is. + resp.Diagnostics.AddError("Workspace Sharing Update error", err.Error()) + return + } + } + + // This is computed, we need to write a known value to the state + // in any case. + workspaceSharing, err := fetchWorkspaceSharingValue(ctx, r.Client, orgID.String()) + if err != nil { + resp.Diagnostics.AddError( + "Client Error", fmt.Sprintf("Unable to get organization workspace sharing settings, got error: %s", err)) + return + } + data.WorkspaceSharing = workspaceSharing + // Save data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) } @@ -492,6 +549,36 @@ func (r *OrganizationResource) Update(ctx context.Context, req resource.UpdateRe } } + // Apply workspace sharing settings, if specified and available. + if !data.WorkspaceSharing.IsNull() && !data.WorkspaceSharing.IsUnknown() { + tflog.Trace(ctx, "updating workspace sharing", map[string]any{ + "orgID": orgID, + }) + + _, err := r.Client.PatchWorkspaceSharingSettings(ctx, orgID.String(), codersdk.WorkspaceSharingSettings{ + SharingDisabled: workspaceSharingDisabledFromValue(data.WorkspaceSharing.ValueString()), + }) + if err != nil { + if isNotFound(err) { + resp.Diagnostics.AddError(workspaceSharingNotFoundSummary, workspaceSharingNotFoundDetail) + return + } + + resp.Diagnostics.AddError("Workspace Sharing Update error", err.Error()) + return + } + } + + // This is computed, we need to write a known value to the state + // in any case. + workspaceSharing, err := fetchWorkspaceSharingValue(ctx, r.Client, orgID.String()) + if err != nil { + resp.Diagnostics.AddError( + "Client Error", fmt.Sprintf("Unable to get organization workspace sharing settings, got error: %s", err)) + return + } + data.WorkspaceSharing = workspaceSharing + // Save updated data into Terraform state resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) } @@ -653,3 +740,53 @@ func (r *OrganizationResource) patchOrgSyncMapping( return diags } + +const ( + workspaceSharingNone = "none" + workspaceSharingEveryone = "everyone" +) + +const ( + workspaceSharingNotFoundSummary = "Workspace Sharing Unsupported" + workspaceSharingNotFoundDetail = "Workspace sharing is not available on this Coder deployment. Remove the workspace_sharing attribute or upgrade the deployment." +) + +func workspaceSharingValueFromSettings(settings codersdk.WorkspaceSharingSettings) string { + if settings.SharingDisabled { + return workspaceSharingNone + } + return workspaceSharingEveryone +} + +func workspaceSharingDisabledFromValue(value string) bool { + return value == workspaceSharingNone +} + +// The endpoint may not be available on older coderd versions (we +// support up to 3(?)) or when the workspace-sharing experiment is +// disabled. In both cases, return null to indicate the attribute is +// unset/unsupported. +func fetchWorkspaceSharingValue(ctx context.Context, client *codersdk.Client, orgID string) (types.String, error) { + settings, err := client.WorkspaceSharingSettings(ctx, orgID) + if err != nil { + if isNotFound(err) || isWorkspaceSharingExperimentOff(err) { + return types.StringNull(), nil + } + return types.StringNull(), err + } + return types.StringValue(workspaceSharingValueFromSettings(settings)), nil +} + +func isWorkspaceSharingExperimentOff(err error) bool { + var sdkErr *codersdk.Error + if !errors.As(err, &sdkErr) { + return false + } + // `httpmw.RequireExperiment` returns 403 and a message + if sdkErr.StatusCode() == http.StatusForbidden { + if strings.Contains(sdkErr.Message, string(codersdk.ExperimentWorkspaceSharing)) { + return true + } + } + return false +} diff --git a/internal/provider/organization_resource_test.go b/internal/provider/organization_resource_test.go index 239f29d..c850beb 100644 --- a/internal/provider/organization_resource_test.go +++ b/internal/provider/organization_resource_test.go @@ -17,6 +17,8 @@ import ( "github.com/stretchr/testify/require" ) +// Happy path: current version of Coder, necessary experiments +// enabled. All steps should pass, including the experimental ones. func TestAccOrganizationResource(t *testing.T) { t.Parallel() if os.Getenv("TF_ACC") == "" { @@ -24,9 +26,46 @@ func TestAccOrganizationResource(t *testing.T) { } ctx := t.Context() - client := integration.StartCoder(ctx, t, "organization_acc", true) + client := integration.StartCoder(ctx, t, "organization_acc", integration.UseLicense, integration.CoderExperiments("workspace-sharing")) _, err := client.User(ctx, codersdk.Me) require.NoError(t, err) + runOrganizationResourceTest(t, client, true) +} + +// Current version of Coder, no experiments enabled. Test all steps +// except the experimental ones (workspace sharing). +func TestAccOrganizationResourceNoExperiments(t *testing.T) { + t.Parallel() + if os.Getenv("TF_ACC") == "" { + t.Skip("Acceptance tests are disabled.") + } + + ctx := t.Context() + client := integration.StartCoder(ctx, t, "organization_acc_noexp", integration.UseLicense) + _, err := client.User(ctx, codersdk.Me) + require.NoError(t, err) + + runOrganizationResourceTest(t, client, false) +} + +// Older version of coder (doesn't have the experiments). Test all +// steps except the experimental ones. +func TestAccOrganizationResourceBackwardCompatibility(t *testing.T) { + t.Parallel() + if os.Getenv("TF_ACC") == "" { + t.Skip("Acceptance tests are disabled.") + } + + ctx := t.Context() + client := integration.StartCoder(ctx, t, "organization_acc_back", integration.UseLicense, integration.CoderVersion("v2.29.5")) + _, err := client.User(ctx, codersdk.Me) + require.NoError(t, err) + + runOrganizationResourceTest(t, client, false) +} + +func runOrganizationResourceTest(t *testing.T, client *codersdk.Client, enableExperimentalSteps bool) { + t.Helper() cfg1 := testAccOrganizationResourceConfig{ URL: client.URL.String(), @@ -66,59 +105,86 @@ func TestAccOrganizationResource(t *testing.T) { IsUnitTest: true, PreCheck: func() { testAccPreCheck(t) }, ProtoV6ProviderFactories: testAccProtoV6ProviderFactories, - Steps: []resource.TestStep{ - // Create and Read - { - Config: cfg1.String(t), - ConfigStateChecks: []statecheck.StateCheck{ - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("name"), knownvalue.StringExact("example-org")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("display_name"), knownvalue.StringExact("Example Organization")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("icon"), knownvalue.StringExact("/icon/coder.svg")), + Steps: func() []resource.TestStep { + steps := []resource.TestStep{ + // Create and Read + { + Config: cfg1.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("name"), knownvalue.StringExact("example-org")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("display_name"), knownvalue.StringExact("Example Organization")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("icon"), knownvalue.StringExact("/icon/coder.svg")), + }, }, - }, - // Import - { - Config: cfg1.String(t), - ResourceName: "coderd_organization.test", - ImportState: true, - ImportStateVerify: true, - ImportStateId: *cfg1.Name, - }, - // Update and Read - { - Config: cfg2.String(t), - ConfigStateChecks: []statecheck.StateCheck{ - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("name"), knownvalue.StringExact("example-org-new")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("display_name"), knownvalue.StringExact("Example Organization New")), + // Import + { + Config: cfg1.String(t), + ResourceName: "coderd_organization.test", + ImportState: true, + ImportStateVerify: true, + ImportStateId: *cfg1.Name, }, - }, - // Add org sync - { - Config: cfg3.String(t), - ConfigStateChecks: []statecheck.StateCheck{ - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(0), knownvalue.StringExact("wibble")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(1), knownvalue.StringExact("wobble")), + // Update and Read + { + Config: cfg2.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("name"), knownvalue.StringExact("example-org-new")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("display_name"), knownvalue.StringExact("Example Organization New")), + }, }, - }, - // Patch org sync - { - Config: cfg4.String(t), - ConfigStateChecks: []statecheck.StateCheck{ - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(0), knownvalue.StringExact("wibbley")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(1), knownvalue.StringExact("wobbley")), + // Add org sync + { + Config: cfg3.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(0), knownvalue.StringExact("wibble")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(1), knownvalue.StringExact("wobble")), + }, }, - }, - // Add group and role sync - { - Config: cfg5.String(t), - ConfigStateChecks: []statecheck.StateCheck{ - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("group_sync").AtMapKey("field"), knownvalue.StringExact("wibble")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("group_sync").AtMapKey("mapping").AtMapKey("wibble").AtSliceIndex(0), knownvalue.StringExact("6e57187f-6543-46ab-a62c-a10065dd4314")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("role_sync").AtMapKey("field"), knownvalue.StringExact("wobble")), - statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("role_sync").AtMapKey("mapping").AtMapKey("wobble").AtSliceIndex(0), knownvalue.StringExact("wobbly")), + // Patch org sync + { + Config: cfg4.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(0), knownvalue.StringExact("wibbley")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("org_sync_idp_groups").AtSliceIndex(1), knownvalue.StringExact("wobbley")), + }, }, - }, - }, + // Add group and role sync + { + Config: cfg5.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("group_sync").AtMapKey("field"), knownvalue.StringExact("wibble")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("group_sync").AtMapKey("mapping").AtMapKey("wibble").AtSliceIndex(0), knownvalue.StringExact("6e57187f-6543-46ab-a62c-a10065dd4314")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("role_sync").AtMapKey("field"), knownvalue.StringExact("wobble")), + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("role_sync").AtMapKey("mapping").AtMapKey("wobble").AtSliceIndex(0), knownvalue.StringExact("wobbly")), + }, + }, + } + if enableExperimentalSteps { + cfg6 := cfg5 + cfg6.WorkspaceSharing = ptr.Ref("none") + + cfg7 := cfg6 + cfg7.WorkspaceSharing = ptr.Ref("everyone") + + steps = append(steps, + // Disable workspace sharing for org + resource.TestStep{ + Config: cfg6.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("workspace_sharing"), knownvalue.StringExact("none")), + }, + }, + // Re-enable workspace sharing for org + resource.TestStep{ + Config: cfg7.String(t), + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("coderd_organization.test", tfjsonpath.New("workspace_sharing"), knownvalue.StringExact("everyone")), + }, + }, + ) + } + return steps + }(), }) }) @@ -150,10 +216,11 @@ type testAccOrganizationResourceConfig struct { URL string Token string - Name *string - DisplayName *string - Description *string - Icon *string + Name *string + DisplayName *string + Description *string + Icon *string + WorkspaceSharing *string OrgSyncIdpGroups []string GroupSync *codersdk.GroupSyncSettings @@ -169,10 +236,11 @@ provider coderd { } resource "coderd_organization" "test" { - name = {{orNull .Name}} - display_name = {{orNull .DisplayName}} - description = {{orNull .Description}} - icon = {{orNull .Icon}} + name = {{orNull .Name}} + display_name = {{orNull .DisplayName}} + description = {{orNull .Description}} + icon = {{orNull .Icon}} + workspace_sharing = {{orNull .WorkspaceSharing}} {{- if .OrgSyncIdpGroups}} org_sync_idp_groups = [ diff --git a/internal/provider/organization_sync_settings_resource_test.go b/internal/provider/organization_sync_settings_resource_test.go index ac7bf2a..5868d51 100644 --- a/internal/provider/organization_sync_settings_resource_test.go +++ b/internal/provider/organization_sync_settings_resource_test.go @@ -23,7 +23,7 @@ func TestAccOrganizationSyncSettingsResource(t *testing.T) { } ctx := t.Context() - client := integration.StartCoder(ctx, t, "organization_sync_settings_acc", true) + client := integration.StartCoder(ctx, t, "organization_sync_settings_acc", integration.UseLicense) _, err := client.User(ctx, codersdk.Me) require.NoError(t, err) diff --git a/internal/provider/provider.go b/internal/provider/provider.go index 6e7f796..5777aa3 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -7,7 +7,7 @@ import ( "os" "strings" - "cdr.dev/slog" + "cdr.dev/slog/v3" "github.com/google/uuid" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/function" diff --git a/internal/provider/provisioner_key_resource_test.go b/internal/provider/provisioner_key_resource_test.go index 3ca4757..06dd419 100644 --- a/internal/provider/provisioner_key_resource_test.go +++ b/internal/provider/provisioner_key_resource_test.go @@ -22,7 +22,7 @@ func TestAccProvisionerKeyResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "provisioner_key_acc", true) + client := integration.StartCoder(ctx, t, "provisioner_key_acc", integration.UseLicense) orgs, err := client.Organizations(ctx) require.NoError(t, err) firstOrg := orgs[0].ID diff --git a/internal/provider/template_data_source_test.go b/internal/provider/template_data_source_test.go index 57954aa..6797f61 100644 --- a/internal/provider/template_data_source_test.go +++ b/internal/provider/template_data_source_test.go @@ -24,12 +24,12 @@ func TestAccTemplateDataSource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "template_data_acc", true) + client := integration.StartCoder(ctx, t, "template_data_acc", integration.UseLicense) firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) orgID := firstUser.OrganizationIDs[0] - version, err, _ := newVersion(ctx, client, newVersionRequest{ + version, _, err := newVersion(ctx, client, newVersionRequest{ OrganizationID: orgID, Version: &TemplateVersion{ Name: types.StringValue("main"), diff --git a/internal/provider/template_resource.go b/internal/provider/template_resource.go index 1757842..6a1ac36 100644 --- a/internal/provider/template_resource.go +++ b/internal/provider/template_resource.go @@ -9,7 +9,7 @@ import ( "slices" "strings" - "cdr.dev/slog" + "cdr.dev/slog/v3" "github.com/coder/coder/v2/coderd/util/ptr" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/provisionersdk" @@ -526,7 +526,7 @@ func (r *TemplateResource) Create(ctx context.Context, req resource.CreateReques if idx > 0 { newVersionRequest.TemplateID = &templateResp.ID } - versionResp, err, logs := newVersion(ctx, client, newVersionRequest) + versionResp, logs, err := newVersion(ctx, client, newVersionRequest) if err != nil { resp.Diagnostics.AddError("Provisioner Error", formatLogs(err, logs)) return @@ -777,7 +777,7 @@ func (r *TemplateResource) Update(ctx context.Context, req resource.UpdateReques for idx := range newState.Versions { if newState.Versions[idx].ID.IsUnknown() { tflog.Info(ctx, "discovered a new or modified template version") - uploadResp, err, logs := newVersion(ctx, client, newVersionRequest{ + uploadResp, logs, err := newVersion(ctx, client, newVersionRequest{ Version: &newState.Versions[idx], OrganizationID: orgID, TemplateID: &templateID, @@ -1069,7 +1069,13 @@ func uploadDirectory(ctx context.Context, client *codersdk.Client, logger slog.L err := provisionersdk.Tar(pipeWriter, logger, directory, provisionersdk.TemplateArchiveLimit) _ = pipeWriter.CloseWithError(err) }() - defer pipeReader.Close() + defer func() { + if err := pipeReader.Close(); err != nil { + tflog.Warn(ctx, "error closing template archive reader", map[string]any{ + "error": err, + }) + } + }() content := pipeReader resp, err := client.Upload(ctx, codersdk.ContentTypeTar, bufio.NewReader(content)) if err != nil { @@ -1083,10 +1089,16 @@ func waitForJob(ctx context.Context, client *codersdk.Client, version *codersdk. var jobLogs []codersdk.ProvisionerJobLog for retries := 0; retries < maxRetries; retries++ { logs, closer, err := client.TemplateVersionLogsAfter(ctx, version.ID, 0) - defer closer.Close() if err != nil { return jobLogs, fmt.Errorf("begin streaming logs: %w", err) } + defer func() { + if err := closer.Close(); err != nil { + tflog.Warn(ctx, "error closing template version log stream", map[string]any{ + "error": err, + }) + } + }() for { logs, ok := <-logs if !ok { @@ -1125,23 +1137,23 @@ type newVersionRequest struct { TemplateID *uuid.UUID } -func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequest) (*codersdk.TemplateVersion, error, []codersdk.ProvisionerJobLog) { +func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequest) (*codersdk.TemplateVersion, []codersdk.ProvisionerJobLog, error) { var logs []codersdk.ProvisionerJobLog directory := req.Version.Directory.ValueString() tflog.Info(ctx, "uploading directory") uploadResp, err := uploadDirectory(ctx, client, slog.Make(newTFLogSink(ctx)), directory) if err != nil { - return nil, fmt.Errorf("failed to upload directory: %s", err), logs + return nil, logs, fmt.Errorf("failed to upload directory: %s", err) } tflog.Info(ctx, "successfully uploaded directory") tflog.Info(ctx, "discovering and parsing vars files") varFiles, err := codersdk.DiscoverVarsFiles(directory) if err != nil { - return nil, fmt.Errorf("failed to discover vars files: %s", err), logs + return nil, logs, fmt.Errorf("failed to discover vars files: %s", err) } vars, err := codersdk.ParseUserVariableValues(varFiles, "", []string{}) if err != nil { - return nil, fmt.Errorf("failed to parse user variable values: %s", err), logs + return nil, logs, fmt.Errorf("failed to parse user variable values: %s", err) } tflog.Info(ctx, "discovered and parsed vars files", map[string]any{ "vars": vars, @@ -1171,15 +1183,15 @@ func newVersion(ctx context.Context, client *codersdk.Client, req newVersionRequ tflog.Info(ctx, "creating template version") versionResp, err := client.CreateTemplateVersion(ctx, req.OrganizationID, tmplVerReq) if err != nil { - return nil, fmt.Errorf("failed to create template version: %s", err), logs + return nil, logs, fmt.Errorf("failed to create template version: %s", err) } tflog.Info(ctx, "waiting for template version import job.") logs, err = waitForJob(ctx, client, &versionResp) if err != nil { - return nil, fmt.Errorf("failed to wait for job: %s", err), logs + return nil, logs, fmt.Errorf("failed to wait for job: %s", err) } tflog.Info(ctx, "successfully created template version") - return &versionResp, nil, logs + return &versionResp, logs, nil } func markActive(ctx context.Context, client *codersdk.Client, templateID uuid.UUID, versionID uuid.UUID) error { diff --git a/internal/provider/template_resource_test.go b/internal/provider/template_resource_test.go index b21e1c0..8764e60 100644 --- a/internal/provider/template_resource_test.go +++ b/internal/provider/template_resource_test.go @@ -28,7 +28,7 @@ func TestAccTemplateResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "template_acc", false) + client := integration.StartCoder(ctx, t, "template_acc") firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) @@ -644,7 +644,7 @@ func TestAccTemplateResourceEnterprise(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "template_resource_acc", true) + client := integration.StartCoder(ctx, t, "template_resource_acc", integration.UseLicense) firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) @@ -821,7 +821,7 @@ func TestAccTemplateResourceAGPL(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "template_resource_agpl_acc", false) + client := integration.StartCoder(ctx, t, "template_resource_agpl_acc") firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) @@ -950,7 +950,7 @@ resource "coderd_template" "sample" { }` ctx := t.Context() - client := integration.StartCoder(ctx, t, "template_resource_variables_acc", false) + client := integration.StartCoder(ctx, t, "template_resource_variables_acc") exTemplateOne := t.TempDir() err := cp.Copy("../../integration/template-test/example-template", exTemplateOne) diff --git a/internal/provider/user_data_source_test.go b/internal/provider/user_data_source_test.go index 2890381..9f9888d 100644 --- a/internal/provider/user_data_source_test.go +++ b/internal/provider/user_data_source_test.go @@ -20,7 +20,7 @@ func TestAccUserDataSource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "user_data_acc", false) + client := integration.StartCoder(ctx, t, "user_data_acc") firstUser, err := client.User(ctx, codersdk.Me) require.NoError(t, err) user, err := client.CreateUser(ctx, codersdk.CreateUserRequest{ diff --git a/internal/provider/user_resource_test.go b/internal/provider/user_resource_test.go index 9e47df3..dc18a4b 100644 --- a/internal/provider/user_resource_test.go +++ b/internal/provider/user_resource_test.go @@ -19,7 +19,7 @@ func TestAccUserResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "user_acc", false) + client := integration.StartCoder(ctx, t, "user_acc") cfg1 := testAccUserResourceConfig{ URL: client.URL.String(), diff --git a/internal/provider/workspace_proxy_resource_test.go b/internal/provider/workspace_proxy_resource_test.go index cecad70..aeab117 100644 --- a/internal/provider/workspace_proxy_resource_test.go +++ b/internal/provider/workspace_proxy_resource_test.go @@ -19,7 +19,7 @@ func TestAccWorkspaceProxyResource(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "ws_proxy_acc", true) + client := integration.StartCoder(ctx, t, "ws_proxy_acc", integration.UseLicense) cfg1 := testAccWorkspaceProxyResourceConfig{ URL: client.URL.String(), @@ -61,7 +61,7 @@ func TestAccWorkspaceProxyResourceAGPL(t *testing.T) { t.Skip("Acceptance tests are disabled.") } ctx := t.Context() - client := integration.StartCoder(ctx, t, "ws_proxy_acc_agpl", false) + client := integration.StartCoder(ctx, t, "ws_proxy_acc_agpl") cfg1 := testAccWorkspaceProxyResourceConfig{ URL: client.URL.String(),