Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions api/cloud/common/resource_status.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package common

import (
tcloudresourcev1 "go.temporal.io/cloud-sdk/api/resource/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand Down Expand Up @@ -46,6 +47,66 @@ type ResourceStatus struct {
// +kubebuilder:validation:Enum=Activating;ActivationFailed;Active;Updating;UpdateFailed;Deleting;DeleteFailed;Deleted;Suspended;Expired
type ResourceState string

// FromProto sets the state from a Temporal Cloud resource state. Unspecified
// and unknown states map to "": the CR field is enum-validated, so an
// unrecognized value would fail the status patch.
func (s *ResourceState) FromProto(in tcloudresourcev1.ResourceState) {
switch in {
case tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATING:
*s = ResourceStateActivating
case tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATION_FAILED:
*s = ResourceStateActivationFailed
case tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVE:
*s = ResourceStateActive
case tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATING:
*s = ResourceStateUpdating
case tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATE_FAILED:
*s = ResourceStateUpdateFailed
case tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETING:
*s = ResourceStateDeleting
case tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETE_FAILED:
*s = ResourceStateDeleteFailed
case tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETED:
*s = ResourceStateDeleted
case tcloudresourcev1.ResourceState_RESOURCE_STATE_SUSPENDED:
*s = ResourceStateSuspended
case tcloudresourcev1.ResourceState_RESOURCE_STATE_EXPIRED:
*s = ResourceStateExpired
default:
*s = ""
}
}

// ToProto returns the Temporal Cloud resource state for the state. The CR
// field is enum-validated, so unknown states cannot occur; they map to
// unspecified.
func (s ResourceState) ToProto() tcloudresourcev1.ResourceState {
switch s {
case ResourceStateActivating:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATING
case ResourceStateActivationFailed:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATION_FAILED
case ResourceStateActive:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVE
case ResourceStateUpdating:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATING
case ResourceStateUpdateFailed:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATE_FAILED
case ResourceStateDeleting:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETING
case ResourceStateDeleteFailed:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETE_FAILED
case ResourceStateDeleted:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETED
case ResourceStateSuspended:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_SUSPENDED
case ResourceStateExpired:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_EXPIRED
default:
return tcloudresourcev1.ResourceState_RESOURCE_STATE_UNSPECIFIED
}
}

const (
// ResourceStateActivating means the resource is being activated.
ResourceStateActivating ResourceState = "Activating"
Expand Down
39 changes: 39 additions & 0 deletions api/cloud/common/resource_status_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package common

import (
"testing"

"github.com/stretchr/testify/require"
tcloudresourcev1 "go.temporal.io/cloud-sdk/api/resource/v1"
)

func TestResourceStateFromProto(t *testing.T) {
cases := []struct {
in tcloudresourcev1.ResourceState
exp ResourceState
}{
{tcloudresourcev1.ResourceState_RESOURCE_STATE_UNSPECIFIED, ""},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATING, ResourceStateActivating},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVATION_FAILED, ResourceStateActivationFailed},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_ACTIVE, ResourceStateActive},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATING, ResourceStateUpdating},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_UPDATE_FAILED, ResourceStateUpdateFailed},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETING, ResourceStateDeleting},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETE_FAILED, ResourceStateDeleteFailed},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_DELETED, ResourceStateDeleted},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_SUSPENDED, ResourceStateSuspended},
{tcloudresourcev1.ResourceState_RESOURCE_STATE_EXPIRED, ResourceStateExpired},
// Unknown states must map to "" so the enum-validated status patch
// is not rejected.
{tcloudresourcev1.ResourceState(99), ""},
}
for _, tc := range cases {
t.Run(tc.in.String(), func(tt *testing.T) {
// Start from a non-empty state to check that FromProto always
// overwrites it, including with "".
got := ResourceStateActive
got.FromProto(tc.in)
require.Equal(tt, tc.exp, got)
})
}
}
Loading
Loading