Skip to content

Commit bef6f69

Browse files
committed
Update migration path and fix acceptance tests
Signed-off-by: Ishan Gupta <gishan@vmware.com>
1 parent b5fe8d2 commit bef6f69

15 files changed

+340
-35
lines changed

internal/helper/yaml.go

+43
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/pkg/errors"
1616
"gopkg.in/yaml.v2"
17+
k8sYaml "sigs.k8s.io/yaml"
1718
)
1819

1920
// ReadYamlFile reads a yaml file from a given path.
@@ -45,6 +46,48 @@ func ReadYamlFile(filePath string) (string, error) {
4546
return buf.String(), nil
4647
}
4748

49+
// ReadYamlFileAsJSON reads a yaml file from a given path.
50+
func ReadYamlFileAsJSON(filePath string) (string, error) {
51+
bufString, err := ReadYamlFile(filePath)
52+
if err != nil {
53+
return "", err
54+
}
55+
56+
jsonBytes, err := k8sYaml.YAMLToJSON([]byte(bufString))
57+
if err != nil {
58+
return "", err
59+
}
60+
61+
return string(jsonBytes), nil
62+
}
63+
64+
// WriteYamlFile writes a yaml file to a given path.
65+
func WriteYamlFile(filePath string, data interface{}) error {
66+
outputFile, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
67+
if err != nil {
68+
return errors.WithMessage(err, fmt.Sprintf("Error opening or creating the %s file.", filePath))
69+
}
70+
71+
defer func(outputFile *os.File) {
72+
err := outputFile.Close()
73+
if err != nil {
74+
log.Println("[ERROR] could not close file object.")
75+
}
76+
}(outputFile)
77+
78+
yamlData, err := yaml.Marshal(data)
79+
if err != nil {
80+
return err
81+
}
82+
83+
_, err = outputFile.Write(yamlData)
84+
if err != nil {
85+
return err
86+
}
87+
88+
return nil
89+
}
90+
4891
// FileExists checks if a file exists in a given path.
4992
func FileExists(filePath string) bool {
5093
fileInfo, err := os.Stat(filePath)

internal/resources/helmrelease/resource_helm_release.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func resourceHelmReleaseInPlaceUpdate(ctx context.Context, d *schema.ResourceDat
259259
specCheck, err := updateCheckForSpec(d, helmReleaseDataFromServer.atomicSpec, scopedFullnameData.Scope)
260260
if err != nil {
261261
log.Println("[ERROR] Unable to check spec has been updated.")
262-
diag.FromErr(err)
262+
return diag.FromErr(err)
263263
}
264264

265265
if specCheck {

internal/resources/package/package_mock_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func (testConfig *testAcceptanceConfig) setupHTTPMocks(t *testing.T) {
104104
FullName: &tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageFullName{
105105
ClusterName: testConfig.ScopeHelperResources.Cluster.Name,
106106
ManagementClusterName: "attached",
107-
ProvisionerName: "attacched",
107+
ProvisionerName: "attached",
108108
OrgID: OrgID,
109109
},
110110
Status: &tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageStatus{
@@ -124,7 +124,7 @@ func (testConfig *testAcceptanceConfig) setupHTTPMocks(t *testing.T) {
124124
FullName: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageFullName{
125125
ClusterName: testConfig.ScopeHelperResources.Cluster.Name,
126126
ManagementClusterName: "attached",
127-
ProvisionerName: "attacched",
127+
ProvisionerName: "attached",
128128
OrgID: OrgID,
129129
Name: testConfig.PkgName,
130130
NamespaceName: globalRepoNamespace,
@@ -145,7 +145,7 @@ func (testConfig *testAcceptanceConfig) setupHTTPMocks(t *testing.T) {
145145
Licenses: []string{
146146
"some1",
147147
},
148-
ReleaseNotes: "someReleaseNotes",
148+
ReleaseNotes: "cert-manager 1.1.0 https://github.com/jetstack/cert-manager/1.1.0",
149149
ReleasedAt: strfmt.DateTime{},
150150
RepositoryName: "testRepo",
151151
ValuesSchema: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageValuesSchema{

internal/resources/package/spec/cluster_scope.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,18 @@ func FlattenSpecForClusterScope(spec *packageclustermodel.VmwareTanzuManageV1alp
3232
flattenSpecData[CapacityRequirementsDescriptionKey] = spec.CapacityRequirementsDescription
3333
releaseNotesValue := strings.Split(spec.ReleaseNotes, seperatorStr)
3434

35-
releaseNotes[metadataNameKey] = releaseNotesValue[0]
36-
releaseNotes[versionKey] = releaseNotesValue[1]
37-
releaseNotes[urlKey] = releaseNotesValue[2]
35+
if len(releaseNotesValue) >= 1 {
36+
releaseNotes[metadataNameKey] = releaseNotesValue[0]
37+
}
38+
39+
if len(releaseNotesValue) >= 2 {
40+
releaseNotes[versionKey] = releaseNotesValue[1]
41+
}
42+
43+
if len(releaseNotesValue) >= 3 {
44+
releaseNotes[urlKey] = releaseNotesValue[2]
45+
}
46+
3847
flattenSpecData[ReleaseNotesKey] = []interface{}{releaseNotes}
3948
flattenSpecData[RepositoryNameKey] = spec.RepositoryName
4049

internal/resources/packages/packages_mock_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (testConfig *testAcceptanceConfig) setupHTTPMocks(t *testing.T) {
147147
Licenses: []string{
148148
"some1",
149149
},
150-
ReleaseNotes: "someReleaseNotes",
150+
ReleaseNotes: "cert-manager 1.1.0 https://github.com/jetstack/cert-manager/1.1.0",
151151
ReleasedAt: strfmt.DateTime{},
152152
RepositoryName: "testRepo",
153153
ValuesSchema: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageValuesSchema{

internal/resources/tanzupackageinstall/package_install_datasource.go

+42-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ package tanzupackageinstall
77

88
import (
99
"context"
10+
"fmt"
1011
"strings"
1112

1213
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1314
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1415
"github.com/pkg/errors"
15-
1616
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/authctx"
1717
clienterrors "github.com/vmware/terraform-provider-tanzu-mission-control/internal/client/errors"
1818
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/common"
19+
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/policy"
1920
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/tanzupackageinstall/scope"
2021
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/tanzupackageinstall/spec"
2122
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/resources/tanzupackageinstall/status"
@@ -80,7 +81,46 @@ func dataPackageInstallRead(ctx context.Context, d *schema.ResourceData, m inter
8081
return diag.FromErr(err)
8182
}
8283

83-
if err := d.Set(spec.SpecKey, spec.FlattenSpecForClusterScope(repoSpec)); err != nil {
84+
// default path
85+
pathToInlineValues := scopedFullnameData.FullnameCluster.ManagementClusterName + "/" +
86+
scopedFullnameData.FullnameCluster.ProvisionerName + "/" +
87+
scopedFullnameData.FullnameCluster.ClusterName + "/" +
88+
scopedFullnameData.FullnameCluster.NamespaceName + "/" +
89+
scopedFullnameData.FullnameCluster.Name + ".yaml"
90+
91+
existingSpec, ok := d.GetOk(policy.SpecKey)
92+
if !ok {
93+
if ctx.Value(contextMethodKey{}) != DataSourceRead {
94+
return diag.FromErr(fmt.Errorf("spec: %v is not valid: minimum one valid spec block is required", existingSpec))
95+
}
96+
} else {
97+
data, _ := existingSpec.([]interface{})
98+
99+
if len(data) == 0 || data[0] == nil {
100+
return diag.FromErr(fmt.Errorf("spec data: %v is not valid: minimum one valid spec data block is required", existingSpec))
101+
}
102+
103+
specData := data[0].(map[string]interface{})
104+
105+
v, ok := specData[spec.PathToInlineValuesKey]
106+
if ok {
107+
v1, ok := v.(string)
108+
if !ok {
109+
return diag.FromErr(fmt.Errorf("type of path_to_inline_values data: %v is not valid", v1))
110+
}
111+
112+
pathToInlineValues = v1
113+
} else {
114+
pathToInlineValues = ""
115+
}
116+
}
117+
118+
specValue, err := spec.FlattenSpecForClusterScope(repoSpec, pathToInlineValues)
119+
if err != nil {
120+
return diag.FromErr(errors.Wrapf(err, "Unable to write inline values to the file: %s", pathToInlineValues))
121+
}
122+
123+
if err := d.Set(spec.SpecKey, specValue); err != nil {
84124
return diag.FromErr(err)
85125
}
86126

internal/resources/tanzupackageinstall/package_install_resource.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func ResourcePackageInstall() *schema.Resource {
4040
Schema: getResourceSchema(),
4141
CustomizeDiff: customdiff.All(
4242
schema.CustomizeDiffFunc(commonscope.ValidateScope([]string{commonscope.ClusterKey})),
43+
schema.CustomizeDiffFunc(spec.ValidateInlineValues()),
4344
),
4445
}
4546
}
@@ -195,7 +196,7 @@ func resourcePackageInstallInPlaceUpdate(ctx context.Context, d *schema.Resource
195196
specCheck, err := updateCheckForSpec(d, installSpec)
196197
if err != nil {
197198
log.Println("[ERROR] Unable to check spec has been updated.")
198-
diag.FromErr(err)
199+
return diag.FromErr(err)
199200
}
200201

201202
if specCheck {

internal/resources/tanzupackageinstall/package_install_resource_mock_test.go

+80
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ import (
1313
"os"
1414
"testing"
1515

16+
"github.com/go-openapi/strfmt"
1617
"github.com/go-test/deep"
1718
"github.com/jarcoal/httpmock"
1819

1920
"github.com/vmware/terraform-provider-tanzu-mission-control/internal/helper"
2021
objectmetamodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/objectmeta"
22+
pakageclustermodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/package/cluster"
2123
statusmodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/status"
24+
tanzupakageclustermodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/tanzupackage"
2225
packageinstallmodel "github.com/vmware/terraform-provider-tanzu-mission-control/internal/models/tanzupackageinstall"
2326
)
2427

@@ -27,6 +30,7 @@ const (
2730
clAPIVersionAndGroup = "v1alpha1/clusters"
2831
apiSubGroup = "namespaces"
2932
apiKind = "tanzupackage/installs"
33+
apiKindMetadata = "tanzupackage/metadatas"
3034
)
3135

3236
// nolint: unparam
@@ -179,6 +183,82 @@ func (testConfig *testAcceptanceConfig) setupHTTPMocks(t *testing.T) {
179183
referenceArray := make([]*objectmetamodel.VmwareTanzuCoreV1alpha1ObjectReference, 0)
180184
referenceArray = append(referenceArray, &reference)
181185

186+
getTanzuPkgMetadataResponse := func(pkgName string) *pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataGetPackageResponse {
187+
return &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataGetPackageResponse{
188+
Package: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackagePackage{
189+
FullName: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageFullName{
190+
ClusterName: testConfig.ScopeHelperResources.Cluster.Name,
191+
ManagementClusterName: "attached",
192+
ProvisionerName: "attached",
193+
OrgID: OrgID,
194+
Name: pkgName,
195+
NamespaceName: globalRepoNamespace,
196+
MetadataName: pkgMetadataName,
197+
},
198+
Meta: &objectmetamodel.VmwareTanzuCoreV1alpha1ObjectMeta{
199+
ParentReferences: referenceArray,
200+
Description: "resource with description",
201+
Labels: map[string]string{
202+
"key1": "value1",
203+
"key2": "value2",
204+
},
205+
UID: "package1",
206+
ResourceVersion: "v1",
207+
},
208+
Spec: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageSpec{
209+
CapacityRequirementsDescription: "someCapacityRequirementsDescription",
210+
Licenses: []string{
211+
"some1",
212+
},
213+
ReleaseNotes: "cert-manager 1.1.0 https://github.com/jetstack/cert-manager/1.1.0",
214+
ReleasedAt: strfmt.DateTime{},
215+
RepositoryName: "testRepo",
216+
ValuesSchema: &pakageclustermodel.VmwareTanzuManageV1alpha1ClusterNamespaceTanzupackageMetadataPackageValuesSchema{
217+
Template: &pakageclustermodel.K8sIoApimachineryPkgRuntimeRawExtension{
218+
Raw: []byte("somevalue"),
219+
},
220+
},
221+
},
222+
},
223+
}
224+
}
225+
226+
getTanzuPkgMetadataEndpoint1 := (helper.ConstructRequestURL(https, endpoint, clAPIVersionAndGroup, testConfig.ScopeHelperResources.Cluster.Name, apiSubGroup, globalRepoNamespace, apiKindMetadata, pkgMetadataName, "packages", testConfig.PkgName1)).String()
227+
getTanzuPkgMetadataEndpoint2 := (helper.ConstructRequestURL(https, endpoint, clAPIVersionAndGroup, testConfig.ScopeHelperResources.Cluster.Name, apiSubGroup, globalRepoNamespace, apiKindMetadata, pkgMetadataName, "packages", testConfig.PkgName2)).String()
228+
229+
httpmock.RegisterResponder("GET", getTanzuPkgMetadataEndpoint1,
230+
bodyInspectingResponder(t, nil, 200, getTanzuPkgMetadataResponse(testConfig.PkgName1)))
231+
httpmock.RegisterResponder("GET", getTanzuPkgMetadataEndpoint2,
232+
bodyInspectingResponder(t, nil, 200, getTanzuPkgMetadataResponse(testConfig.PkgName2)))
233+
234+
// cluster level package resource.
235+
236+
getTanzuPackageResponse := &tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageListTanzuPackagesResponse{
237+
TanzuPackages: []*tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageTanzuPackage{
238+
{
239+
FullName: &tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageFullName{
240+
ClusterName: testConfig.ScopeHelperResources.Cluster.Name,
241+
ManagementClusterName: "attached",
242+
ProvisionerName: "attached",
243+
OrgID: OrgID,
244+
},
245+
Status: &tanzupakageclustermodel.VmwareTanzuManageV1alpha1ClusterTanzupackageStatus{
246+
Conditions: map[string]statusmodel.VmwareTanzuCoreV1alpha1StatusCondition{
247+
"Ready": {
248+
Reason: "made successfully",
249+
},
250+
},
251+
PackageRepositoryGlobalNamespace: globalRepoNamespace,
252+
},
253+
},
254+
},
255+
}
256+
257+
getTanzuPackageEndpoint := (helper.ConstructRequestURL(https, endpoint, clAPIVersionAndGroup, testConfig.ScopeHelperResources.Cluster.Name, "tanzupackage")).String()
258+
259+
httpmock.RegisterResponder("GET", getTanzuPackageEndpoint,
260+
bodyInspectingResponder(t, nil, 200, getTanzuPackageResponse))
261+
182262
// cluster level package install resource.
183263
postRequest, postResponse, getResponse := testConfig.getClRequestResponse(OrgID, referenceArray)
184264

0 commit comments

Comments
 (0)