Skip to content

Commit 23f2da4

Browse files
committed
Migrate inline_values to path_to_inline_values for package install
Signed-off-by: Ishan Gupta <gishan@vmware.com>
1 parent 3681696 commit 23f2da4

File tree

11 files changed

+139
-64
lines changed

11 files changed

+139
-64
lines changed

docs/resources/package_install.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ resource "tanzu-mission-control_package_install" "create_package_install" {
4545
}
4646
}
4747
48-
inline_values = { "test" : "test" }
48+
path_to_inline_values = "<inline-values-file-path>"
49+
50+
inline_values = { "test" : "test" } # Deprecated
4951
}
5052
}
5153
```

examples/resources/packageinstall/resource.tf

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ resource "tanzu-mission-control_package_install" "create_package_install" {
2121
}
2222
}
2323

24-
inline_values = { "test" : "test" }
24+
path_to_inline_values = "<inline-values-file-path>"
25+
26+
inline_values = { "test" : "test" } # Deprecated
2527
}
2628
}

internal/helper/yaml.go

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
Copyright © 2024 VMware, Inc. All Rights Reserved.
3+
SPDX-License-Identifier: MPL-2.0
4+
*/
5+
6+
package helper
7+
8+
import (
9+
"bytes"
10+
"fmt"
11+
"io"
12+
"log"
13+
"os"
14+
15+
"github.com/pkg/errors"
16+
"gopkg.in/yaml.v2"
17+
)
18+
19+
// ReadYamlFile reads a yaml file from a given path.
20+
func ReadYamlFile(filePath string) (string, error) {
21+
inputFile, err := os.Open(filePath)
22+
if err != nil {
23+
return "", errors.WithMessage(err, fmt.Sprintf("Error opening the %s file.", filePath))
24+
}
25+
26+
defer func(inputFile *os.File) {
27+
err := inputFile.Close()
28+
if err != nil {
29+
log.Println("[ERROR] could not close file object.")
30+
}
31+
}(inputFile)
32+
33+
buf := bytes.NewBuffer(nil)
34+
_, err = io.Copy(buf, inputFile)
35+
36+
if err != nil {
37+
return "", err
38+
}
39+
40+
_, err = yaml.Marshal(buf.String())
41+
if err != nil {
42+
return "", err
43+
}
44+
45+
return buf.String(), nil
46+
}
47+
48+
// FileExists checks if a file exists in a given path.
49+
func FileExists(filePath string) bool {
50+
fileInfo, err := os.Stat(filePath)
51+
52+
if os.IsNotExist(err) {
53+
log.Println("[ERROR] file does not exists.")
54+
return false
55+
}
56+
57+
return !fileInfo.IsDir()
58+
}

internal/resources/helmrelease/resource_helm_release.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ func resourceHelmReleaseInPlaceUpdate(ctx context.Context, d *schema.ResourceDat
258258

259259
specCheck, err := updateCheckForSpec(d, helmReleaseDataFromServer.atomicSpec, scopedFullnameData.Scope)
260260
if err != nil {
261-
log.Println("[ERROR] Unable to check spec has been updtated.")
261+
log.Println("[ERROR] Unable to check spec has been updated.")
262262
diag.FromErr(err)
263263
}
264264

internal/resources/helmrelease/spec/cluster_scope.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ func ConstructSpecForClusterScope(d *schema.ResourceData) (spec *releaseclusterm
3131

3232
if inlineConfigValueFile, ok := specData[InlineConfigKey]; ok {
3333
if (inlineConfigValueFile.(string)) != "" {
34-
if !(fileExists(inlineConfigValueFile.(string))) {
34+
if !(helper.FileExists(inlineConfigValueFile.(string))) {
3535
return spec, errors.Errorf("File %s does not exists.", inlineConfigValueFile.(string))
3636
}
3737

38-
spec.InlineConfiguration, err = readYamlFile(inlineConfigValueFile.(string))
38+
spec.InlineConfiguration, err = helper.ReadYamlFile(inlineConfigValueFile.(string))
3939
if err != nil {
4040
return spec, err
4141
}

internal/resources/helmrelease/spec/spec.go

+1-43
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,9 @@ SPDX-License-Identifier: MPL-2.0
66
package spec
77

88
import (
9-
"bytes"
10-
"fmt"
11-
"io"
12-
"log"
13-
"os"
149
"time"
1510

1611
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
17-
"github.com/pkg/errors"
18-
"gopkg.in/yaml.v2"
19-
2012
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
2113
releaseclustermodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/helmrelease/cluster"
2214
)
@@ -48,7 +40,7 @@ var SpecSchema = &schema.Schema{
4840
Description: "File to read inline values from (in yaml format).User need to specify the file path for inline config",
4941
Optional: true,
5042
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
51-
newInlineConfig, err := readYamlFile(new)
43+
newInlineConfig, err := helper.ReadYamlFile(new)
5244
if err != nil {
5345
return false
5446
}
@@ -258,37 +250,3 @@ func HasSpecChanged(d *schema.ResourceData) bool {
258250

259251
return updateRequired
260252
}
261-
262-
func readYamlFile(fileName string) (string, error) {
263-
inputFile, err := os.Open(fileName)
264-
if err != nil {
265-
return "", errors.WithMessage(err, fmt.Sprintf("Error opening the %s file.", fileName))
266-
}
267-
268-
defer inputFile.Close()
269-
270-
buf := bytes.NewBuffer(nil)
271-
_, err = io.Copy(buf, inputFile)
272-
273-
if err != nil {
274-
return "", err
275-
}
276-
277-
_, err = yaml.Marshal(buf.String())
278-
if err != nil {
279-
return "", err
280-
}
281-
282-
return buf.String(), nil
283-
}
284-
285-
func fileExists(filepath string) bool {
286-
fileinfo, err := os.Stat(filepath)
287-
288-
if os.IsNotExist(err) {
289-
log.Println("[ERROR] file does not exists.")
290-
return false
291-
}
292-
293-
return !fileinfo.IsDir()
294-
}

internal/resources/tanzupackageinstall/package_install_resource.go

+26-11
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,16 @@ func resourcePackageInstallCreate(ctx context.Context, d *schema.ResourceData, m
105105
return diag.Errorf("Unable to create Tanzu Mission Control package install entry; Scope full name is empty")
106106
}
107107

108+
specVal, err := spec.ConstructSpecForClusterScope(d)
109+
if err != nil {
110+
return diag.FromErr(err)
111+
}
112+
108113
packageInstallReq := &pkginstallclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallInstallRequest{
109114
Install: &pkginstallclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallInstall{
110115
FullName: scopedFullnameData.FullnameCluster,
111116
Meta: common.ConstructMeta(d),
112-
Spec: spec.ConstructSpecForClusterScope(d),
117+
Spec: specVal,
113118
},
114119
}
115120

@@ -187,8 +192,14 @@ func resourcePackageInstallInPlaceUpdate(ctx context.Context, d *schema.Resource
187192
updateAvailable = true
188193
}
189194

190-
if updateCheckForSpec(d, installSpec) {
191-
err := CheckForUpdatedPackage(config, scopedFullnameData, installSpec)
195+
specCheck, err := updateCheckForSpec(d, installSpec)
196+
if err != nil {
197+
log.Println("[ERROR] Unable to check spec has been updated.")
198+
diag.FromErr(err)
199+
}
200+
201+
if specCheck {
202+
err = CheckForUpdatedPackage(config, scopedFullnameData, installSpec)
192203
if err != nil {
193204
return diag.FromErr(err)
194205
}
@@ -197,6 +208,7 @@ func resourcePackageInstallInPlaceUpdate(ctx context.Context, d *schema.Resource
197208
}
198209

199210
if !updateAvailable {
211+
log.Printf("[INFO] package install update is not required")
200212
return
201213
}
202214

@@ -283,21 +295,24 @@ func updateCheckForMeta(d *schema.ResourceData, meta *objectmetamodel.VmwareTanz
283295
return true
284296
}
285297

286-
func updateCheckForSpec(d *schema.ResourceData, installSpec *pkginstallclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallSpec) bool {
298+
func updateCheckForSpec(d *schema.ResourceData, installSpec *pkginstallclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallSpec) (bool, error) {
287299
if !spec.HasSpecChanged(d) {
288-
return false
300+
return false, nil
289301
}
290302

291-
updatedInstallSpec := spec.ConstructSpecForClusterScope(d)
303+
specVal, err := spec.ConstructSpecForClusterScope(d)
304+
if err != nil {
305+
return false, err
306+
}
292307

293-
installSpec.PackageRef.PackageMetadataName = updatedInstallSpec.PackageRef.PackageMetadataName
294-
installSpec.PackageRef.VersionSelection.Constraints = updatedInstallSpec.PackageRef.VersionSelection.Constraints
295-
installSpec.RoleBindingScope = updatedInstallSpec.RoleBindingScope
296-
installSpec.InlineValues = updatedInstallSpec.InlineValues
308+
installSpec.PackageRef.PackageMetadataName = specVal.PackageRef.PackageMetadataName
309+
installSpec.PackageRef.VersionSelection.Constraints = specVal.PackageRef.VersionSelection.Constraints
310+
installSpec.RoleBindingScope = specVal.RoleBindingScope
311+
installSpec.InlineValues = specVal.InlineValues
297312

298313
log.Printf("[INFO] updating package install spec")
299314

300-
return true
315+
return true, nil
301316
}
302317

303318
func GetGlobalNamespace(config authctx.TanzuContext, searchscope *tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageSearchScope) (string, error) {

internal/resources/tanzupackageinstall/spec/cluster_spec.go internal/resources/tanzupackageinstall/spec/cluster_scope.go

+24-5
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,23 @@ import (
1010

1111
valid "github.com/asaskevich/govalidator"
1212
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/pkg/errors"
1314

15+
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
1416
packageinstallmodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/tanzupackageinstall"
15-
common "github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
17+
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
1618
)
1719

18-
func ConstructSpecForClusterScope(d *schema.ResourceData) (spec *packageinstallmodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallSpec) {
20+
func ConstructSpecForClusterScope(d *schema.ResourceData) (spec *packageinstallmodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallSpec, err error) {
1921
value, ok := d.GetOk(SpecKey)
2022
if !ok {
21-
return spec
23+
return spec, nil
2224
}
2325

2426
data, _ := value.([]interface{})
2527

2628
if len(data) == 0 || data[0] == nil {
27-
return spec
29+
return spec, nil
2830
}
2931

3032
specData := data[0].(map[string]interface{})
@@ -65,6 +67,7 @@ func ConstructSpecForClusterScope(d *schema.ResourceData) (spec *packageinstallm
6567

6668
spec.RoleBindingScope = packageinstallmodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallRoleBindingScopeCLUSTER.Pointer()
6769

70+
// To be deprecated in a future release.
6871
if v, ok := specData[InlineValuesKey]; ok {
6972
if v1, ok := v.(map[string]interface{}); ok {
7073
for key, value := range v1 {
@@ -95,7 +98,20 @@ func ConstructSpecForClusterScope(d *schema.ResourceData) (spec *packageinstallm
9598
}
9699
}
97100

98-
return spec
101+
if inlineValuesFile, ok := specData[PathToInlineValuesKey]; ok {
102+
if (inlineValuesFile.(string)) != "" {
103+
if !(helper.FileExists(inlineValuesFile.(string))) {
104+
return spec, errors.Errorf("File %s does not exists.", inlineValuesFile.(string))
105+
}
106+
107+
spec.InlineValues, err = helper.ReadYamlFile(inlineValuesFile.(string))
108+
if err != nil {
109+
return spec, err
110+
}
111+
}
112+
}
113+
114+
return spec, nil
99115
}
100116

101117
func FlattenSpecForClusterScope(spec *packageinstallmodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageInstallSpec) (data []interface{}) {
@@ -119,13 +135,16 @@ func FlattenSpecForClusterScope(spec *packageinstallmodel.VmwareTanzuManageV1alp
119135
pkgRefSpec[PackageMetadataNameKey] = pkgMetadataName
120136
pkgRefSpec[VersionSelectionKey] = versionSelectionSpec
121137

138+
// To be deprecated in a future release.
122139
if v1, ok := spec.InlineValues.(map[string]interface{}); ok {
123140
inline := common.GetTypeStringMapData(v1)
124141
flattenSpecData[InlineValuesKey] = inline
125142
} else {
126143
flattenSpecData[InlineValuesKey] = spec.InlineValues
127144
}
128145

146+
flattenSpecData[PathToInlineValuesKey] = spec.InlineValues
147+
129148
flattenSpecData[RoleBindingScopeKey] = string(*spec.RoleBindingScope)
130149

131150
flattenSpecData[PackageRefKey] = []interface{}{pkgRefSpec}

internal/resources/tanzupackageinstall/spec/constant.go

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const (
99
PackageRefKey = "package_ref"
1010
RoleBindingScopeKey = "role_binding_scope"
1111
InlineValuesKey = "inline_values"
12+
PathToInlineValuesKey = "path_to_inline_values"
1213
PackageMetadataNameKey = "package_metadata_name"
1314
VersionSelectionKey = "version_selection"
1415
ConstraintsKey = "constraints"

internal/resources/tanzupackageinstall/spec/spec.go

+16
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,25 @@ var (
2626
Description: "Role binding scope for service account which will be used by Package Install.",
2727
Computed: true,
2828
},
29+
PathToInlineValuesKey: {
30+
Type: schema.TypeString,
31+
Description: "File to read inline values from (in yaml format). User needs to specify the file path for inline values.",
32+
Optional: true,
33+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
34+
newInlineValues, err := helper.ReadYamlFile(new)
35+
if err != nil {
36+
return false
37+
}
38+
39+
return old == newInlineValues
40+
},
41+
},
2942
InlineValuesKey: {
3043
Type: schema.TypeMap,
3144
Description: "Inline values to configure the Package Install.",
3245
Optional: true,
3346
Sensitive: true,
47+
Deprecated: "This field is deprecated. For providing the inline values, use the new field: path_to_inline_values",
3448
},
3549
},
3650
},
@@ -81,6 +95,8 @@ func HasSpecChanged(d *schema.ResourceData) bool {
8195
fallthrough
8296
case d.HasChange(helper.GetFirstElementOf(SpecKey, RoleBindingScopeKey)):
8397
fallthrough
98+
case d.HasChange(helper.GetFirstElementOf(SpecKey, PathToInlineValuesKey)):
99+
fallthrough
84100
case d.HasChange(helper.GetFirstElementOf(SpecKey, InlineValuesKey)):
85101
updateRequired = true
86102
}

internal/resources/tanzupackageinstall/spec/spec_flatten_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ func TestFlattenSpecForClusterScope(t *testing.T) {
5959
"namespace": "cert-manager",
6060
"some": "91",
6161
},
62+
PathToInlineValuesKey: map[string]interface{}{
63+
"namespace": "cert-manager",
64+
"some": 91,
65+
},
6266
},
6367
},
6468
},

0 commit comments

Comments
 (0)