Skip to content

Commit 2a2e470

Browse files
jasondamourclaude
andauthored
[Terraform] New Terraform Provider generator (#22949)
* [new] Add Terraform provider generator Add a new experimental code generator that produces HashiCorp Terraform providers from OpenAPI specifications using the Plugin Framework SDK. The generator (terraform-provider) supports: - CRUD operation detection from REST patterns and vendor extensions - Resource, data source, and model generation per API tag - HTTP client with API key, bearer token, and basic auth - Type mapping from OpenAPI/Go types to Terraform schema types - Import state support - Configurable provider name, registry address, and version Includes mustache templates for: provider, resources, data sources, models, client, go.mod, GNUmakefile, README, and example configs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * [new] Add Terraform provider petstore sample and acceptance tests Add sample generation config and generated Terraform provider for the petstore OpenAPI spec, along with Go acceptance tests that exercise the provider lifecycle (create, read, update, delete, import). Generated output includes: - Provider with auth configuration (API key, bearer, basic) - Pet, User, and Store resources and data sources - Client package with HTTP client and model structs - Go acceptance tests using terraform-plugin-testing - Example Terraform configurations for each resource/data source Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: docs * terraform: add more sample tests and ci workflow * ci: get ci passing * ci: fixes * chore: docs --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent fffc21e commit 2a2e470

160 files changed

Lines changed: 7628 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
name: Samples Terraform
2+
3+
on:
4+
push:
5+
paths:
6+
- 'samples/client/petstore/terraform/**'
7+
- 'samples/client/petstore/terraform-addpet/**'
8+
- 'samples/client/petstore/terraform-server/**'
9+
- 'samples/client/others/terraform/**'
10+
pull_request:
11+
paths:
12+
- 'samples/client/petstore/terraform/**'
13+
- 'samples/client/petstore/terraform-addpet/**'
14+
- 'samples/client/petstore/terraform-server/**'
15+
- 'samples/client/others/terraform/**'
16+
17+
jobs:
18+
build:
19+
name: Build Terraform Provider
20+
runs-on: ubuntu-latest
21+
strategy:
22+
fail-fast: false
23+
matrix:
24+
sample:
25+
- samples/client/petstore/terraform/
26+
- samples/client/petstore/terraform-addpet/
27+
- samples/client/petstore/terraform-server/
28+
- samples/client/others/terraform/allof-discriminator/
29+
- samples/client/others/terraform/oneof-anyof-required/
30+
- samples/client/others/terraform/oneof-discriminator-lookup/
31+
steps:
32+
- uses: actions/checkout@v5
33+
- uses: actions/setup-go@v6
34+
with:
35+
go-version: "stable"
36+
- run: go version
37+
- name: Install Dependencies
38+
working-directory: ${{ matrix.sample }}
39+
run: |
40+
go mod tidy
41+
- name: Build provider
42+
working-directory: ${{ matrix.sample }}
43+
run: go build -v ./...
44+
- name: Run tests
45+
working-directory: ${{ matrix.sample }}
46+
run: go test ./... -v -timeout 120m
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/others/terraform/allof-discriminator
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/go/allof_multiple_ref_and_discriminator.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-allof
8+
additionalProperties:
9+
providerName: "allof"
10+
providerAddress: "registry.terraform.io/example/allof"
11+
hideGenerationTimestamp: "true"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/others/terraform/oneof-anyof-required
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/go/spec-with-oneof-anyof-required.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-oneof-anyof
8+
additionalProperties:
9+
providerName: "oneof"
10+
providerAddress: "registry.terraform.io/example/oneof-anyof"
11+
hideGenerationTimestamp: "true"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/others/terraform/oneof-discriminator-lookup
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/go/spec-with-oneof-discriminator.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-oneof-disc
8+
additionalProperties:
9+
providerName: "oneof"
10+
providerAddress: "registry.terraform.io/example/oneof-disc"
11+
hideGenerationTimestamp: "true"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/petstore/terraform-addpet
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-addpet-only.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-petstore-addpet
8+
additionalProperties:
9+
providerName: "petstore"
10+
providerAddress: "registry.terraform.io/example/petstore-addpet"
11+
hideGenerationTimestamp: "true"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/petstore/terraform
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-petstore
8+
additionalProperties:
9+
providerName: "petstore"
10+
providerAddress: "registry.terraform.io/example/petstore"
11+
hideGenerationTimestamp: "true"
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
generatorName: terraform-provider
2+
outputDir: samples/client/petstore/terraform-server
3+
inputSpec: modules/openapi-generator/src/test/resources/3_0/go-server/petstore.yaml
4+
templateDir: modules/openapi-generator/src/main/resources/terraform-provider
5+
gitHost: github.com
6+
gitUserId: example
7+
gitRepoId: terraform-provider-petstore-server
8+
additionalProperties:
9+
providerName: "petstore"
10+
providerAddress: "registry.terraform.io/example/petstore-server"
11+
hideGenerationTimestamp: "true"

docs/generators.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ The following generators are available:
7070
* [swift-combine](generators/swift-combine.md)
7171
* [swift5 (deprecated)](generators/swift5.md)
7272
* [swift6](generators/swift6.md)
73+
* [terraform-provider (experimental)](generators/terraform-provider.md)
7374
* [typescript (experimental)](generators/typescript.md)
7475
* [typescript-angular](generators/typescript-angular.md)
7576
* [typescript-aurelia](generators/typescript-aurelia.md)
Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
---
2+
title: Documentation for the terraform-provider Generator
3+
---
4+
5+
## METADATA
6+
7+
| Property | Value | Notes |
8+
| -------- | ----- | ----- |
9+
| generator name | terraform-provider | pass this to the generate command after -g |
10+
| generator stability | EXPERIMENTAL | |
11+
| generator type | CLIENT | |
12+
| generator language | Go | |
13+
| generator default templating engine | mustache | |
14+
| helpTxt | Generates a Terraform provider (Go, using HashiCorp Plugin Framework). | |
15+
16+
## CONFIG OPTIONS
17+
These options may be applied as additional-properties (cli) or configOptions (plugins). Refer to [configuration docs](https://openapi-generator.tech/docs/configuration) for more details.
18+
19+
| Option | Description | Values | Default |
20+
| ------ | ----------- | ------ | ------- |
21+
|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
22+
|packageName|Go package name (convention: lowercase).| |openapi|
23+
|packageVersion|Go package version.| |1.0.0|
24+
|providerAddress|Terraform provider registry address| |registry.terraform.io/example/example|
25+
|providerName|Terraform provider name (e.g. 'petstore')| |example|
26+
|providerVersion|Terraform provider version| |0.1.0|
27+
28+
## IMPORT MAPPING
29+
30+
| Type/Alias | Imports |
31+
| ---------- | ------- |
32+
33+
34+
## INSTANTIATION TYPES
35+
36+
| Type/Alias | Instantiated By |
37+
| ---------- | --------------- |
38+
39+
40+
## LANGUAGE PRIMITIVES
41+
42+
<ul class="column-ul">
43+
<li>bool</li>
44+
<li>byte</li>
45+
<li>complex128</li>
46+
<li>complex64</li>
47+
<li>float32</li>
48+
<li>float64</li>
49+
<li>int</li>
50+
<li>int32</li>
51+
<li>int64</li>
52+
<li>interface{}</li>
53+
<li>map[string]interface{}</li>
54+
<li>rune</li>
55+
<li>string</li>
56+
<li>uint</li>
57+
<li>uint32</li>
58+
<li>uint64</li>
59+
</ul>
60+
61+
## RESERVED WORDS
62+
63+
<ul class="column-ul">
64+
<li>bool</li>
65+
<li>break</li>
66+
<li>byte</li>
67+
<li>case</li>
68+
<li>chan</li>
69+
<li>complex128</li>
70+
<li>complex64</li>
71+
<li>const</li>
72+
<li>continue</li>
73+
<li>default</li>
74+
<li>defer</li>
75+
<li>else</li>
76+
<li>error</li>
77+
<li>fallthrough</li>
78+
<li>float32</li>
79+
<li>float64</li>
80+
<li>for</li>
81+
<li>func</li>
82+
<li>go</li>
83+
<li>goto</li>
84+
<li>if</li>
85+
<li>import</li>
86+
<li>int</li>
87+
<li>int16</li>
88+
<li>int32</li>
89+
<li>int64</li>
90+
<li>int8</li>
91+
<li>interface</li>
92+
<li>map</li>
93+
<li>nil</li>
94+
<li>package</li>
95+
<li>range</li>
96+
<li>return</li>
97+
<li>rune</li>
98+
<li>select</li>
99+
<li>string</li>
100+
<li>struct</li>
101+
<li>switch</li>
102+
<li>type</li>
103+
<li>uint</li>
104+
<li>uint16</li>
105+
<li>uint32</li>
106+
<li>uint64</li>
107+
<li>uint8</li>
108+
<li>uintptr</li>
109+
<li>var</li>
110+
</ul>
111+
112+
## FEATURE SET
113+
114+
115+
### Client Modification Feature
116+
| Name | Supported | Defined By |
117+
| ---- | --------- | ---------- |
118+
|BasePath|✗|ToolingExtension
119+
|Authorizations|✗|ToolingExtension
120+
|UserAgent|✗|ToolingExtension
121+
|MockServer|✗|ToolingExtension
122+
123+
### Data Type Feature
124+
| Name | Supported | Defined By |
125+
| ---- | --------- | ---------- |
126+
|Custom|✗|OAS2,OAS3
127+
|Int32|✓|OAS2,OAS3
128+
|Int64|✓|OAS2,OAS3
129+
|Float|✓|OAS2,OAS3
130+
|Double|✓|OAS2,OAS3
131+
|Decimal|✓|ToolingExtension
132+
|String|✓|OAS2,OAS3
133+
|Byte|✓|OAS2,OAS3
134+
|Binary|✓|OAS2,OAS3
135+
|Boolean|✓|OAS2,OAS3
136+
|Date|✓|OAS2,OAS3
137+
|DateTime|✓|OAS2,OAS3
138+
|Password|✓|OAS2,OAS3
139+
|File|✓|OAS2
140+
|Uuid||
141+
|Array|✓|OAS2,OAS3
142+
|Null|✗|OAS3
143+
|AnyType|✗|OAS2,OAS3
144+
|Object|✓|OAS2,OAS3
145+
|Maps|✓|ToolingExtension
146+
|CollectionFormat|✓|OAS2
147+
|CollectionFormatMulti|✓|OAS2
148+
|Enum|✓|OAS2,OAS3
149+
|ArrayOfEnum|✓|ToolingExtension
150+
|ArrayOfModel|✓|ToolingExtension
151+
|ArrayOfCollectionOfPrimitives|✓|ToolingExtension
152+
|ArrayOfCollectionOfModel|✓|ToolingExtension
153+
|ArrayOfCollectionOfEnum|✓|ToolingExtension
154+
|MapOfEnum|✓|ToolingExtension
155+
|MapOfModel|✓|ToolingExtension
156+
|MapOfCollectionOfPrimitives|✓|ToolingExtension
157+
|MapOfCollectionOfModel|✓|ToolingExtension
158+
|MapOfCollectionOfEnum|✓|ToolingExtension
159+
160+
### Documentation Feature
161+
| Name | Supported | Defined By |
162+
| ---- | --------- | ---------- |
163+
|Readme|✓|ToolingExtension
164+
|Model|✓|ToolingExtension
165+
|Api|✓|ToolingExtension
166+
167+
### Global Feature
168+
| Name | Supported | Defined By |
169+
| ---- | --------- | ---------- |
170+
|Host|✓|OAS2,OAS3
171+
|BasePath|✓|OAS2,OAS3
172+
|Info|✓|OAS2,OAS3
173+
|Schemes|✗|OAS2,OAS3
174+
|PartialSchemes|✓|OAS2,OAS3
175+
|Consumes|✓|OAS2
176+
|Produces|✓|OAS2
177+
|ExternalDocumentation|✓|OAS2,OAS3
178+
|Examples|✓|OAS2,OAS3
179+
|XMLStructureDefinitions|✗|OAS2,OAS3
180+
|MultiServer|✗|OAS3
181+
|ParameterizedServer|✗|OAS3
182+
|ParameterStyling|✗|OAS3
183+
|Callbacks|✗|OAS3
184+
|LinkObjects|✗|OAS3
185+
186+
### Parameter Feature
187+
| Name | Supported | Defined By |
188+
| ---- | --------- | ---------- |
189+
|Path|✓|OAS2,OAS3
190+
|Query|✓|OAS2,OAS3
191+
|Header|✓|OAS2,OAS3
192+
|Body|✓|OAS2
193+
|FormUnencoded|✓|OAS2
194+
|FormMultipart|✓|OAS2
195+
|Cookie|✓|OAS3
196+
197+
### Schema Support Feature
198+
| Name | Supported | Defined By |
199+
| ---- | --------- | ---------- |
200+
|Simple|✓|OAS2,OAS3
201+
|Composite|✓|OAS2,OAS3
202+
|Polymorphism|✗|OAS2,OAS3
203+
|Union|✗|OAS3
204+
|allOf|✗|OAS2,OAS3
205+
|anyOf|✗|OAS3
206+
|oneOf|✗|OAS3
207+
|not|✗|OAS3
208+
209+
### Security Feature
210+
| Name | Supported | Defined By |
211+
| ---- | --------- | ---------- |
212+
|BasicAuth|✓|OAS2,OAS3
213+
|ApiKey|✓|OAS2,OAS3
214+
|OpenIDConnect|✗|OAS3
215+
|BearerToken|✓|OAS3
216+
|OAuth2_Implicit|✗|OAS2,OAS3
217+
|OAuth2_Password|✗|OAS2,OAS3
218+
|OAuth2_ClientCredentials|✗|OAS2,OAS3
219+
|OAuth2_AuthorizationCode|✗|OAS2,OAS3
220+
|SignatureAuth|✗|OAS3
221+
|AWSV4Signature|✗|ToolingExtension
222+
223+
### Wire Format Feature
224+
| Name | Supported | Defined By |
225+
| ---- | --------- | ---------- |
226+
|JSON|✓|OAS2,OAS3
227+
|XML|✗|OAS2,OAS3
228+
|PROTOBUF|✗|ToolingExtension
229+
|Custom|✗|OAS2,OAS3

0 commit comments

Comments
 (0)