Compare commits

...

18 Commits
main ... v1.1.6

Author SHA1 Message Date
Sergen Yalçın e744bf2856
Merge pull request #382 from sergenyalcin/backport-381-to-release-1.1
[Backport release-1.1] Add a new configuration option for required field generation
2024-03-19 18:26:21 +03:00
Sergen Yalçın 36a16b298c
Add doc for RequiredFields function
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 845dbf6b1b)
2024-03-19 15:26:59 +03:00
Sergen Yalçın 335c06bceb
Add requiredFields to ignoreUnexported for fixing unit tests
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit b73a85f49b)
2024-03-19 13:03:39 +03:00
Sergen Yalçın cfaa5f21c7
- Move the config.ExternalName.RequiredFields to config.Resource.requiredFields
- Deprecate config.MarkAsRequired in favor of a new configuration function on *config.Resource that still accepts a slice to mark multiple fields as required without doing and invervention in native field schema.

Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit f25329f346)
2024-03-19 13:03:22 +03:00
Sergen Yalçın 1c8b166eb1
Add a new ``Required` configuration option
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit bdfbe67ab3)
2024-03-19 13:03:06 +03:00
Sergen Yalçın 12b954b958
Merge pull request #378 from crossplane/backport-376-to-release-1.1
[Backport release-1.1] Add the `Header` Go template variable to setup.go.tmpl
2024-03-14 20:44:38 +03:00
Sergen Yalçın 0f4f8ce4d7 Add Header Go template variable to setup.go.tmpl
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 85d8bf7b54)
2024-03-14 16:28:04 +00:00
Sergen Yalçın 8f51d53339
Merge pull request #375 from crossplane/backport-373-to-release-1.1
[Backport release-1.1] Move license statements to separate files (for tmpl files) to prevent license statement duplication
2024-03-14 14:34:31 +03:00
Sergen Yalçın 023d327351 Remove blank line on top
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 2d71c5b36d)
2024-03-14 11:14:38 +00:00
Sergen Yalçın 1b22cf08a9 Move license statements to separate files to prevent license statement duplication
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit a648048b9d)
2024-03-14 11:14:38 +00:00
Sergen Yalçın bd41429c40
Merge pull request #367 from crossplane/backport-355-to-release-1.1
[Backport release-1.1] Fix slice type sensitive fieldpath generation
2024-03-06 23:28:19 +03:00
Sergen Yalçın 34de92ddae Change cases from string to type of FieldType
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit b63f33874c)
2024-03-06 16:45:45 +00:00
Sergen Yalçın ad2246ccc6 Fix non-primitive type sensitive field generation
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 8bf78e8106)
2024-03-06 16:45:45 +00:00
Sergen Yalçın 6b30d2f338
Merge pull request #365 from crossplane/backport-358-to-release-1.1
[Backport release-1.1] Removing the applying of StateFuncs to parameters
2024-03-06 19:17:54 +03:00
Sergen Yalçın c305e4e517 Remove the unnecessary case and add nolint
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 956c7d489b)
2024-03-06 12:23:25 +00:00
Sergen Yalçın 3342cad333 Remove StateFunc calls
Signed-off-by: Sergen Yalçın <yalcinsergen97@gmail.com>
(cherry picked from commit 93af08a988)
2024-03-06 12:23:25 +00:00
Alper Rifat Ulucinar cf9c9ad1ba
Merge pull request #348 from ulucinar/old-sdk
Remove Resource.SchemaFunc references for compatibility with the older Terraform Plugin SDK versions
2024-02-16 14:42:19 +03:00
Alper Rifat Ulucinar 874266deb9
Remove Resource.SchemaFunc references for compatibility with the older Terraform Plugin SDK versions
Signed-off-by: Alper Rifat Ulucinar <ulucinar@users.noreply.github.com>
2024-02-15 18:39:55 +03:00
23 changed files with 69 additions and 57 deletions

View File

@ -124,10 +124,18 @@ func MoveToStatus(sch *schema.Resource, fieldpaths ...string) {
}
}
// MarkAsRequired marks the given fieldpaths as required without manipulating
// the native field schema.
func (r *Resource) MarkAsRequired(fieldpaths ...string) {
r.requiredFields = append(r.requiredFields, fieldpaths...)
}
// MarkAsRequired marks the schema of the given fieldpath as required. It's most
// useful in cases where external name contains an optional parameter that is
// defaulted by the provider but we need it to exist or to fix plain buggy
// schemas.
// Deprecated: Use Resource.MarkAsRequired instead.
// This function will be removed in future versions.
func MarkAsRequired(sch *schema.Resource, fieldpaths ...string) {
for _, fieldpath := range fieldpaths {
if s := GetSchema(sch, fieldpath); s != nil {

View File

@ -128,6 +128,7 @@ func TestDefaultResource(t *testing.T) {
cmpopts.IgnoreFields(ExternalName{}, "SetIdentifierArgumentFn", "GetExternalNameFn", "GetIDFn"),
cmpopts.IgnoreFields(Resource{}, "useTerraformPluginSDKClient"),
cmpopts.IgnoreFields(Resource{}, "useTerraformPluginFrameworkClient"),
cmpopts.IgnoreFields(Resource{}, "requiredFields"),
}
for name, tc := range cases {

View File

@ -328,12 +328,9 @@ func NewProvider(schema []byte, prefix string, modulePath string, metadata []byt
}
terraformResource = p.TerraformProvider.ResourcesMap[name]
if terraformResource.Schema == nil {
if terraformResource.SchemaFunc == nil {
p.skippedResourceNames = append(p.skippedResourceNames, name)
fmt.Printf("Skipping resource %s because it has no schema and no schema function\n", name)
continue
}
terraformResource.Schema = terraformResource.SchemaFunc()
p.skippedResourceNames = append(p.skippedResourceNames, name)
fmt.Printf("Skipping resource %s because it has no schema\n", name)
continue
}
}

View File

@ -489,6 +489,15 @@ type Resource struct {
// the value of the generated Kind, for example:
// "TagParameters": "ClusterTagParameters"
OverrideFieldNames map[string]string
// requiredFields are the fields that will be marked as required in the
// generated CRD schema, although they are not required in the TF schema.
requiredFields []string
}
// RequiredFields returns slice of the marked as required fieldpaths.
func (r *Resource) RequiredFields() []string {
return r.requiredFields
}
// ShouldUseTerraformPluginSDKClient returns whether to generate an SDKv2-based

View File

@ -158,13 +158,13 @@ func getExtendedParameters(ctx context.Context, tr resource.Terraformed, externa
return params, nil
}
func (c *TerraformPluginSDKConnector) processParamsWithStateFunc(schemaMap map[string]*schema.Schema, params map[string]any) map[string]any {
func (c *TerraformPluginSDKConnector) processParamsWithHCLParser(schemaMap map[string]*schema.Schema, params map[string]any) map[string]any {
if params == nil {
return params
}
for key, param := range params {
if sc, ok := schemaMap[key]; ok {
params[key] = c.applyStateFuncToParam(sc, param)
params[key] = c.applyHCLParserToParam(sc, param)
} else {
params[key] = param
}
@ -172,11 +172,11 @@ func (c *TerraformPluginSDKConnector) processParamsWithStateFunc(schemaMap map[s
return params
}
func (c *TerraformPluginSDKConnector) applyStateFuncToParam(sc *schema.Schema, param any) any { //nolint:gocyclo
func (c *TerraformPluginSDKConnector) applyHCLParserToParam(sc *schema.Schema, param any) any { //nolint:gocyclo
if param == nil {
return param
}
switch sc.Type {
switch sc.Type { //nolint:exhaustive
case schema.TypeMap:
if sc.Elem == nil {
return param
@ -185,7 +185,7 @@ func (c *TerraformPluginSDKConnector) applyStateFuncToParam(sc *schema.Schema, p
// TypeMap only supports schema in Elem
if mapSchema, ok := sc.Elem.(*schema.Schema); ok && okParam {
for pk, pv := range pmap {
pmap[pk] = c.applyStateFuncToParam(mapSchema, pv)
pmap[pk] = c.applyHCLParserToParam(mapSchema, pv)
}
return pmap
}
@ -196,13 +196,13 @@ func (c *TerraformPluginSDKConnector) applyStateFuncToParam(sc *schema.Schema, p
pArray, okParam := param.([]any)
if setSchema, ok := sc.Elem.(*schema.Schema); ok && okParam {
for i, p := range pArray {
pArray[i] = c.applyStateFuncToParam(setSchema, p)
pArray[i] = c.applyHCLParserToParam(setSchema, p)
}
return pArray
} else if setResource, ok := sc.Elem.(*schema.Resource); ok {
for i, p := range pArray {
if resParam, okRParam := p.(map[string]any); okRParam {
pArray[i] = c.processParamsWithStateFunc(setResource.Schema, resParam)
pArray[i] = c.processParamsWithHCLParser(setResource.Schema, resParam)
}
}
}
@ -216,16 +216,6 @@ func (c *TerraformPluginSDKConnector) applyStateFuncToParam(sc *schema.Schema, p
param = hclProccessedParam
}
}
if sc.StateFunc != nil {
return sc.StateFunc(param)
}
return param
case schema.TypeBool, schema.TypeInt, schema.TypeFloat:
if sc.StateFunc != nil {
return sc.StateFunc(param)
}
return param
case schema.TypeInvalid:
return param
default:
return param
@ -252,7 +242,7 @@ func (c *TerraformPluginSDKConnector) Connect(ctx context.Context, mg xpresource
if err != nil {
return nil, errors.Wrapf(err, "failed to get the extended parameters for resource %q", mg.GetName())
}
params = c.processParamsWithStateFunc(c.config.TerraformResource.Schema, params)
params = c.processParamsWithHCLParser(c.config.TerraformResource.Schema, params)
schemaBlock := c.config.TerraformResource.CoreConfigSchema()
rawConfig, err := schema.JSONMapToStateValue(params, schemaBlock)

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,6 +1,4 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
package controller

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -1,7 +1,3 @@
// SPDX-FileCopyrightText: 2023 The Crossplane Authors <https://crossplane.io>
//
// SPDX-License-Identifier: Apache-2.0
{{ .Header }}
{{ .GenStatement }}

View File

@ -0,0 +1,3 @@
SPDX-FileCopyrightText: 2024 The Crossplane Authors <https://crossplane.io>
SPDX-License-Identifier: Apache-2.0

View File

@ -380,7 +380,7 @@ func newTopLevelRequiredParam(path string, includeInit bool) *topLevelRequiredPa
}
func (r *resource) addParameterField(f *Field, field *types.Var) {
requiredBySchema := !f.Schema.Optional
requiredBySchema := !f.Schema.Optional || f.Required
// Note(turkenh): We are collecting the top level required parameters that
// are not identifier fields. This is for generating CEL validation rules for
// those parameters and not to require them if the management policy is set

View File

@ -45,6 +45,7 @@ type Field struct {
TransformedName string
SelectorName string
Identifier bool
Required bool
// Injected is set if this Field is an injected field to the Terraform
// schema as an object list map key for server-side apply merges.
Injected bool
@ -120,6 +121,12 @@ func NewField(g *Builder, cfg *config.Resource, r *resource, sch *schema.Schema,
}
}
for _, required := range cfg.RequiredFields() {
if required == snakeFieldName {
f.Required = true
}
}
var commentText string
docString := getDocString(cfg, f, tfPath)
if len(docString) > 0 {
@ -268,7 +275,13 @@ func NewSensitiveField(g *Builder, cfg *config.Resource, r *resource, sch *schem
return nil, true, nil
}
sfx := "SecretRef"
cfg.Sensitive.AddFieldPath(fieldPathWithWildcard(f.TerraformPaths), "spec.forProvider."+fieldPathWithWildcard(f.CRDPaths)+sfx)
switch f.FieldType.(type) {
case *types.Slice:
f.CRDPaths[len(f.CRDPaths)-2] = f.CRDPaths[len(f.CRDPaths)-2] + sfx
cfg.Sensitive.AddFieldPath(fieldPathWithWildcard(f.TerraformPaths), "spec.forProvider."+fieldPathWithWildcard(f.CRDPaths))
default:
cfg.Sensitive.AddFieldPath(fieldPathWithWildcard(f.TerraformPaths), "spec.forProvider."+fieldPathWithWildcard(f.CRDPaths)+sfx)
}
// todo(turkenh): do we need to support other field types as sensitive?
if f.FieldType.String() != "string" && f.FieldType.String() != "*string" && f.FieldType.String() != "[]string" &&
f.FieldType.String() != "[]*string" && f.FieldType.String() != "map[string]string" && f.FieldType.String() != "map[string]*string" {