From 0b907b4c284b7a23670777936ade9dbb0dfac2c5 Mon Sep 17 00:00:00 2001 From: IaroslavTitov Date: Wed, 5 Jun 2024 14:01:06 -0600 Subject: [PATCH] Adding update functionality to Deployment Settings resource --- CHANGELOG_PENDING.md | 2 + provider/go.mod | 2 +- provider/go.sum | 4 +- .../internal/pulumiapi/deployment_settings.go | 10 ++ .../pkg/provider/deployment_setting_test.go | 3 + provider/pkg/provider/deployment_settings.go | 94 ++++++++++++------- 6 files changed, 76 insertions(+), 39 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 5e78e668..521c6993 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -1,5 +1,7 @@ ### Improvements +- Added Update logic to Deplyoment Settings resourse [#299](https://github.com/pulumi/pulumi-pulumiservice/issues/299) + ### Bug Fixes ### Miscellaneous diff --git a/provider/go.mod b/provider/go.mod index 7288d7b0..649545f7 100644 --- a/provider/go.mod +++ b/provider/go.mod @@ -3,7 +3,7 @@ module github.com/pulumi/pulumi-pulumiservice/provider go 1.21.0 require ( - github.com/pulumi/esc v0.8.4-0.20240528210029-4a7b80c97962 + github.com/pulumi/esc v0.9.1 github.com/pulumi/pulumi/pkg/v3 v3.112.0 github.com/pulumi/pulumi/sdk/v3 v3.115.3-0.20240507143413-cffdfd1fa489 github.com/stretchr/testify v1.9.0 diff --git a/provider/go.sum b/provider/go.sum index 5409e6c0..fa88c1e2 100644 --- a/provider/go.sum +++ b/provider/go.sum @@ -157,8 +157,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 h1:vkHw5I/plNdTr435cARxCW6q9gc0S/Yxz7Mkd38pOb0= github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231/go.mod h1:murToZ2N9hNJzewjHBgfFdXhZKjY3z5cYC1VXk+lbFE= -github.com/pulumi/esc v0.8.4-0.20240528210029-4a7b80c97962 h1:0tHF/cdjSxdRJyb7AWKrk56ItHehcv/FtzVDkUCFnvE= -github.com/pulumi/esc v0.8.4-0.20240528210029-4a7b80c97962/go.mod h1:Xg2+LEWV0szTc+bcO+L1D0lKZOrA7x9Thiqse1CN6v4= +github.com/pulumi/esc v0.9.1 h1:HH5eEv8sgyxSpY5a8yePyqFXzA8cvBvapfH8457+mIs= +github.com/pulumi/esc v0.9.1/go.mod h1:oEJ6bOsjYlQUpjf70GiX+CXn3VBmpwFDxUTlmtUN84c= github.com/pulumi/pulumi/pkg/v3 v3.112.0 h1:vhoM6sx1eegJntIeUZENtck3VeMtK1zBiQ2E3EPOnHw= github.com/pulumi/pulumi/pkg/v3 v3.112.0/go.mod h1:GQhNr0v5E8TACF8j0p6UQqyr7mZreUpoMfVjLeu6eY0= github.com/pulumi/pulumi/sdk/v3 v3.115.3-0.20240507143413-cffdfd1fa489 h1:e7J2I8veUe9mSpzWN9kPREp7YhHUwnQz0aP0k5R45V8= diff --git a/provider/pkg/internal/pulumiapi/deployment_settings.go b/provider/pkg/internal/pulumiapi/deployment_settings.go index e2e35927..004f69ec 100644 --- a/provider/pkg/internal/pulumiapi/deployment_settings.go +++ b/provider/pkg/internal/pulumiapi/deployment_settings.go @@ -11,6 +11,7 @@ import ( type DeploymentSettingsClient interface { CreateDeploymentSettings(ctx context.Context, stack StackName, ds DeploymentSettings) error + UpdateDeploymentSettings(ctx context.Context, stack StackName, ds DeploymentSettings) error GetDeploymentSettings(ctx context.Context, stack StackName) (*DeploymentSettings, error) DeleteDeploymentSettings(ctx context.Context, stack StackName) error } @@ -82,6 +83,15 @@ func (c *Client) CreateDeploymentSettings(ctx context.Context, stack StackName, return nil } +func (c *Client) UpdateDeploymentSettings(ctx context.Context, stack StackName, ds DeploymentSettings) error { + apiPath := path.Join("stacks", stack.OrgName, stack.ProjectName, stack.StackName, "deployments", "settings") + _, err := c.do(ctx, http.MethodPut, apiPath, ds, nil) + if err != nil { + return fmt.Errorf("failed to update deployment settings for stack (%s): %w", stack.String(), err) + } + return nil +} + func (c *Client) GetDeploymentSettings(ctx context.Context, stack StackName) (*DeploymentSettings, error) { apiPath := path.Join( "stacks", stack.OrgName, stack.ProjectName, stack.StackName, "deployments", "settings", diff --git a/provider/pkg/provider/deployment_setting_test.go b/provider/pkg/provider/deployment_setting_test.go index bdf45e91..96b0107f 100644 --- a/provider/pkg/provider/deployment_setting_test.go +++ b/provider/pkg/provider/deployment_setting_test.go @@ -20,6 +20,9 @@ type DeploymentSettingsClientMock struct { func (c *DeploymentSettingsClientMock) CreateDeploymentSettings(ctx context.Context, stack pulumiapi.StackName, ds pulumiapi.DeploymentSettings) error { return nil } +func (c *DeploymentSettingsClientMock) UpdateDeploymentSettings(ctx context.Context, stack pulumiapi.StackName, ds pulumiapi.DeploymentSettings) error { + return nil +} func (c *DeploymentSettingsClientMock) GetDeploymentSettings(ctx context.Context, stack pulumiapi.StackName) (*pulumiapi.DeploymentSettings, error) { return c.getDeploymentSettingsFunc() } diff --git a/provider/pkg/provider/deployment_settings.go b/provider/pkg/provider/deployment_settings.go index abc7041a..a69b61a0 100644 --- a/provider/pkg/provider/deployment_settings.go +++ b/provider/pkg/provider/deployment_settings.go @@ -488,7 +488,51 @@ func getSecretOrStringValue(prop resource.PropertyValue) string { } func (ds *PulumiServiceDeploymentSettingsResource) Diff(req *pulumirpc.DiffRequest) (*pulumirpc.DiffResponse, error) { - return considerAllChangesReplaces(req) + olds, err := plugin.UnmarshalProperties(req.GetOlds(), plugin.MarshalOptions{KeepUnknowns: true, SkipNulls: true}) + if err != nil { + return nil, err + } + + news, err := plugin.UnmarshalProperties(req.GetNews(), plugin.MarshalOptions{KeepUnknowns: true, SkipNulls: true}) + if err != nil { + return nil, err + } + + diffs := olds.Diff(news) + if diffs == nil { + return &pulumirpc.DiffResponse{ + Changes: pulumirpc.DiffResponse_DIFF_NONE, + }, nil + } + + dd := plugin.NewDetailedDiffFromObjectDiff(diffs, false) + + detailedDiffs := map[string]*pulumirpc.PropertyDiff{} + replaces := []string(nil) + replaceProperties := map[string]bool{ + "organization": true, + "project": true, + "stack": true, + "sourceContext": true, + } + for k, v := range dd { + if _, ok := replaceProperties[k]; ok { + v.Kind = v.Kind.AsReplace() + replaces = append(replaces, k) + } + detailedDiffs[k] = &pulumirpc.PropertyDiff{ + Kind: pulumirpc.PropertyDiff_Kind(v.Kind), + InputDiff: v.InputDiff, + } + } + + return &pulumirpc.DiffResponse{ + Changes: pulumirpc.DiffResponse_DIFF_SOME, + Replaces: replaces, + DetailedDiff: detailedDiffs, + HasDetailedDiff: true, + DeleteBeforeReplace: len(replaces) > 0, + }, nil } func (ds *PulumiServiceDeploymentSettingsResource) Check(req *pulumirpc.CheckRequest) (*pulumirpc.CheckResponse, error) { @@ -586,48 +630,26 @@ func (ds *PulumiServiceDeploymentSettingsResource) Create(req *pulumirpc.CreateR }, nil } -func (ds *PulumiServiceDeploymentSettingsResource) Update(_ *pulumirpc.UpdateRequest) (*pulumirpc.UpdateResponse, error) { - // For simplicity, all updates are destructive, so we just call Create. - return nil, fmt.Errorf("unexpected call to update, expected create to be called instead") -} - -func (ds *PulumiServiceDeploymentSettingsResource) Name() string { - return "pulumiservice:index:DeploymentSettings" -} - -func considerAllChangesReplaces(req *pulumirpc.DiffRequest) (*pulumirpc.DiffResponse, error) { - olds, err := plugin.UnmarshalProperties(req.GetOlds(), plugin.MarshalOptions{KeepUnknowns: false, SkipNulls: true}) +func (ds *PulumiServiceDeploymentSettingsResource) Update(req *pulumirpc.UpdateRequest) (*pulumirpc.UpdateResponse, error) { + ctx := context.Background() + inputsMap, err := plugin.UnmarshalProperties(req.GetNews(), + plugin.MarshalOptions{KeepUnknowns: true, SkipNulls: true, KeepSecrets: true}) if err != nil { return nil, err } - news, err := plugin.UnmarshalProperties(req.GetNews(), plugin.MarshalOptions{KeepUnknowns: true, SkipNulls: true}) + inputs := ds.ToPulumiServiceDeploymentSettingsInput(inputsMap) + settings := inputs.DeploymentSettings + err = ds.client.UpdateDeploymentSettings(ctx, inputs.Stack, settings) if err != nil { return nil, err } - diffs := olds.Diff(news) - if diffs == nil { - return &pulumirpc.DiffResponse{ - Changes: pulumirpc.DiffResponse_DIFF_NONE, - }, nil - } - - dd := plugin.NewDetailedDiffFromObjectDiff(diffs, false) - - detailedDiffs := map[string]*pulumirpc.PropertyDiff{} - for k, v := range dd { - v.Kind = v.Kind.AsReplace() - detailedDiffs[k] = &pulumirpc.PropertyDiff{ - Kind: pulumirpc.PropertyDiff_Kind(v.Kind), - InputDiff: v.InputDiff, - } - } - - return &pulumirpc.DiffResponse{ - Changes: pulumirpc.DiffResponse_DIFF_SOME, - DetailedDiff: detailedDiffs, - DeleteBeforeReplace: true, - HasDetailedDiff: true, + return &pulumirpc.UpdateResponse{ + Properties: req.GetNews(), }, nil } + +func (ds *PulumiServiceDeploymentSettingsResource) Name() string { + return "pulumiservice:index:DeploymentSettings" +}