Skip to content

Commit 61c10ce

Browse files
Fix AsTime() for nil proto timestamp (#1847)
1 parent 2449502 commit 61c10ce

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

internal/internal_worker_deployment_client.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ import (
2727
"errors"
2828
"fmt"
2929
"strings"
30+
"time"
3031

3132
"go.temporal.io/api/common/v1"
3233
"go.temporal.io/api/deployment/v1"
3334
"go.temporal.io/api/workflowservice/v1"
3435
"go.temporal.io/sdk/converter"
36+
"google.golang.org/protobuf/types/known/timestamppb"
3537
)
3638

3739
// A reserved identifier of unversioned workers.
@@ -40,6 +42,15 @@ const WorkerDeploymentUnversioned = "__unversioned__"
4042
// A reserved separator for Worker Deployment Versions.
4143
const WorkerDeploymentVersionSeparator = "."
4244

45+
// safeAsTime ensures that a nil proto timestamp makes `IsZero()` true.
46+
func safeAsTime(timestamp *timestamppb.Timestamp) time.Time {
47+
if timestamp == nil {
48+
return time.Time{}
49+
} else {
50+
return timestamp.AsTime()
51+
}
52+
}
53+
4354
type (
4455
// WorkerDeploymentClient is the client for managing worker deployments.
4556
workerDeploymentClient struct {
@@ -100,16 +111,16 @@ func workerDeploymentRoutingConfigFromProto(routingConfig *deployment.RoutingCon
100111
CurrentVersion: routingConfig.GetCurrentVersion(),
101112
RampingVersion: routingConfig.GetRampingVersion(),
102113
RampingVersionPercentage: routingConfig.GetRampingVersionPercentage(),
103-
CurrentVersionChangedTime: routingConfig.GetCurrentVersionChangedTime().AsTime(),
104-
RampingVersionChangedTime: routingConfig.GetRampingVersionChangedTime().AsTime(),
105-
RampingVersionPercentageChangedTime: routingConfig.GetRampingVersionPercentageChangedTime().AsTime(),
114+
CurrentVersionChangedTime: safeAsTime(routingConfig.GetCurrentVersionChangedTime()),
115+
RampingVersionChangedTime: safeAsTime(routingConfig.GetRampingVersionChangedTime()),
116+
RampingVersionPercentageChangedTime: safeAsTime(routingConfig.GetRampingVersionPercentageChangedTime()),
106117
}
107118
}
108119

109120
func workerDeploymentListEntryFromProto(summary *workflowservice.ListWorkerDeploymentsResponse_WorkerDeploymentSummary) *WorkerDeploymentListEntry {
110121
return &WorkerDeploymentListEntry{
111122
Name: summary.GetName(),
112-
CreateTime: summary.GetCreateTime().AsTime(),
123+
CreateTime: safeAsTime(summary.GetCreateTime()),
113124
RoutingConfig: workerDeploymentRoutingConfigFromProto(summary.GetRoutingConfig()),
114125
}
115126
}
@@ -119,7 +130,7 @@ func workerDeploymentVersionSummariesFromProto(summaries []*deployment.WorkerDep
119130
for _, summary := range summaries {
120131
result = append(result, WorkerDeploymentVersionSummary{
121132
Version: summary.GetVersion(),
122-
CreateTime: summary.CreateTime.AsTime(),
133+
CreateTime: safeAsTime(summary.CreateTime),
123134
DrainageStatus: WorkerDeploymentVersionDrainageStatus(summary.GetDrainageStatus()),
124135
})
125136
}
@@ -133,7 +144,7 @@ func workerDeploymentInfoFromProto(info *deployment.WorkerDeploymentInfo) Worker
133144

134145
return WorkerDeploymentInfo{
135146
Name: info.Name,
136-
CreateTime: info.CreateTime.AsTime(),
147+
CreateTime: safeAsTime(info.CreateTime),
137148
VersionSummaries: workerDeploymentVersionSummariesFromProto(info.VersionSummaries),
138149
RoutingConfig: workerDeploymentRoutingConfigFromProto(info.RoutingConfig),
139150
LastModifierIdentity: info.LastModifierIdentity,
@@ -296,8 +307,8 @@ func workerDeploymentDrainageInfoFromProto(drainageInfo *deployment.VersionDrain
296307
}
297308
return &WorkerDeploymentVersionDrainageInfo{
298309
DrainageStatus: WorkerDeploymentVersionDrainageStatus(drainageInfo.Status),
299-
LastChangedTime: drainageInfo.LastChangedTime.AsTime(),
300-
LastCheckedTime: drainageInfo.LastCheckedTime.AsTime(),
310+
LastChangedTime: safeAsTime(drainageInfo.LastChangedTime),
311+
LastCheckedTime: safeAsTime(drainageInfo.LastCheckedTime),
301312
}
302313
}
303314

@@ -307,10 +318,10 @@ func workerDeploymentVersionInfoFromProto(info *deployment.WorkerDeploymentVersi
307318
}
308319
return WorkerDeploymentVersionInfo{
309320
Version: info.Version,
310-
CreateTime: info.CreateTime.AsTime(),
311-
RoutingChangedTime: info.RoutingChangedTime.AsTime(),
312-
CurrentSinceTime: info.CurrentSinceTime.AsTime(),
313-
RampingSinceTime: info.RampingSinceTime.AsTime(),
321+
CreateTime: safeAsTime(info.CreateTime),
322+
RoutingChangedTime: safeAsTime(info.RoutingChangedTime),
323+
CurrentSinceTime: safeAsTime(info.CurrentSinceTime),
324+
RampingSinceTime: safeAsTime(info.RampingSinceTime),
314325
RampPercentage: info.RampPercentage,
315326
TaskQueuesInfos: workerDeploymentTaskQueuesInfosFromProto(info.TaskQueueInfos),
316327
DrainageInfo: workerDeploymentDrainageInfoFromProto(info.DrainageInfo),

internal/internal_worker_deployment_client_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828

2929
"github.com/golang/mock/gomock"
3030
"github.com/stretchr/testify/suite"
31+
"go.temporal.io/api/deployment/v1"
3132
"go.temporal.io/api/serviceerror"
3233
"go.temporal.io/api/workflowservice/v1"
3334
"go.temporal.io/api/workflowservicemock/v1"
@@ -147,3 +148,25 @@ func (d *workerDeploymentClientTestSuite) TestWorkerDeploymentIteratorError() {
147148
d.Nil(event)
148149
d.NotNil(err)
149150
}
151+
152+
// nil timestamps pass IsZero()
153+
func (d *workerDeploymentClientTestSuite) TestWorkerDeploymenNilTimestamp() {
154+
request := &workflowservice.DescribeWorkerDeploymentRequest{
155+
Namespace: DefaultNamespace,
156+
DeploymentName: "foo",
157+
}
158+
159+
response := &workflowservice.DescribeWorkerDeploymentResponse{
160+
ConflictToken: []byte{1, 2, 1, 2, 1, 1, 8},
161+
WorkerDeploymentInfo: &deployment.WorkerDeploymentInfo{
162+
Name: "foo",
163+
CreateTime: nil,
164+
},
165+
}
166+
167+
d.service.EXPECT().DescribeWorkerDeployment(gomock.Any(), request, gomock.Any()).Return(response, nil).Times(1)
168+
169+
dHandle := d.client.WorkerDeploymentClient().GetHandle("foo")
170+
deployment, _ := dHandle.Describe(context.Background(), WorkerDeploymentDescribeOptions{})
171+
d.True(deployment.Info.CreateTime.IsZero())
172+
}

0 commit comments

Comments
 (0)