From d738815a36aaa3f6f8c5c21c7cc9389b0536c323 Mon Sep 17 00:00:00 2001 From: IaroslavTitov Date: Fri, 26 Apr 2024 15:11:38 -0600 Subject: [PATCH] Fixing refresh breaking drift and ttl schedule --- CHANGELOG_PENDING.md | 2 ++ .../pulumi-resource-pulumiservice/schema.json | 12 ++++++++---- provider/pkg/provider/deployment_schedules.go | 16 ++++++++++------ provider/pkg/provider/drift_schedules.go | 18 ++++++++++++++++-- provider/pkg/provider/ttl_schedules.go | 18 ++++++++++++++++-- sdk/dotnet/DriftSchedule.cs | 1 + sdk/dotnet/TtlSchedule.cs | 1 + sdk/go/pulumiservice/driftSchedule.go | 3 +++ sdk/go/pulumiservice/ttlSchedule.go | 3 +++ .../pulumiservice/DriftScheduleArgs.java | 2 ++ .../pulumi/pulumiservice/TtlScheduleArgs.java | 2 ++ sdk/nodejs/driftSchedule.ts | 2 +- sdk/nodejs/ttlSchedule.ts | 2 +- .../pulumi_pulumiservice/drift_schedule.py | 4 ++++ .../pulumi_pulumiservice/ttl_schedule.py | 4 ++++ 15 files changed, 74 insertions(+), 16 deletions(-) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 5e78e668..5fcb88fb 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -2,4 +2,6 @@ ### Bug Fixes +- Fixed refresh breaking schedules bug [#257](https://github.com/pulumi/pulumi-pulumiservice/issues/257) + ### Miscellaneous diff --git a/provider/cmd/pulumi-resource-pulumiservice/schema.json b/provider/cmd/pulumi-resource-pulumiservice/schema.json index 8dcf8e38..f26e1037 100644 --- a/provider/cmd/pulumi-resource-pulumiservice/schema.json +++ b/provider/cmd/pulumi-resource-pulumiservice/schema.json @@ -1109,7 +1109,8 @@ }, "autoRemediate": { "description": "Whether any drift detected should be remediated after a drift run.", - "type": "boolean" + "type": "boolean", + "default": false }, "scheduleId": { "description": "Schedule ID of the created schedule, assigned by Pulumi Cloud.", @@ -1142,7 +1143,8 @@ }, "autoRemediate": { "description": "Whether any drift detected should be remediated after a drift run.", - "type": "boolean" + "type": "boolean", + "default": false } }, "requiredInputs": [ @@ -1173,7 +1175,8 @@ }, "deleteAfterDestroy": { "description": "True if the stack and all associated history and settings should be deleted.", - "type": "boolean" + "type": "boolean", + "default": false }, "scheduleId": { "description": "Schedule ID of the created schedule, assigned by Pulumi Cloud.", @@ -1206,7 +1209,8 @@ }, "deleteAfterDestroy": { "description": "True if the stack and all associated history and settings should be deleted.", - "type": "boolean" + "type": "boolean", + "default": false } }, "requiredInputs": [ diff --git a/provider/pkg/provider/deployment_schedules.go b/provider/pkg/provider/deployment_schedules.go index e1c9ee64..be79804a 100644 --- a/provider/pkg/provider/deployment_schedules.go +++ b/provider/pkg/provider/deployment_schedules.go @@ -142,16 +142,20 @@ func ScheduleSharedDiff(req *pulumirpc.DiffRequest) (*pulumirpc.DiffResponse, er return nil, err } - // preprocess olds to remove the `scheduleId` property since it's only an output and shouldn't cause a diff - if olds["scheduleId"].HasValue() { - delete(olds, "scheduleId") - } - news, err := plugin.UnmarshalProperties(req.GetNews(), plugin.MarshalOptions{KeepUnknowns: true, SkipNulls: true}) if err != nil { return nil, err } + return ScheduleSharedDiffMaps(olds, news) +} + +func ScheduleSharedDiffMaps(olds resource.PropertyMap, news resource.PropertyMap) (*pulumirpc.DiffResponse, error) { + // preprocess olds to remove the `scheduleId` property since it's only an output and shouldn't cause a diff + if olds["scheduleId"].HasValue() { + delete(olds, "scheduleId") + } + diffs := olds.Diff(news) if diffs == nil { return &pulumirpc.DiffResponse{ @@ -342,7 +346,7 @@ func (st *PulumiServiceDeploymentScheduleResource) Read(req *pulumirpc.ReadReque } outputProperties, err := plugin.MarshalProperties( - input.ToPropertyMap(), + AddScheduleIdToPropertyMap(*scheduleID, input.ToPropertyMap()), plugin.MarshalOptions{ KeepUnknowns: true, SkipNulls: true, diff --git a/provider/pkg/provider/drift_schedules.go b/provider/pkg/provider/drift_schedules.go index a250e9b8..aa3eab71 100644 --- a/provider/pkg/provider/drift_schedules.go +++ b/provider/pkg/provider/drift_schedules.go @@ -63,7 +63,21 @@ func ToPulumiServiceDriftScheduleInput(properties *structpb.Struct) (*PulumiServ } func (st *PulumiServiceDriftScheduleResource) Diff(req *pulumirpc.DiffRequest) (*pulumirpc.DiffResponse, error) { - return ScheduleSharedDiff(req) + olds, err := plugin.UnmarshalProperties(req.GetOlds(), plugin.MarshalOptions{KeepUnknowns: false, 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 + } + + if !news["autoRemediate"].HasValue() { + news["autoRemediate"] = resource.NewBoolProperty(false) + } + + return ScheduleSharedDiffMaps(olds, news) } func (st *PulumiServiceDriftScheduleResource) Delete(req *pulumirpc.DeleteRequest) (*pbempty.Empty, error) { @@ -182,7 +196,7 @@ func (st *PulumiServiceDriftScheduleResource) Read(req *pulumirpc.ReadRequest) ( } outputProperties, err := plugin.MarshalProperties( - input.ToPropertyMap(), + AddScheduleIdToPropertyMap(*scheduleID, input.ToPropertyMap()), plugin.MarshalOptions{ KeepUnknowns: true, SkipNulls: true, diff --git a/provider/pkg/provider/ttl_schedules.go b/provider/pkg/provider/ttl_schedules.go index 9f95405b..a755a478 100644 --- a/provider/pkg/provider/ttl_schedules.go +++ b/provider/pkg/provider/ttl_schedules.go @@ -67,7 +67,21 @@ func ToPulumiServiceTtlScheduleInput(properties *structpb.Struct) (*PulumiServic } func (st *PulumiServiceTtlScheduleResource) Diff(req *pulumirpc.DiffRequest) (*pulumirpc.DiffResponse, error) { - return ScheduleSharedDiff(req) + olds, err := plugin.UnmarshalProperties(req.GetOlds(), plugin.MarshalOptions{KeepUnknowns: false, 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 + } + + if !news["deleteAfterDestroy"].HasValue() { + news["deleteAfterDestroy"] = resource.NewBoolProperty(false) + } + + return ScheduleSharedDiffMaps(olds, news) } func (st *PulumiServiceTtlScheduleResource) Delete(req *pulumirpc.DeleteRequest) (*pbempty.Empty, error) { @@ -186,7 +200,7 @@ func (st *PulumiServiceTtlScheduleResource) Read(req *pulumirpc.ReadRequest) (*p } outputProperties, err := plugin.MarshalProperties( - input.ToPropertyMap(), + AddScheduleIdToPropertyMap(*scheduleID, input.ToPropertyMap()), plugin.MarshalOptions{ KeepUnknowns: true, SkipNulls: true, diff --git a/sdk/dotnet/DriftSchedule.cs b/sdk/dotnet/DriftSchedule.cs index 9b2a70c1..5d26f061 100644 --- a/sdk/dotnet/DriftSchedule.cs +++ b/sdk/dotnet/DriftSchedule.cs @@ -128,6 +128,7 @@ public sealed class DriftScheduleArgs : global::Pulumi.ResourceArgs public DriftScheduleArgs() { + AutoRemediate = false; } public static new DriftScheduleArgs Empty => new DriftScheduleArgs(); } diff --git a/sdk/dotnet/TtlSchedule.cs b/sdk/dotnet/TtlSchedule.cs index fd9fa6e7..067370c8 100644 --- a/sdk/dotnet/TtlSchedule.cs +++ b/sdk/dotnet/TtlSchedule.cs @@ -128,6 +128,7 @@ public sealed class TtlScheduleArgs : global::Pulumi.ResourceArgs public TtlScheduleArgs() { + DeleteAfterDestroy = false; } public static new TtlScheduleArgs Empty => new TtlScheduleArgs(); } diff --git a/sdk/go/pulumiservice/driftSchedule.go b/sdk/go/pulumiservice/driftSchedule.go index 798393da..95be07cc 100644 --- a/sdk/go/pulumiservice/driftSchedule.go +++ b/sdk/go/pulumiservice/driftSchedule.go @@ -49,6 +49,9 @@ func NewDriftSchedule(ctx *pulumi.Context, if args.Stack == nil { return nil, errors.New("invalid value for required argument 'Stack'") } + if args.AutoRemediate == nil { + args.AutoRemediate = pulumi.BoolPtr(false) + } opts = internal.PkgResourceDefaultOpts(opts) var resource DriftSchedule err := ctx.RegisterResource("pulumiservice:index:DriftSchedule", name, args, &resource, opts...) diff --git a/sdk/go/pulumiservice/ttlSchedule.go b/sdk/go/pulumiservice/ttlSchedule.go index 1f8960b4..d19c54ec 100644 --- a/sdk/go/pulumiservice/ttlSchedule.go +++ b/sdk/go/pulumiservice/ttlSchedule.go @@ -49,6 +49,9 @@ func NewTtlSchedule(ctx *pulumi.Context, if args.Timestamp == nil { return nil, errors.New("invalid value for required argument 'Timestamp'") } + if args.DeleteAfterDestroy == nil { + args.DeleteAfterDestroy = pulumi.BoolPtr(false) + } opts = internal.PkgResourceDefaultOpts(opts) var resource TtlSchedule err := ctx.RegisterResource("pulumiservice:index:TtlSchedule", name, args, &resource, opts...) diff --git a/sdk/java/src/main/java/com/pulumi/pulumiservice/DriftScheduleArgs.java b/sdk/java/src/main/java/com/pulumi/pulumiservice/DriftScheduleArgs.java index b95d1f35..f741a5f2 100644 --- a/sdk/java/src/main/java/com/pulumi/pulumiservice/DriftScheduleArgs.java +++ b/sdk/java/src/main/java/com/pulumi/pulumiservice/DriftScheduleArgs.java @@ -5,6 +5,7 @@ import com.pulumi.core.Output; import com.pulumi.core.annotations.Import; +import com.pulumi.core.internal.Codegen; import com.pulumi.exceptions.MissingRequiredPropertyException; import java.lang.Boolean; import java.lang.String; @@ -226,6 +227,7 @@ public Builder stack(String stack) { } public DriftScheduleArgs build() { + $.autoRemediate = Codegen.booleanProp("autoRemediate").output().arg($.autoRemediate).def(false).getNullable(); if ($.organization == null) { throw new MissingRequiredPropertyException("DriftScheduleArgs", "organization"); } diff --git a/sdk/java/src/main/java/com/pulumi/pulumiservice/TtlScheduleArgs.java b/sdk/java/src/main/java/com/pulumi/pulumiservice/TtlScheduleArgs.java index aba00628..9abb09b2 100644 --- a/sdk/java/src/main/java/com/pulumi/pulumiservice/TtlScheduleArgs.java +++ b/sdk/java/src/main/java/com/pulumi/pulumiservice/TtlScheduleArgs.java @@ -5,6 +5,7 @@ import com.pulumi.core.Output; import com.pulumi.core.annotations.Import; +import com.pulumi.core.internal.Codegen; import com.pulumi.exceptions.MissingRequiredPropertyException; import java.lang.Boolean; import java.lang.String; @@ -226,6 +227,7 @@ public Builder timestamp(String timestamp) { } public TtlScheduleArgs build() { + $.deleteAfterDestroy = Codegen.booleanProp("deleteAfterDestroy").output().arg($.deleteAfterDestroy).def(false).getNullable(); if ($.organization == null) { throw new MissingRequiredPropertyException("TtlScheduleArgs", "organization"); } diff --git a/sdk/nodejs/driftSchedule.ts b/sdk/nodejs/driftSchedule.ts index 32e847d7..d39dfc78 100644 --- a/sdk/nodejs/driftSchedule.ts +++ b/sdk/nodejs/driftSchedule.ts @@ -82,7 +82,7 @@ export class DriftSchedule extends pulumi.CustomResource { if ((!args || args.stack === undefined) && !opts.urn) { throw new Error("Missing required property 'stack'"); } - resourceInputs["autoRemediate"] = args ? args.autoRemediate : undefined; + resourceInputs["autoRemediate"] = (args ? args.autoRemediate : undefined) ?? false; resourceInputs["organization"] = args ? args.organization : undefined; resourceInputs["project"] = args ? args.project : undefined; resourceInputs["scheduleCron"] = args ? args.scheduleCron : undefined; diff --git a/sdk/nodejs/ttlSchedule.ts b/sdk/nodejs/ttlSchedule.ts index 026e9ad9..51e451db 100644 --- a/sdk/nodejs/ttlSchedule.ts +++ b/sdk/nodejs/ttlSchedule.ts @@ -82,7 +82,7 @@ export class TtlSchedule extends pulumi.CustomResource { if ((!args || args.timestamp === undefined) && !opts.urn) { throw new Error("Missing required property 'timestamp'"); } - resourceInputs["deleteAfterDestroy"] = args ? args.deleteAfterDestroy : undefined; + resourceInputs["deleteAfterDestroy"] = (args ? args.deleteAfterDestroy : undefined) ?? false; resourceInputs["organization"] = args ? args.organization : undefined; resourceInputs["project"] = args ? args.project : undefined; resourceInputs["stack"] = args ? args.stack : undefined; diff --git a/sdk/python/pulumi_pulumiservice/drift_schedule.py b/sdk/python/pulumi_pulumiservice/drift_schedule.py index a1aa07be..50bc80be 100644 --- a/sdk/python/pulumi_pulumiservice/drift_schedule.py +++ b/sdk/python/pulumi_pulumiservice/drift_schedule.py @@ -31,6 +31,8 @@ def __init__(__self__, *, pulumi.set(__self__, "project", project) pulumi.set(__self__, "schedule_cron", schedule_cron) pulumi.set(__self__, "stack", stack) + if auto_remediate is None: + auto_remediate = False if auto_remediate is not None: pulumi.set(__self__, "auto_remediate", auto_remediate) @@ -155,6 +157,8 @@ def _internal_init(__self__, raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') __props__ = DriftScheduleArgs.__new__(DriftScheduleArgs) + if auto_remediate is None: + auto_remediate = False __props__.__dict__["auto_remediate"] = auto_remediate if organization is None and not opts.urn: raise TypeError("Missing required property 'organization'") diff --git a/sdk/python/pulumi_pulumiservice/ttl_schedule.py b/sdk/python/pulumi_pulumiservice/ttl_schedule.py index 99aa73be..63f45687 100644 --- a/sdk/python/pulumi_pulumiservice/ttl_schedule.py +++ b/sdk/python/pulumi_pulumiservice/ttl_schedule.py @@ -31,6 +31,8 @@ def __init__(__self__, *, pulumi.set(__self__, "project", project) pulumi.set(__self__, "stack", stack) pulumi.set(__self__, "timestamp", timestamp) + if delete_after_destroy is None: + delete_after_destroy = False if delete_after_destroy is not None: pulumi.set(__self__, "delete_after_destroy", delete_after_destroy) @@ -155,6 +157,8 @@ def _internal_init(__self__, raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource') __props__ = TtlScheduleArgs.__new__(TtlScheduleArgs) + if delete_after_destroy is None: + delete_after_destroy = False __props__.__dict__["delete_after_destroy"] = delete_after_destroy if organization is None and not opts.urn: raise TypeError("Missing required property 'organization'")