Skip to content

Commit

Permalink
Adding update functionality to Deployment Settings resource
Browse files Browse the repository at this point in the history
  • Loading branch information
IaroslavTitov committed Jun 5, 2024
1 parent ce6528d commit 0b907b4
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 39 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG_PENDING.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
### Improvements

- Added Update logic to Deplyoment Settings resourse [#299](https://github.com/pulumi/pulumi-pulumiservice/issues/299)

### Bug Fixes

### Miscellaneous
2 changes: 1 addition & 1 deletion provider/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions provider/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down
10 changes: 10 additions & 0 deletions provider/pkg/internal/pulumiapi/deployment_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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",
Expand Down
3 changes: 3 additions & 0 deletions provider/pkg/provider/deployment_setting_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
Expand Down
94 changes: 58 additions & 36 deletions provider/pkg/provider/deployment_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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"
}

0 comments on commit 0b907b4

Please sign in to comment.