Simplify Okta assignment statuses. (#25166)

* Simplify Okta assignment statuses.

The Okta assignment statuses have been simplfieid so that there's only a
status on the Okta assignment object itself and the number of states is
reduced.

* Fix tests, remove unused code.

* Add in Duration for update statuses to prevent changing status too soon.

* Make sure LastTransition is UTC.

* Remove actions in favor of targets, make cleanup time non-nullable.
This commit is contained in:
Michael Wilson
2023-04-26 13:30:10 +00:00
committed by GitHub
parent 5bf72af28a
commit 892883fbcd
20 changed files with 1992 additions and 2358 deletions
+10 -8
View File
@@ -16,9 +16,11 @@ package okta
import (
"context"
"time"
"github.com/gravitational/trace"
"github.com/gravitational/trace/trail"
"google.golang.org/protobuf/types/known/durationpb"
oktapb "github.com/gravitational/teleport/api/gen/proto/go/teleport/okta/v1"
"github.com/gravitational/teleport/api/types"
@@ -152,15 +154,15 @@ func (c *Client) UpdateOktaAssignment(ctx context.Context, assignment types.Okta
return resp, trail.FromGRPC(err)
}
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. If a transition is invalid, it will be logged and the rest of the action statuses
// will be updated if possible.
func (c *Client) UpdateOktaAssignmentActionStatuses(ctx context.Context, name, status string) (types.OktaAssignment, error) {
resp, err := c.grpcClient.UpdateOktaAssignmentActionStatuses(ctx, &oktapb.UpdateOktaAssignmentActionStatusesRequest{
Name: name,
Status: types.OktaAssignmentActionStatusToProto(status),
// UpdateOktaAssignmentStatus will update the status for an Okta assignment if the given time has passed
// since the last transition.
func (c *Client) UpdateOktaAssignmentStatus(ctx context.Context, name, status string, timeHasPassed time.Duration) error {
_, err := c.grpcClient.UpdateOktaAssignmentStatus(ctx, &oktapb.UpdateOktaAssignmentStatusRequest{
Name: name,
Status: types.OktaAssignmentStatusToProto(status),
TimeHasPassed: durationpb.New(timeHasPassed),
})
return resp, trail.FromGRPC(err)
return trail.FromGRPC(err)
}
// DeleteOktaAssignmentremoves the specified Okta assignment resource.
+16 -28
View File
@@ -158,41 +158,29 @@ const (
// SSHRSAType is the string which specifies an "ssh-rsa" formatted keypair
SSHRSAType = "ssh-rsa"
// OktaAssignmentActionStatusPending is represents a pending status for an Okta action.
OktaAssignmentActionStatusPending = "pending"
// OktaAssignmentStatusPending is represents a pending status for an Okta assignment.
OktaAssignmentStatusPending = "pending"
// OktaAssignmentActionStatusProcessing is represents an Okta action which is currently being acted on.
OktaAssignmentActionStatusProcessing = "processing"
// OktaAssignmentStatusProcessing is represents an Okta assignment which is currently being acted on.
OktaAssignmentStatusProcessing = "processing"
// OktaAssignmentActionStatusSuccessful is represents a successfully applied Okta action.
OktaAssignmentActionStatusSuccessful = "successful"
// OktaAssignmentStatusSuccessful is represents a successfully applied Okta assignment.
OktaAssignmentStatusSuccessful = "successful"
// OktaAssignmentActionStatusFailed is represents an Okta action which failed to apply. It will be retried.
OktaAssignmentActionStatusFailed = "failed"
// OktaAssignmentStatusFailed is represents an Okta assignment which failed to apply. It will be retried.
OktaAssignmentStatusFailed = "failed"
// OktaAssignmentActionStatusCleanupPending is represents an Okta action which needs to be cleaned up.
OktaAssignmentActionStatusCleanupPending = "cleanup_pending"
// OktaAssignmentStatusPending is represents a unknown status for an Okta assignment.
OktaAssignmentStatusUnknown = "unknown"
// OktaAssignmentActionStatusCleanupProcessing is represents an Okta action which is currently being cleaned up.
OktaAssignmentActionStatusCleanupProcessing = "cleanup_processing"
// OktaAssignmentTargetApplication is an application target of an Okta assignment.
OktaAssignmentTargetApplication = "application"
// OktaAssignmentActionStatusCleanedUp is represents an Okta action which was cleaned up successfully.
OktaAssignmentActionStatusCleanedUp = "cleaned_up"
// OktaAssignmentActionTargetGroup is a group target of an Okta assignment.
OktaAssignmentTargetGroup = "group"
// OktaAssignmentActionStatusCleanupFailed is represents an Okta action which was not cleaned up successfully. It will not be retried.
OktaAssignmentActionStatusCleanupFailed = "cleanup_failed"
// OktaAssignmentActionStatusPending is represents a unknown status for an Okta action.
OktaAssignmentActionStatusUnknown = "unknown"
// OktaAssignmentActionTargetApplication is an application target of an Okta assignment action.
OktaAssignmentActionTargetApplication = "application"
// OktaAssignmentActionTargetGroup is a group target of an Okta assignment action.
OktaAssignmentActionTargetGroup = "group"
// OktaAssignmentActionTargetUnknown is an unknown target of an Okta assignment action.
OktaAssignmentActionTargetUnknown = "unknown"
// OktaAssignmentTargetUnknown is an unknown target of an Okta assignment.
OktaAssignmentTargetUnknown = "unknown"
)
// SystemConnectors lists the names of the system-reserved connectors.
@@ -24,6 +24,7 @@ import (
types "github.com/gravitational/teleport/api/types"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
durationpb "google.golang.org/protobuf/types/known/durationpb"
emptypb "google.golang.org/protobuf/types/known/emptypb"
reflect "reflect"
sync "sync"
@@ -650,21 +651,23 @@ func (x *UpdateOktaAssignmentRequest) GetAssignment() *types.OktaAssignmentV1 {
return nil
}
// UpdateOktaAssignmentActionStatuses is a request for updating all action statuses in an
// Okta assignment.
type UpdateOktaAssignmentActionStatusesRequest struct {
// UpdateOktaAssignmentStatusRequest is a request for updating an Okta assignment status.
type UpdateOktaAssignmentStatusRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// name is the name of the Okta assignment.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// status is the status to update all actions to.
Status types.OktaAssignmentActionV1_OktaAssignmentActionStatus `protobuf:"varint,2,opt,name=status,proto3,enum=types.OktaAssignmentActionV1_OktaAssignmentActionStatus" json:"status,omitempty"`
// status is the status to update the assignment to.
Status types.OktaAssignmentSpecV1_OktaAssignmentStatus `protobuf:"varint,2,opt,name=status,proto3,enum=types.OktaAssignmentSpecV1_OktaAssignmentStatus" json:"status,omitempty"`
// timeHasPassed is the amount of time that must have passed since the last transition
// in order to set the new transition.
TimeHasPassed *durationpb.Duration `protobuf:"bytes,3,opt,name=time_has_passed,json=timeHasPassed,proto3" json:"time_has_passed,omitempty"`
}
func (x *UpdateOktaAssignmentActionStatusesRequest) Reset() {
*x = UpdateOktaAssignmentActionStatusesRequest{}
func (x *UpdateOktaAssignmentStatusRequest) Reset() {
*x = UpdateOktaAssignmentStatusRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_teleport_okta_v1_okta_service_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -672,13 +675,13 @@ func (x *UpdateOktaAssignmentActionStatusesRequest) Reset() {
}
}
func (x *UpdateOktaAssignmentActionStatusesRequest) String() string {
func (x *UpdateOktaAssignmentStatusRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UpdateOktaAssignmentActionStatusesRequest) ProtoMessage() {}
func (*UpdateOktaAssignmentStatusRequest) ProtoMessage() {}
func (x *UpdateOktaAssignmentActionStatusesRequest) ProtoReflect() protoreflect.Message {
func (x *UpdateOktaAssignmentStatusRequest) ProtoReflect() protoreflect.Message {
mi := &file_teleport_okta_v1_okta_service_proto_msgTypes[12]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -690,23 +693,30 @@ func (x *UpdateOktaAssignmentActionStatusesRequest) ProtoReflect() protoreflect.
return mi.MessageOf(x)
}
// Deprecated: Use UpdateOktaAssignmentActionStatusesRequest.ProtoReflect.Descriptor instead.
func (*UpdateOktaAssignmentActionStatusesRequest) Descriptor() ([]byte, []int) {
// Deprecated: Use UpdateOktaAssignmentStatusRequest.ProtoReflect.Descriptor instead.
func (*UpdateOktaAssignmentStatusRequest) Descriptor() ([]byte, []int) {
return file_teleport_okta_v1_okta_service_proto_rawDescGZIP(), []int{12}
}
func (x *UpdateOktaAssignmentActionStatusesRequest) GetName() string {
func (x *UpdateOktaAssignmentStatusRequest) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *UpdateOktaAssignmentActionStatusesRequest) GetStatus() types.OktaAssignmentActionV1_OktaAssignmentActionStatus {
func (x *UpdateOktaAssignmentStatusRequest) GetStatus() types.OktaAssignmentSpecV1_OktaAssignmentStatus {
if x != nil {
return x.Status
}
return types.OktaAssignmentActionV1_OktaAssignmentActionStatus(0)
return types.OktaAssignmentSpecV1_OktaAssignmentStatus(0)
}
func (x *UpdateOktaAssignmentStatusRequest) GetTimeHasPassed() *durationpb.Duration {
if x != nil {
return x.TimeHasPassed
}
return nil
}
// DeleteOktaAssignmentRequest is the request for deleting an Okta assignment.
@@ -803,7 +813,9 @@ var file_teleport_okta_v1_okta_service_proto_rawDesc = []byte{
0x0a, 0x23, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6f, 0x6b, 0x74, 0x61, 0x2f,
0x76, 0x31, 0x2f, 0x6f, 0x6b, 0x74, 0x61, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e,
0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c,
0x65, 0x67, 0x61, 0x63, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65,
@@ -868,110 +880,112 @@ var file_teleport_okta_v1_okta_service_proto_rawDesc = []byte{
0x74, 0x12, 0x37, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18,
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b,
0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x52, 0x0a,
0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x29, 0x55,
0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xc4, 0x01, 0x0a, 0x21, 0x55,
0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d,
0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65,
0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x06,
0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d,
0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x2e, 0x4f, 0x6b, 0x74, 0x61,
0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x31,
0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69,
0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x21, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b,
0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x32, 0xb1, 0x0a, 0x0a, 0x0b, 0x4f, 0x6b, 0x74, 0x61, 0x53, 0x65, 0x72,
0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x65,
0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c,
0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c,
0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65,
0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73,
0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f,
0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2a, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75,
0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65,
0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65,
0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c,
0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72,
0x65, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75,
0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65,
0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65,
0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c,
0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70,
0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75,
0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65,
0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65,
0x56, 0x31, 0x12, 0x5d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61,
0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c,
0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75,
0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x12, 0x65, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b,
0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d,
0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74,
0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12,
0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e,
0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67,
0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d,
0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11,
0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74,
0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69,
0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e,
0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65,
0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d,
0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74,
0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x56,
0x31, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x41,
0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x61, 0x73, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65,
0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, 0x73, 0x73, 0x65,
0x64, 0x22, 0x31, 0x0a, 0x1b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41,
0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c,
0x6c, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xa0, 0x0a, 0x0a, 0x0b, 0x4f, 0x6b, 0x74, 0x61,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x72, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f,
0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x2c,
0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76,
0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69,
0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e,
0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d,
0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76,
0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69,
0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e,
0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x7a, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x3b, 0x2e, 0x74,
0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74,
0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x74,
0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65,
0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
0x56, 0x31, 0x12, 0x5d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61,
0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c,
0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65,
0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65,
0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x12, 0x65, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b,
0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x2e,
0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75,
0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x47,
0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65,
0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61,
0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72,
0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
0x75, 0x6c, 0x65, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f,
0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73,
0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72,
0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
0x75, 0x6c, 0x65, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f,
0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72,
0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
0x75, 0x6c, 0x65, 0x56, 0x31, 0x12, 0x5d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f,
0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x2d, 0x2e,
0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31,
0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72,
0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
0x6d, 0x70, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c,
0x6c, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73,
0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61,
0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b, 0x74,
0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x72, 0x0a, 0x13, 0x4c,
0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x73, 0x12, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b,
0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73,
0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x4c, 0x5a, 0x4a, 0x67, 0x69, 0x74, 0x68,
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70,
0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74,
0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6f, 0x6b, 0x74, 0x61, 0x2f, 0x76, 0x31, 0x3b,
0x6f, 0x6b, 0x74, 0x61, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x1a, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61,
0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69,
0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
0x58, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e,
0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x6b, 0x74, 0x61, 0x41,
0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73,
0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x43, 0x72, 0x65,
0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74,
0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41,
0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73,
0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x14, 0x55, 0x70, 0x64,
0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74,
0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41,
0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73,
0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x12, 0x69, 0x0a, 0x1a, 0x55, 0x70, 0x64,
0x61, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e,
0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f,
0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53,
0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
0x6d, 0x70, 0x74, 0x79, 0x12, 0x5d, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b,
0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x74,
0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e, 0x76, 0x31, 0x2e,
0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e,
0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
0x70, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c,
0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12,
0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6f, 0x6b, 0x74, 0x61, 0x2e,
0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x4f, 0x6b, 0x74, 0x61,
0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x4c, 0x5a, 0x4a, 0x67, 0x69,
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6f, 0x6b, 0x74, 0x61, 0x2f, 0x76,
0x31, 0x3b, 0x6f, 0x6b, 0x74, 0x61, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -988,25 +1002,26 @@ func file_teleport_okta_v1_okta_service_proto_rawDescGZIP() []byte {
var file_teleport_okta_v1_okta_service_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
var file_teleport_okta_v1_okta_service_proto_goTypes = []interface{}{
(*ListOktaImportRulesRequest)(nil), // 0: teleport.okta.v1.ListOktaImportRulesRequest
(*ListOktaImportRulesResponse)(nil), // 1: teleport.okta.v1.ListOktaImportRulesResponse
(*GetOktaImportRuleRequest)(nil), // 2: teleport.okta.v1.GetOktaImportRuleRequest
(*CreateOktaImportRuleRequest)(nil), // 3: teleport.okta.v1.CreateOktaImportRuleRequest
(*UpdateOktaImportRuleRequest)(nil), // 4: teleport.okta.v1.UpdateOktaImportRuleRequest
(*DeleteOktaImportRuleRequest)(nil), // 5: teleport.okta.v1.DeleteOktaImportRuleRequest
(*DeleteAllOktaImportRulesRequest)(nil), // 6: teleport.okta.v1.DeleteAllOktaImportRulesRequest
(*ListOktaAssignmentsRequest)(nil), // 7: teleport.okta.v1.ListOktaAssignmentsRequest
(*ListOktaAssignmentsResponse)(nil), // 8: teleport.okta.v1.ListOktaAssignmentsResponse
(*GetOktaAssignmentRequest)(nil), // 9: teleport.okta.v1.GetOktaAssignmentRequest
(*CreateOktaAssignmentRequest)(nil), // 10: teleport.okta.v1.CreateOktaAssignmentRequest
(*UpdateOktaAssignmentRequest)(nil), // 11: teleport.okta.v1.UpdateOktaAssignmentRequest
(*UpdateOktaAssignmentActionStatusesRequest)(nil), // 12: teleport.okta.v1.UpdateOktaAssignmentActionStatusesRequest
(*DeleteOktaAssignmentRequest)(nil), // 13: teleport.okta.v1.DeleteOktaAssignmentRequest
(*DeleteAllOktaAssignmentsRequest)(nil), // 14: teleport.okta.v1.DeleteAllOktaAssignmentsRequest
(*types.OktaImportRuleV1)(nil), // 15: types.OktaImportRuleV1
(*types.OktaAssignmentV1)(nil), // 16: types.OktaAssignmentV1
(types.OktaAssignmentActionV1_OktaAssignmentActionStatus)(0), // 17: types.OktaAssignmentActionV1.OktaAssignmentActionStatus
(*emptypb.Empty)(nil), // 18: google.protobuf.Empty
(*ListOktaImportRulesRequest)(nil), // 0: teleport.okta.v1.ListOktaImportRulesRequest
(*ListOktaImportRulesResponse)(nil), // 1: teleport.okta.v1.ListOktaImportRulesResponse
(*GetOktaImportRuleRequest)(nil), // 2: teleport.okta.v1.GetOktaImportRuleRequest
(*CreateOktaImportRuleRequest)(nil), // 3: teleport.okta.v1.CreateOktaImportRuleRequest
(*UpdateOktaImportRuleRequest)(nil), // 4: teleport.okta.v1.UpdateOktaImportRuleRequest
(*DeleteOktaImportRuleRequest)(nil), // 5: teleport.okta.v1.DeleteOktaImportRuleRequest
(*DeleteAllOktaImportRulesRequest)(nil), // 6: teleport.okta.v1.DeleteAllOktaImportRulesRequest
(*ListOktaAssignmentsRequest)(nil), // 7: teleport.okta.v1.ListOktaAssignmentsRequest
(*ListOktaAssignmentsResponse)(nil), // 8: teleport.okta.v1.ListOktaAssignmentsResponse
(*GetOktaAssignmentRequest)(nil), // 9: teleport.okta.v1.GetOktaAssignmentRequest
(*CreateOktaAssignmentRequest)(nil), // 10: teleport.okta.v1.CreateOktaAssignmentRequest
(*UpdateOktaAssignmentRequest)(nil), // 11: teleport.okta.v1.UpdateOktaAssignmentRequest
(*UpdateOktaAssignmentStatusRequest)(nil), // 12: teleport.okta.v1.UpdateOktaAssignmentStatusRequest
(*DeleteOktaAssignmentRequest)(nil), // 13: teleport.okta.v1.DeleteOktaAssignmentRequest
(*DeleteAllOktaAssignmentsRequest)(nil), // 14: teleport.okta.v1.DeleteAllOktaAssignmentsRequest
(*types.OktaImportRuleV1)(nil), // 15: types.OktaImportRuleV1
(*types.OktaAssignmentV1)(nil), // 16: types.OktaAssignmentV1
(types.OktaAssignmentSpecV1_OktaAssignmentStatus)(0), // 17: types.OktaAssignmentSpecV1.OktaAssignmentStatus
(*durationpb.Duration)(nil), // 18: google.protobuf.Duration
(*emptypb.Empty)(nil), // 19: google.protobuf.Empty
}
var file_teleport_okta_v1_okta_service_proto_depIdxs = []int32{
15, // 0: teleport.okta.v1.ListOktaImportRulesResponse.import_rules:type_name -> types.OktaImportRuleV1
@@ -1015,38 +1030,39 @@ var file_teleport_okta_v1_okta_service_proto_depIdxs = []int32{
16, // 3: teleport.okta.v1.ListOktaAssignmentsResponse.assignments:type_name -> types.OktaAssignmentV1
16, // 4: teleport.okta.v1.CreateOktaAssignmentRequest.assignment:type_name -> types.OktaAssignmentV1
16, // 5: teleport.okta.v1.UpdateOktaAssignmentRequest.assignment:type_name -> types.OktaAssignmentV1
17, // 6: teleport.okta.v1.UpdateOktaAssignmentActionStatusesRequest.status:type_name -> types.OktaAssignmentActionV1.OktaAssignmentActionStatus
0, // 7: teleport.okta.v1.OktaService.ListOktaImportRules:input_type -> teleport.okta.v1.ListOktaImportRulesRequest
2, // 8: teleport.okta.v1.OktaService.GetOktaImportRule:input_type -> teleport.okta.v1.GetOktaImportRuleRequest
3, // 9: teleport.okta.v1.OktaService.CreateOktaImportRule:input_type -> teleport.okta.v1.CreateOktaImportRuleRequest
4, // 10: teleport.okta.v1.OktaService.UpdateOktaImportRule:input_type -> teleport.okta.v1.UpdateOktaImportRuleRequest
5, // 11: teleport.okta.v1.OktaService.DeleteOktaImportRule:input_type -> teleport.okta.v1.DeleteOktaImportRuleRequest
6, // 12: teleport.okta.v1.OktaService.DeleteAllOktaImportRules:input_type -> teleport.okta.v1.DeleteAllOktaImportRulesRequest
7, // 13: teleport.okta.v1.OktaService.ListOktaAssignments:input_type -> teleport.okta.v1.ListOktaAssignmentsRequest
9, // 14: teleport.okta.v1.OktaService.GetOktaAssignment:input_type -> teleport.okta.v1.GetOktaAssignmentRequest
10, // 15: teleport.okta.v1.OktaService.CreateOktaAssignment:input_type -> teleport.okta.v1.CreateOktaAssignmentRequest
11, // 16: teleport.okta.v1.OktaService.UpdateOktaAssignment:input_type -> teleport.okta.v1.UpdateOktaAssignmentRequest
12, // 17: teleport.okta.v1.OktaService.UpdateOktaAssignmentActionStatuses:input_type -> teleport.okta.v1.UpdateOktaAssignmentActionStatusesRequest
13, // 18: teleport.okta.v1.OktaService.DeleteOktaAssignment:input_type -> teleport.okta.v1.DeleteOktaAssignmentRequest
14, // 19: teleport.okta.v1.OktaService.DeleteAllOktaAssignments:input_type -> teleport.okta.v1.DeleteAllOktaAssignmentsRequest
1, // 20: teleport.okta.v1.OktaService.ListOktaImportRules:output_type -> teleport.okta.v1.ListOktaImportRulesResponse
15, // 21: teleport.okta.v1.OktaService.GetOktaImportRule:output_type -> types.OktaImportRuleV1
15, // 22: teleport.okta.v1.OktaService.CreateOktaImportRule:output_type -> types.OktaImportRuleV1
15, // 23: teleport.okta.v1.OktaService.UpdateOktaImportRule:output_type -> types.OktaImportRuleV1
18, // 24: teleport.okta.v1.OktaService.DeleteOktaImportRule:output_type -> google.protobuf.Empty
18, // 25: teleport.okta.v1.OktaService.DeleteAllOktaImportRules:output_type -> google.protobuf.Empty
8, // 26: teleport.okta.v1.OktaService.ListOktaAssignments:output_type -> teleport.okta.v1.ListOktaAssignmentsResponse
16, // 27: teleport.okta.v1.OktaService.GetOktaAssignment:output_type -> types.OktaAssignmentV1
16, // 28: teleport.okta.v1.OktaService.CreateOktaAssignment:output_type -> types.OktaAssignmentV1
16, // 29: teleport.okta.v1.OktaService.UpdateOktaAssignment:output_type -> types.OktaAssignmentV1
16, // 30: teleport.okta.v1.OktaService.UpdateOktaAssignmentActionStatuses:output_type -> types.OktaAssignmentV1
18, // 31: teleport.okta.v1.OktaService.DeleteOktaAssignment:output_type -> google.protobuf.Empty
18, // 32: teleport.okta.v1.OktaService.DeleteAllOktaAssignments:output_type -> google.protobuf.Empty
20, // [20:33] is the sub-list for method output_type
7, // [7:20] is the sub-list for method input_type
7, // [7:7] is the sub-list for extension type_name
7, // [7:7] is the sub-list for extension extendee
0, // [0:7] is the sub-list for field type_name
17, // 6: teleport.okta.v1.UpdateOktaAssignmentStatusRequest.status:type_name -> types.OktaAssignmentSpecV1.OktaAssignmentStatus
18, // 7: teleport.okta.v1.UpdateOktaAssignmentStatusRequest.time_has_passed:type_name -> google.protobuf.Duration
0, // 8: teleport.okta.v1.OktaService.ListOktaImportRules:input_type -> teleport.okta.v1.ListOktaImportRulesRequest
2, // 9: teleport.okta.v1.OktaService.GetOktaImportRule:input_type -> teleport.okta.v1.GetOktaImportRuleRequest
3, // 10: teleport.okta.v1.OktaService.CreateOktaImportRule:input_type -> teleport.okta.v1.CreateOktaImportRuleRequest
4, // 11: teleport.okta.v1.OktaService.UpdateOktaImportRule:input_type -> teleport.okta.v1.UpdateOktaImportRuleRequest
5, // 12: teleport.okta.v1.OktaService.DeleteOktaImportRule:input_type -> teleport.okta.v1.DeleteOktaImportRuleRequest
6, // 13: teleport.okta.v1.OktaService.DeleteAllOktaImportRules:input_type -> teleport.okta.v1.DeleteAllOktaImportRulesRequest
7, // 14: teleport.okta.v1.OktaService.ListOktaAssignments:input_type -> teleport.okta.v1.ListOktaAssignmentsRequest
9, // 15: teleport.okta.v1.OktaService.GetOktaAssignment:input_type -> teleport.okta.v1.GetOktaAssignmentRequest
10, // 16: teleport.okta.v1.OktaService.CreateOktaAssignment:input_type -> teleport.okta.v1.CreateOktaAssignmentRequest
11, // 17: teleport.okta.v1.OktaService.UpdateOktaAssignment:input_type -> teleport.okta.v1.UpdateOktaAssignmentRequest
12, // 18: teleport.okta.v1.OktaService.UpdateOktaAssignmentStatus:input_type -> teleport.okta.v1.UpdateOktaAssignmentStatusRequest
13, // 19: teleport.okta.v1.OktaService.DeleteOktaAssignment:input_type -> teleport.okta.v1.DeleteOktaAssignmentRequest
14, // 20: teleport.okta.v1.OktaService.DeleteAllOktaAssignments:input_type -> teleport.okta.v1.DeleteAllOktaAssignmentsRequest
1, // 21: teleport.okta.v1.OktaService.ListOktaImportRules:output_type -> teleport.okta.v1.ListOktaImportRulesResponse
15, // 22: teleport.okta.v1.OktaService.GetOktaImportRule:output_type -> types.OktaImportRuleV1
15, // 23: teleport.okta.v1.OktaService.CreateOktaImportRule:output_type -> types.OktaImportRuleV1
15, // 24: teleport.okta.v1.OktaService.UpdateOktaImportRule:output_type -> types.OktaImportRuleV1
19, // 25: teleport.okta.v1.OktaService.DeleteOktaImportRule:output_type -> google.protobuf.Empty
19, // 26: teleport.okta.v1.OktaService.DeleteAllOktaImportRules:output_type -> google.protobuf.Empty
8, // 27: teleport.okta.v1.OktaService.ListOktaAssignments:output_type -> teleport.okta.v1.ListOktaAssignmentsResponse
16, // 28: teleport.okta.v1.OktaService.GetOktaAssignment:output_type -> types.OktaAssignmentV1
16, // 29: teleport.okta.v1.OktaService.CreateOktaAssignment:output_type -> types.OktaAssignmentV1
16, // 30: teleport.okta.v1.OktaService.UpdateOktaAssignment:output_type -> types.OktaAssignmentV1
19, // 31: teleport.okta.v1.OktaService.UpdateOktaAssignmentStatus:output_type -> google.protobuf.Empty
19, // 32: teleport.okta.v1.OktaService.DeleteOktaAssignment:output_type -> google.protobuf.Empty
19, // 33: teleport.okta.v1.OktaService.DeleteAllOktaAssignments:output_type -> google.protobuf.Empty
21, // [21:34] is the sub-list for method output_type
8, // [8:21] is the sub-list for method input_type
8, // [8:8] is the sub-list for extension type_name
8, // [8:8] is the sub-list for extension extendee
0, // [0:8] is the sub-list for field type_name
}
func init() { file_teleport_okta_v1_okta_service_proto_init() }
@@ -1200,7 +1216,7 @@ func file_teleport_okta_v1_okta_service_proto_init() {
}
}
file_teleport_okta_v1_okta_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*UpdateOktaAssignmentActionStatusesRequest); i {
switch v := v.(*UpdateOktaAssignmentStatusRequest); i {
case 0:
return &v.state
case 1:
@@ -35,19 +35,19 @@ import (
const _ = grpc.SupportPackageIsVersion7
const (
OktaService_ListOktaImportRules_FullMethodName = "/teleport.okta.v1.OktaService/ListOktaImportRules"
OktaService_GetOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/GetOktaImportRule"
OktaService_CreateOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/CreateOktaImportRule"
OktaService_UpdateOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaImportRule"
OktaService_DeleteOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/DeleteOktaImportRule"
OktaService_DeleteAllOktaImportRules_FullMethodName = "/teleport.okta.v1.OktaService/DeleteAllOktaImportRules"
OktaService_ListOktaAssignments_FullMethodName = "/teleport.okta.v1.OktaService/ListOktaAssignments"
OktaService_GetOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/GetOktaAssignment"
OktaService_CreateOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/CreateOktaAssignment"
OktaService_UpdateOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaAssignment"
OktaService_UpdateOktaAssignmentActionStatuses_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaAssignmentActionStatuses"
OktaService_DeleteOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/DeleteOktaAssignment"
OktaService_DeleteAllOktaAssignments_FullMethodName = "/teleport.okta.v1.OktaService/DeleteAllOktaAssignments"
OktaService_ListOktaImportRules_FullMethodName = "/teleport.okta.v1.OktaService/ListOktaImportRules"
OktaService_GetOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/GetOktaImportRule"
OktaService_CreateOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/CreateOktaImportRule"
OktaService_UpdateOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaImportRule"
OktaService_DeleteOktaImportRule_FullMethodName = "/teleport.okta.v1.OktaService/DeleteOktaImportRule"
OktaService_DeleteAllOktaImportRules_FullMethodName = "/teleport.okta.v1.OktaService/DeleteAllOktaImportRules"
OktaService_ListOktaAssignments_FullMethodName = "/teleport.okta.v1.OktaService/ListOktaAssignments"
OktaService_GetOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/GetOktaAssignment"
OktaService_CreateOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/CreateOktaAssignment"
OktaService_UpdateOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaAssignment"
OktaService_UpdateOktaAssignmentStatus_FullMethodName = "/teleport.okta.v1.OktaService/UpdateOktaAssignmentStatus"
OktaService_DeleteOktaAssignment_FullMethodName = "/teleport.okta.v1.OktaService/DeleteOktaAssignment"
OktaService_DeleteAllOktaAssignments_FullMethodName = "/teleport.okta.v1.OktaService/DeleteAllOktaAssignments"
)
// OktaServiceClient is the client API for OktaService service.
@@ -74,9 +74,8 @@ type OktaServiceClient interface {
CreateOktaAssignment(ctx context.Context, in *CreateOktaAssignmentRequest, opts ...grpc.CallOption) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignment updates an existing Okta assignment resource.
UpdateOktaAssignment(ctx context.Context, in *UpdateOktaAssignmentRequest, opts ...grpc.CallOption) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. Invalid transitions will be skipped.
UpdateOktaAssignmentActionStatuses(ctx context.Context, in *UpdateOktaAssignmentActionStatusesRequest, opts ...grpc.CallOption) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignmentStatus will update the status for an Okta assignment.
UpdateOktaAssignmentStatus(ctx context.Context, in *UpdateOktaAssignmentStatusRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// DeleteOktaAssignment removes the specified Okta assignment resource.
DeleteOktaAssignment(ctx context.Context, in *DeleteOktaAssignmentRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
// DeleteAllOktaAssignments removes all Okta assignments.
@@ -181,9 +180,9 @@ func (c *oktaServiceClient) UpdateOktaAssignment(ctx context.Context, in *Update
return out, nil
}
func (c *oktaServiceClient) UpdateOktaAssignmentActionStatuses(ctx context.Context, in *UpdateOktaAssignmentActionStatusesRequest, opts ...grpc.CallOption) (*types.OktaAssignmentV1, error) {
out := new(types.OktaAssignmentV1)
err := c.cc.Invoke(ctx, OktaService_UpdateOktaAssignmentActionStatuses_FullMethodName, in, out, opts...)
func (c *oktaServiceClient) UpdateOktaAssignmentStatus(ctx context.Context, in *UpdateOktaAssignmentStatusRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, OktaService_UpdateOktaAssignmentStatus_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
@@ -232,9 +231,8 @@ type OktaServiceServer interface {
CreateOktaAssignment(context.Context, *CreateOktaAssignmentRequest) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignment updates an existing Okta assignment resource.
UpdateOktaAssignment(context.Context, *UpdateOktaAssignmentRequest) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. Invalid transitions will be skipped.
UpdateOktaAssignmentActionStatuses(context.Context, *UpdateOktaAssignmentActionStatusesRequest) (*types.OktaAssignmentV1, error)
// UpdateOktaAssignmentStatus will update the status for an Okta assignment.
UpdateOktaAssignmentStatus(context.Context, *UpdateOktaAssignmentStatusRequest) (*emptypb.Empty, error)
// DeleteOktaAssignment removes the specified Okta assignment resource.
DeleteOktaAssignment(context.Context, *DeleteOktaAssignmentRequest) (*emptypb.Empty, error)
// DeleteAllOktaAssignments removes all Okta assignments.
@@ -276,8 +274,8 @@ func (UnimplementedOktaServiceServer) CreateOktaAssignment(context.Context, *Cre
func (UnimplementedOktaServiceServer) UpdateOktaAssignment(context.Context, *UpdateOktaAssignmentRequest) (*types.OktaAssignmentV1, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateOktaAssignment not implemented")
}
func (UnimplementedOktaServiceServer) UpdateOktaAssignmentActionStatuses(context.Context, *UpdateOktaAssignmentActionStatusesRequest) (*types.OktaAssignmentV1, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateOktaAssignmentActionStatuses not implemented")
func (UnimplementedOktaServiceServer) UpdateOktaAssignmentStatus(context.Context, *UpdateOktaAssignmentStatusRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateOktaAssignmentStatus not implemented")
}
func (UnimplementedOktaServiceServer) DeleteOktaAssignment(context.Context, *DeleteOktaAssignmentRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteOktaAssignment not implemented")
@@ -478,20 +476,20 @@ func _OktaService_UpdateOktaAssignment_Handler(srv interface{}, ctx context.Cont
return interceptor(ctx, in, info, handler)
}
func _OktaService_UpdateOktaAssignmentActionStatuses_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateOktaAssignmentActionStatusesRequest)
func _OktaService_UpdateOktaAssignmentStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateOktaAssignmentStatusRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(OktaServiceServer).UpdateOktaAssignmentActionStatuses(ctx, in)
return srv.(OktaServiceServer).UpdateOktaAssignmentStatus(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: OktaService_UpdateOktaAssignmentActionStatuses_FullMethodName,
FullMethod: OktaService_UpdateOktaAssignmentStatus_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(OktaServiceServer).UpdateOktaAssignmentActionStatuses(ctx, req.(*UpdateOktaAssignmentActionStatusesRequest))
return srv.(OktaServiceServer).UpdateOktaAssignmentStatus(ctx, req.(*UpdateOktaAssignmentStatusRequest))
}
return interceptor(ctx, in, info, handler)
}
@@ -580,8 +578,8 @@ var OktaService_ServiceDesc = grpc.ServiceDesc{
Handler: _OktaService_UpdateOktaAssignment_Handler,
},
{
MethodName: "UpdateOktaAssignmentActionStatuses",
Handler: _OktaService_UpdateOktaAssignmentActionStatuses_Handler,
MethodName: "UpdateOktaAssignmentStatus",
Handler: _OktaService_UpdateOktaAssignmentStatus_Handler,
},
{
MethodName: "DeleteOktaAssignment",
+25 -32
View File
@@ -5298,56 +5298,49 @@ message OktaAssignmentV1 {
message OktaAssignmentSpecV1 {
// User is the user that these actions will be applied to.
string User = 1 [(gogoproto.jsontag) = "user"];
// Actions is a list of Okta actions to take on a user.
repeated OktaAssignmentActionV1 Actions = 2 [(gogoproto.jsontag) = "actions"];
// Targets is a list of Okta targets to take on a user.
repeated OktaAssignmentTargetV1 Targets = 2 [(gogoproto.jsontag) = "targets"];
// CleanupTime is an optional field that notes when the assignment should be cleaned up.
// If absent, the assignment will never be cleaned up.
google.protobuf.Timestamp CleanupTime = 3 [
(gogoproto.jsontag) = "cleanup_time",
(gogoproto.stdtime) = true,
(gogoproto.nullable) = true
(gogoproto.nullable) = false
];
}
// OktaAssignmentActionV1 is a Okta assignment action.
message OktaAssignmentActionV1 {
// OktaAssignmentStatus represents the status of an action in an Okta assignment.
enum OktaAssignmentActionStatus {
// Status is the status of the assignment.
OktaAssignmentStatus status = 4 [(gogoproto.jsontag) = "status"];
// OktaAssignmentStatus represents the status of an Okta assignment.
enum OktaAssignmentStatus {
// UNKNOWN indicates the status is not set.
UNKNOWN = 0;
// PENDING indicates the action has not yet been applied.
PENDING = 1;
// SUCCESSFUL indicates the action was applied successfully.
SUCCESSFUL = 2;
// FAILED indicates the action was not applied successfully. It will be retried.
FAILED = 3;
// CLEANED_UP indicates the action was cleaned up successfully.
CLEANED_UP = 4;
// CLEANUP_FAILED indicates the action was not cleaned up successfully. It will not be retried.
CLEANUP_FAILED = 5;
// PROCESSSING indicates that the assignment is being applied.
PROCESSING = 6;
// CLEANUP_PENDING indicates the action needs to be cleaned up.
CLEANUP_PENDING = 7;
// CLEANUP_PROCESSING indicates the action is being cleaned up.
CLEANUP_PROCESSING = 8;
PROCESSING = 2;
// SUCCESSFUL indicates the action was applied successfully.
SUCCESSFUL = 3;
// FAILED indicates the action was not applied successfully. It will be retried.
FAILED = 4;
}
// Status is the status of the action.
OktaAssignmentActionStatus status = 1 [(gogoproto.jsontag) = "status"];
// Target is the target of the assignment action.
OktaAssignmentActionTargetV1 target = 2 [(gogoproto.jsontag) = "target"];
// LastTransition is an optional field that notes when the last state transition
// occurred for this action. If absent, this object has never transitioned.
google.protobuf.Timestamp LastTransition = 3 [
google.protobuf.Timestamp LastTransition = 5 [
(gogoproto.jsontag) = "last_transition",
(gogoproto.stdtime) = true,
(gogoproto.nullable) = false
];
// Finalized is set when the assignment has been properly cleaned up.
bool Finalized = 6 [(gogoproto.jsontag) = "finalized"];
}
// OktaAssignmentActionTargetV1 is the target of an Okta assignment action.
message OktaAssignmentActionTargetV1 {
// OktaAssignmentActionTargetType is the type of Okta object that an action is targeting.
enum OktaAssignmentActionTargetType {
// OktaAssignmentTargetV1 is a target of an Okta assignment.
message OktaAssignmentTargetV1 {
// OktaAssignmentTargetType is the type of Okta object that an assignment is targeting.
enum OktaAssignmentTargetType {
// UNKNOWN indicates the target is unknown.
UNKNOWN = 0;
// APPLICATION indicates the target is an application.
@@ -5356,8 +5349,8 @@ message OktaAssignmentActionTargetV1 {
GROUP = 2;
}
// Type is the type of Okta resource this assignment action is targeting.
OktaAssignmentActionTargetType type = 1 [(gogoproto.jsontag) = "type"];
// Type is the type of Okta resource this assignment is targeting.
OktaAssignmentTargetType type = 1 [(gogoproto.jsontag) = "type"];
// ID is the ID of the Okta resource that's being targeted.
string id = 2 [(gogoproto.jsontag) = "id"];
}
+10 -8
View File
@@ -16,6 +16,7 @@ syntax = "proto3";
package teleport.okta.v1;
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "teleport/legacy/types/types.proto";
@@ -44,9 +45,8 @@ service OktaService {
rpc CreateOktaAssignment(CreateOktaAssignmentRequest) returns (types.OktaAssignmentV1);
// UpdateOktaAssignment updates an existing Okta assignment resource.
rpc UpdateOktaAssignment(UpdateOktaAssignmentRequest) returns (types.OktaAssignmentV1);
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. Invalid transitions will be skipped.
rpc UpdateOktaAssignmentActionStatuses(UpdateOktaAssignmentActionStatusesRequest) returns (types.OktaAssignmentV1);
// UpdateOktaAssignmentStatus will update the status for an Okta assignment.
rpc UpdateOktaAssignmentStatus(UpdateOktaAssignmentStatusRequest) returns (google.protobuf.Empty);
// DeleteOktaAssignment removes the specified Okta assignment resource.
rpc DeleteOktaAssignment(DeleteOktaAssignmentRequest) returns (google.protobuf.Empty);
// DeleteAllOktaAssignments removes all Okta assignments.
@@ -134,13 +134,15 @@ message UpdateOktaAssignmentRequest {
types.OktaAssignmentV1 assignment = 1;
}
// UpdateOktaAssignmentActionStatuses is a request for updating all action statuses in an
// Okta assignment.
message UpdateOktaAssignmentActionStatusesRequest {
// UpdateOktaAssignmentStatusRequest is a request for updating an Okta assignment status.
message UpdateOktaAssignmentStatusRequest {
// name is the name of the Okta assignment.
string name = 1;
// status is the status to update all actions to.
types.OktaAssignmentActionV1.OktaAssignmentActionStatus status = 2;
// status is the status to update the assignment to.
types.OktaAssignmentSpecV1.OktaAssignmentStatus status = 2;
// timeHasPassed is the amount of time that must have passed since the last transition
// in order to set the new transition.
google.protobuf.Duration time_has_passed = 3;
}
// DeleteOktaAssignmentRequest is the request for deleting an Okta assignment.
+169 -181
View File
@@ -181,10 +181,24 @@ type OktaAssignment interface {
SetMetadata(metadata Metadata)
// GetUser will return the user that the Okta assignment actions applies to.
GetUser() string
// GetActions will return the list of actions that will be performed as part of this assignment.
GetActions() []OktaAssignmentAction
// GetTargets will return the list of targets that will be assigned as part of this assignment.
GetTargets() []OktaAssignmentTarget
// GetCleanupTime will return the optional time that the assignment should be cleaned up.
GetCleanupTime() *time.Time
GetCleanupTime() time.Time
// SetCleanupTime will set the cleanup time.
SetCleanupTime(time.Time)
// GetStatus gets the status of the assignment.
GetStatus() string
// SetStatus sets the status of the eassignment. Only allows valid transitions.
SetStatus(status string) error
// SetLastTransition sets the last transition time.
SetLastTransition(time.Time)
// GetLastTransition returns the time that the action last transitioned.
GetLastTransition() time.Time
// IsFinalized returns the finalized state.
IsFinalized() bool
// SetFinalized sets the finalized state
SetFinalized(bool)
// Copy returns a copy of this Okta assignment resource.
Copy() OktaAssignment
}
@@ -213,22 +227,114 @@ func (o *OktaAssignmentV1) GetUser() string {
return o.Spec.User
}
// GetActions returns the actions associated with the Okta assignment.
func (o *OktaAssignmentV1) GetActions() []OktaAssignmentAction {
actions := make([]OktaAssignmentAction, len(o.Spec.Actions))
// GetTargets returns the targets associated with the Okta assignment.
func (o *OktaAssignmentV1) GetTargets() []OktaAssignmentTarget {
targets := make([]OktaAssignmentTarget, len(o.Spec.Targets))
for i, action := range o.Spec.Actions {
actions[i] = action
for i, target := range o.Spec.Targets {
targets[i] = target
}
return actions
return targets
}
// GetCleanupTime will return the optional time that the assignment should be cleaned up.
func (o *OktaAssignmentV1) GetCleanupTime() *time.Time {
func (o *OktaAssignmentV1) GetCleanupTime() time.Time {
return o.Spec.CleanupTime
}
// SetCleanupTime will set the cleanup time.
func (o *OktaAssignmentV1) SetCleanupTime(cleanupTime time.Time) {
o.Spec.CleanupTime = cleanupTime.UTC()
}
// GetStatus gets the status of the assignment.
func (o *OktaAssignmentV1) GetStatus() string {
switch o.Spec.Status {
case OktaAssignmentSpecV1_PENDING:
return constants.OktaAssignmentStatusPending
case OktaAssignmentSpecV1_PROCESSING:
return constants.OktaAssignmentStatusProcessing
case OktaAssignmentSpecV1_SUCCESSFUL:
return constants.OktaAssignmentStatusSuccessful
case OktaAssignmentSpecV1_FAILED:
return constants.OktaAssignmentStatusFailed
default:
return constants.OktaAssignmentStatusUnknown
}
}
// SetStatus sets the status of the eassignment. Only allows valid transitions.
//
// Valid transitions are:
// * PENDING -> (PROCESSING)
// * PROCESSING -> (SUCCESSFUL, FAILED, PROCESSING)
// * SUCCESSFUL -> (PROCESSING)
// * FAILED -> (PROCESSING)
func (o *OktaAssignmentV1) SetStatus(status string) error {
invalidTransition := false
switch o.Spec.Status {
case OktaAssignmentSpecV1_PENDING:
switch status {
case constants.OktaAssignmentStatusProcessing:
default:
invalidTransition = true
}
case OktaAssignmentSpecV1_PROCESSING:
switch status {
case constants.OktaAssignmentStatusProcessing:
case constants.OktaAssignmentStatusSuccessful:
case constants.OktaAssignmentStatusFailed:
default:
invalidTransition = true
}
case OktaAssignmentSpecV1_SUCCESSFUL:
switch status {
case constants.OktaAssignmentStatusProcessing:
default:
invalidTransition = true
}
case OktaAssignmentSpecV1_FAILED:
switch status {
case constants.OktaAssignmentStatusProcessing:
default:
invalidTransition = true
}
case OktaAssignmentSpecV1_UNKNOWN:
// All transitions are allowed from UNKNOWN.
default:
invalidTransition = true
}
if invalidTransition {
return trace.BadParameter("invalid transition: %s -> %s", o.GetStatus(), status)
}
o.Spec.Status = OktaAssignmentStatusToProto(status)
return nil
}
// SetLastTransition sets the last transition time.
func (o *OktaAssignmentV1) SetLastTransition(time time.Time) {
o.Spec.LastTransition = time.UTC()
}
// GetLastTransition returns the optional time that the action last transitioned.
func (o *OktaAssignmentV1) GetLastTransition() time.Time {
return o.Spec.LastTransition
}
// IsFinalized returns the finalized state.
func (o *OktaAssignmentV1) IsFinalized() bool {
return o.Spec.Finalized
}
// SetFinalized sets the finalized state
func (o *OktaAssignmentV1) SetFinalized(finalized bool) {
o.Spec.Finalized = finalized
}
// Copy returns a copy of this Okta assignment resource.
func (o *OktaAssignmentV1) Copy() OktaAssignment {
return proto.Clone(o).(*OktaAssignmentV1)
@@ -264,192 +370,40 @@ func (o *OktaAssignmentV1) CheckAndSetDefaults() error {
return trace.BadParameter("user must not be empty")
}
if len(o.Spec.Actions) == 0 {
return trace.BadParameter("actions is empty")
if len(o.Spec.Targets) == 0 {
return trace.BadParameter("targets is empty")
}
if o.Spec.CleanupTime != nil {
utcTime := o.Spec.CleanupTime.UTC()
o.Spec.CleanupTime = &utcTime
}
for _, action := range o.Spec.Actions {
action.LastTransition = action.LastTransition.UTC()
}
// Make sure the times are UTC so that Copy() works properly.
o.Spec.CleanupTime = o.Spec.CleanupTime.UTC()
o.Spec.LastTransition = o.Spec.LastTransition.UTC()
return nil
}
// OktaAssignmentAction is an individual action to apply to an Okta assignment.
type OktaAssignmentAction interface {
// GetStatus returns the current status of the action.
GetStatus() string
// SetStatus sets the status of the action. Only allows valid transitions.
//
// Valid transitions are:
// * PENDING -> (PROCESSING, CLEANUP_PENDING)
// * PROCESSING -> (SUCCESSFUL, FAILED, CLEANUP_PENDING)
// * SUCCESSFUL -> (CLEANUP_PENDING, CLEANUP_PROCESSING)
// * FAILED -> (PENDING, CLEANUP_PENDING, CLEANUP_PROCESSING)
// * CLEANUP_PENDING -> CLEANUP_PROCESSING
// * CLEANUP_PROCESSING -> (CLEANUP_FAILED, CLEANED_UP)
SetStatus(string) error
// GetTargetType returns the target type of the action.
// OktaAssignmentTarget is an target for an Okta assignment.
type OktaAssignmentTarget interface {
// GetTargetType returns the target type.
GetTargetType() string
// GetID returns the ID of the action target.
// GetID returns the ID of the target.
GetID() string
// SetLastTransition sets the last transition time.
SetLastTransition(time time.Time)
// GetLastTransition returns the optional time that the action last transitioned.
GetLastTransition() time.Time
}
// GetStatus returns the current status of the action.
func (o *OktaAssignmentActionV1) GetStatus() string {
switch o.Status {
case OktaAssignmentActionV1_PENDING:
return constants.OktaAssignmentActionStatusPending
case OktaAssignmentActionV1_PROCESSING:
return constants.OktaAssignmentActionStatusProcessing
case OktaAssignmentActionV1_SUCCESSFUL:
return constants.OktaAssignmentActionStatusSuccessful
case OktaAssignmentActionV1_FAILED:
return constants.OktaAssignmentActionStatusFailed
case OktaAssignmentActionV1_CLEANUP_PENDING:
return constants.OktaAssignmentActionStatusCleanupPending
case OktaAssignmentActionV1_CLEANUP_PROCESSING:
return constants.OktaAssignmentActionStatusCleanupProcessing
case OktaAssignmentActionV1_CLEANED_UP:
return constants.OktaAssignmentActionStatusCleanedUp
case OktaAssignmentActionV1_CLEANUP_FAILED:
return constants.OktaAssignmentActionStatusCleanupFailed
// GetTargetType returns the target type.
func (o *OktaAssignmentTargetV1) GetTargetType() string {
switch o.Type {
case OktaAssignmentTargetV1_APPLICATION:
return constants.OktaAssignmentTargetApplication
case OktaAssignmentTargetV1_GROUP:
return constants.OktaAssignmentTargetGroup
default:
return constants.OktaAssignmentActionStatusUnknown
}
}
// SetStatus sets the status of the action. Only allows valid transitions.
//
// Valid transitions are:
// * PENDING -> (PROCESSING, CLEANUP_PENDING)
// * PROCESSING -> (SUCCESSFUL, FAILED, CLEANUP_PENDING)
// * SUCCESSFUL -> (CLEANUP_PENDING, CLEANUP_PROCESSING)
// * FAILED -> (PROCESSING, CLEANUP_PENDING, CLEANUP_PROCESSING)
// * CLEANUP_PENDING -> CLEANUP_PROCESSING
// * CLEANUP_PROCESSING -> (CLEANUP_FAILED, CLEANED_UP)
func (o *OktaAssignmentActionV1) SetStatus(status string) error {
invalidTransition := false
switch o.Status {
case OktaAssignmentActionV1_PENDING:
switch status {
case constants.OktaAssignmentActionStatusProcessing:
case constants.OktaAssignmentActionStatusCleanupPending:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_PROCESSING:
switch status {
case constants.OktaAssignmentActionStatusSuccessful:
case constants.OktaAssignmentActionStatusFailed:
case constants.OktaAssignmentActionStatusCleanupPending:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_SUCCESSFUL:
switch status {
case constants.OktaAssignmentActionStatusCleanupPending:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_FAILED:
switch status {
case constants.OktaAssignmentActionStatusPending:
case constants.OktaAssignmentActionStatusCleanupPending:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_CLEANUP_PENDING:
switch status {
case constants.OktaAssignmentActionStatusCleanupProcessing:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_CLEANUP_PROCESSING:
switch status {
case constants.OktaAssignmentActionStatusCleanedUp:
case constants.OktaAssignmentActionStatusCleanupFailed:
default:
invalidTransition = true
}
case OktaAssignmentActionV1_CLEANED_UP:
invalidTransition = true
case OktaAssignmentActionV1_CLEANUP_FAILED:
invalidTransition = true
case OktaAssignmentActionV1_UNKNOWN:
// All transitions are allowed from UNKNOWN.
default:
invalidTransition = true
}
if invalidTransition {
return trace.BadParameter("invalid transition: %s -> %s", o.GetStatus(), status)
}
o.Status = OktaAssignmentActionStatusToProto(status)
return nil
}
// OktaAssignmentActionStatusToProto will convert the internal notion of an Okta status into the Okta status
// message understood by protobuf.
func OktaAssignmentActionStatusToProto(status string) OktaAssignmentActionV1_OktaAssignmentActionStatus {
switch status {
case constants.OktaAssignmentActionStatusPending:
return OktaAssignmentActionV1_PENDING
case constants.OktaAssignmentActionStatusProcessing:
return OktaAssignmentActionV1_PROCESSING
case constants.OktaAssignmentActionStatusSuccessful:
return OktaAssignmentActionV1_SUCCESSFUL
case constants.OktaAssignmentActionStatusFailed:
return OktaAssignmentActionV1_FAILED
case constants.OktaAssignmentActionStatusCleanupPending:
return OktaAssignmentActionV1_CLEANUP_PENDING
case constants.OktaAssignmentActionStatusCleanupProcessing:
return OktaAssignmentActionV1_CLEANUP_PROCESSING
case constants.OktaAssignmentActionStatusCleanedUp:
return OktaAssignmentActionV1_CLEANED_UP
case constants.OktaAssignmentActionStatusCleanupFailed:
return OktaAssignmentActionV1_CLEANUP_FAILED
default:
return OktaAssignmentActionV1_UNKNOWN
}
}
// GetTargetType returns the target type of the action.
func (o *OktaAssignmentActionV1) GetTargetType() string {
switch o.Target.Type {
case OktaAssignmentActionTargetV1_APPLICATION:
return constants.OktaAssignmentActionTargetApplication
case OktaAssignmentActionTargetV1_GROUP:
return constants.OktaAssignmentActionTargetGroup
default:
return constants.OktaAssignmentActionTargetUnknown
return constants.OktaAssignmentTargetUnknown
}
}
// GetID returns the ID of the action target.
func (o *OktaAssignmentActionV1) GetID() string {
return o.Target.Id
}
// SetLastTransition sets the last transition time.
func (o *OktaAssignmentActionV1) SetLastTransition(time time.Time) {
o.LastTransition = time.UTC()
}
// GetLastTransition returns the optional time that the action last transitioned.
func (o *OktaAssignmentActionV1) GetLastTransition() time.Time {
return o.LastTransition
func (o *OktaAssignmentTargetV1) GetID() string {
return o.Id
}
// OktaAssignments is a list of OktaAssignment resources.
@@ -481,3 +435,37 @@ func (o OktaAssignments) Less(i, j int) bool { return o[i].GetName() < o[j].GetN
// Swap swaps two Okta assignments.
func (o OktaAssignments) Swap(i, j int) { o[i], o[j] = o[j], o[i] }
// OktaAssignmentStatusToProto will convert the internal notion of an Okta status into the Okta status
// message understood by protobuf.
func OktaAssignmentStatusToProto(status string) OktaAssignmentSpecV1_OktaAssignmentStatus {
switch status {
case constants.OktaAssignmentStatusPending:
return OktaAssignmentSpecV1_PENDING
case constants.OktaAssignmentStatusProcessing:
return OktaAssignmentSpecV1_PROCESSING
case constants.OktaAssignmentStatusSuccessful:
return OktaAssignmentSpecV1_SUCCESSFUL
case constants.OktaAssignmentStatusFailed:
return OktaAssignmentSpecV1_FAILED
default:
return OktaAssignmentSpecV1_UNKNOWN
}
}
// OktaAssignmentStatusProtoToString will convert the Okta status known to protobuf into the internal notion
// of an Okta status.
func OktaAssignmentStatusProtoToString(status OktaAssignmentSpecV1_OktaAssignmentStatus) string {
switch status {
case OktaAssignmentSpecV1_PENDING:
return constants.OktaAssignmentStatusPending
case OktaAssignmentSpecV1_PROCESSING:
return constants.OktaAssignmentStatusProcessing
case OktaAssignmentSpecV1_SUCCESSFUL:
return constants.OktaAssignmentStatusSuccessful
case OktaAssignmentSpecV1_FAILED:
return constants.OktaAssignmentStatusFailed
default:
return constants.OktaAssignmentStatusUnknown
}
}
+27 -91
View File
@@ -32,95 +32,36 @@ func TestOktaAssignments_SetStatus(t *testing.T) {
nextStatus string
invalid bool
}{
// PENDING transitions
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusProcessing},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusCleanupPending},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusPending, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
{startStatus: constants.OktaAssignmentStatusPending, nextStatus: constants.OktaAssignmentStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentStatusPending, nextStatus: constants.OktaAssignmentStatusProcessing},
{startStatus: constants.OktaAssignmentStatusPending, nextStatus: constants.OktaAssignmentStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentStatusPending, nextStatus: constants.OktaAssignmentStatusFailed, invalid: true},
// PROCESSING transitions
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusSuccessful},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusFailed},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupPending},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
{startStatus: constants.OktaAssignmentStatusProcessing, nextStatus: constants.OktaAssignmentStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentStatusProcessing, nextStatus: constants.OktaAssignmentStatusProcessing},
{startStatus: constants.OktaAssignmentStatusProcessing, nextStatus: constants.OktaAssignmentStatusSuccessful},
{startStatus: constants.OktaAssignmentStatusProcessing, nextStatus: constants.OktaAssignmentStatusFailed},
// SUCCESSFUL transitions
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusCleanupPending},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusSuccessful, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
{startStatus: constants.OktaAssignmentStatusSuccessful, nextStatus: constants.OktaAssignmentStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentStatusSuccessful, nextStatus: constants.OktaAssignmentStatusProcessing},
{startStatus: constants.OktaAssignmentStatusSuccessful, nextStatus: constants.OktaAssignmentStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentStatusSuccessful, nextStatus: constants.OktaAssignmentStatusFailed, invalid: true},
// FAILED transitions
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusPending},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupPending},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
// CLEANUP_PENDING transitions
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusCleanupPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupPending, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
// CLEANUP_PROCESSING transitions
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanedUp},
{startStatus: constants.OktaAssignmentActionStatusCleanupProcessing, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed},
// CLEANED_UP transitions
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusCleanupPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanedUp, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
// CLEANUP_FAILED transitions
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusFailed, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupPending, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusCleanedUp, invalid: true},
{startStatus: constants.OktaAssignmentActionStatusCleanupFailed, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed, invalid: true},
{startStatus: constants.OktaAssignmentStatusFailed, nextStatus: constants.OktaAssignmentStatusPending, invalid: true},
{startStatus: constants.OktaAssignmentStatusFailed, nextStatus: constants.OktaAssignmentStatusProcessing},
{startStatus: constants.OktaAssignmentStatusFailed, nextStatus: constants.OktaAssignmentStatusSuccessful, invalid: true},
{startStatus: constants.OktaAssignmentStatusFailed, nextStatus: constants.OktaAssignmentStatusFailed, invalid: true},
// UNKNOWN transitions
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusPending},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusProcessing},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusSuccessful},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusFailed},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusCleanupPending},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusCleanupProcessing},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusCleanedUp},
{startStatus: constants.OktaAssignmentActionStatusUnknown, nextStatus: constants.OktaAssignmentActionStatusCleanupFailed},
{startStatus: constants.OktaAssignmentStatusUnknown, nextStatus: constants.OktaAssignmentStatusPending},
{startStatus: constants.OktaAssignmentStatusUnknown, nextStatus: constants.OktaAssignmentStatusProcessing},
{startStatus: constants.OktaAssignmentStatusUnknown, nextStatus: constants.OktaAssignmentStatusSuccessful},
{startStatus: constants.OktaAssignmentStatusUnknown, nextStatus: constants.OktaAssignmentStatusFailed},
}
for _, test := range tests {
@@ -132,22 +73,17 @@ func TestOktaAssignments_SetStatus(t *testing.T) {
errAssertionFunc = require.NoError
}
action := newOktaAssignmentAction(t, test.startStatus)
errAssertionFunc(t, action.SetStatus(test.nextStatus))
assignment := newOktaAssignment(t, test.startStatus)
errAssertionFunc(t, assignment.SetStatus(test.nextStatus))
})
}
}
func newOktaAssignmentAction(t *testing.T, status string) OktaAssignmentAction {
action := &OktaAssignmentActionV1{
Target: &OktaAssignmentActionTargetV1{
Type: OktaAssignmentActionTargetV1_APPLICATION,
Id: "dummy",
},
}
func newOktaAssignment(t *testing.T, status string) OktaAssignment {
assignment := &OktaAssignmentV1{}
require.NoError(t, action.SetStatus(status))
return action
require.NoError(t, assignment.SetStatus(status))
return assignment
}
func invalidTransition(startStatus, nextStatus string) require.ErrorAssertionFunc {
+1395 -1570
View File
File diff suppressed because it is too large Load Diff
+8 -9
View File
@@ -19,6 +19,7 @@ package auth
import (
"context"
"io"
"time"
"github.com/gravitational/trace"
@@ -803,10 +804,9 @@ type OktaAccessPoint interface {
// UpdateOktaAssignment updates an existing Okta assignment resource.
UpdateOktaAssignment(context.Context, types.OktaAssignment) (types.OktaAssignment, error)
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. If a transition is invalid, it will be logged and the rest of the action statuses
// will be updated if possible.
UpdateOktaAssignmentActionStatuses(ctx context.Context, name, status string) (types.OktaAssignment, error)
// UpdateOktaAssignmentStatus will update the status for an Okta assignment if the given time has passed
// since the last transition.
UpdateOktaAssignmentStatus(ctx context.Context, name, status string, timeHasPassed time.Duration) error
// DeleteOktaAssignment removes the specified Okta assignment resource.
DeleteOktaAssignment(ctx context.Context, name string) error
@@ -1273,11 +1273,10 @@ func (w *OktaWrapper) UpdateOktaAssignment(ctx context.Context, assignment types
return w.NoCache.UpdateOktaAssignment(ctx, assignment)
}
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. If a transition is invalid, it will be logged and the rest of the action statuses
// will be updated if possible.
func (w *OktaWrapper) UpdateOktaAssignmentActionStatuses(ctx context.Context, name, status string) (types.OktaAssignment, error) {
return w.NoCache.UpdateOktaAssignmentActionStatuses(ctx, name, status)
// UpdateOktaAssignmentStatus will update the status for an Okta assignment if the given time has passed
// since the last transition.
func (w *OktaWrapper) UpdateOktaAssignmentStatus(ctx context.Context, name, status string, timeHasPassed time.Duration) error {
return w.NoCache.UpdateOktaAssignmentStatus(ctx, name, status, timeHasPassed)
}
// DeleteOktaAssignment removes the specified Okta assignment resource.
+1 -1
View File
@@ -215,7 +215,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) {
cfg.UsageReporter = usagereporter.DiscardUsageReporter{}
}
if cfg.Okta == nil {
cfg.Okta, err = local.NewOktaService(cfg.Backend)
cfg.Okta, err = local.NewOktaService(cfg.Backend, cfg.Clock)
if err != nil {
return nil, trace.Wrap(err)
}
+12 -1
View File
@@ -63,7 +63,7 @@ func (c *ServiceConfig) CheckAndSetDefaults() error {
var err error
var oktaSvc *local.OktaService
if c.OktaImportRules == nil || c.OktaAssignments == nil {
oktaSvc, err = local.NewOktaService(c.Backend)
oktaSvc, err = local.NewOktaService(c.Backend, c.Backend.Clock())
if err != nil {
return trace.Wrap(err)
}
@@ -283,6 +283,17 @@ func (s *Service) UpdateOktaAssignment(ctx context.Context, req *oktapb.UpdateOk
return returnedAssignmentV1, trace.Wrap(err)
}
// UpdateOktaAssignmentStatus will update the status for an Okta assignment.
func (s *Service) UpdateOktaAssignmentStatus(ctx context.Context, req *oktapb.UpdateOktaAssignmentStatusRequest) (*emptypb.Empty, error) {
_, err := authz.AuthorizeWithVerbs(ctx, s.log, s.authorizer, true, types.KindOktaAssignment, types.VerbUpdate)
if err != nil {
return nil, trace.Wrap(err)
}
err = s.oktaAssignments.UpdateOktaAssignmentStatus(ctx, req.GetName(), types.OktaAssignmentStatusProtoToString(req.GetStatus()),
req.TimeHasPassed.AsDuration())
return &emptypb.Empty{}, trace.Wrap(err)
}
// DeleteOktaAssignment removes the specified Okta assignment resource.
func (s *Service) DeleteOktaAssignment(ctx context.Context, req *oktapb.DeleteOktaAssignmentRequest) (*emptypb.Empty, error) {
_, err := authz.AuthorizeWithVerbs(ctx, s.log, s.authorizer, true, types.KindOktaAssignment, types.VerbDelete)
+19 -12
View File
@@ -23,6 +23,7 @@ import (
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/stretchr/testify/require"
"github.com/gravitational/teleport/api/constants"
oktapb "github.com/gravitational/teleport/api/gen/proto/go/teleport/okta/v1"
"github.com/gravitational/teleport/api/types"
"github.com/gravitational/teleport/lib/authz"
@@ -123,13 +124,24 @@ func TestOktaAssignments(t *testing.T) {
a1.SetExpiry(time.Now().Add(30 * time.Minute))
updateResp, err := svc.UpdateOktaAssignment(ctx, &oktapb.UpdateOktaAssignmentRequest{Assignment: a1})
require.NoError(t, err)
require.Empty(t, cmp.Diff(newOktaAssignment(t, "1"), updateResp))
require.Empty(t, cmp.Diff(a1, updateResp))
a, err := svc.GetOktaAssignment(ctx, &oktapb.GetOktaAssignmentRequest{Name: a1.GetName()})
require.NoError(t, err)
require.Empty(t, cmp.Diff(a1, a,
cmpopts.IgnoreFields(types.Metadata{}, "ID")))
_, err = svc.UpdateOktaAssignmentStatus(ctx, &oktapb.UpdateOktaAssignmentStatusRequest{Name: a1.GetName(),
Status: types.OktaAssignmentSpecV1_PROCESSING})
require.NoError(t, err)
require.NoError(t, a1.SetStatus(constants.OktaAssignmentStatusProcessing))
a, err = svc.GetOktaAssignment(ctx, &oktapb.GetOktaAssignmentRequest{Name: a1.GetName()})
require.NoError(t, err)
a1.SetLastTransition(a.GetLastTransition())
require.Empty(t, cmp.Diff(a1, a,
cmpopts.IgnoreFields(types.Metadata{}, "ID")))
_, err = svc.DeleteOktaAssignment(ctx, &oktapb.DeleteOktaAssignmentRequest{Name: a1.GetName()})
require.NoError(t, err)
@@ -273,22 +285,17 @@ func newOktaAssignment(t *testing.T, name string) *types.OktaAssignmentV1 {
},
types.OktaAssignmentSpecV1{
User: "test-user@test.user",
Actions: []*types.OktaAssignmentActionV1{
Targets: []*types.OktaAssignmentTargetV1{
{
Status: types.OktaAssignmentActionV1_PENDING,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_APPLICATION,
Id: "123456",
},
Type: types.OktaAssignmentTargetV1_APPLICATION,
Id: "123456",
},
{
Status: types.OktaAssignmentActionV1_SUCCESSFUL,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_GROUP,
Id: "234567",
},
Type: types.OktaAssignmentTargetV1_GROUP,
Id: "234567",
},
},
Status: types.OktaAssignmentSpecV1_PENDING,
},
)
require.NoError(t, err)
+1 -1
View File
@@ -777,7 +777,7 @@ func New(config Config) (*Cache, error) {
return nil, trace.Wrap(err)
}
oktaCache, err := local.NewOktaService(config.Backend)
oktaCache, err := local.NewOktaService(config.Backend, config.Clock)
if err != nil {
cancel()
return nil, trace.Wrap(err)
+6 -12
View File
@@ -226,7 +226,7 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) {
if err != nil {
return nil, trace.Wrap(err)
}
oktaSvc, err := local.NewOktaService(p.backend)
oktaSvc, err := local.NewOktaService(p.backend, p.backend.Clock())
if err != nil {
return nil, trace.Wrap(err)
}
@@ -1977,20 +1977,14 @@ func TestOktaAssignments(t *testing.T) {
},
types.OktaAssignmentSpecV1{
User: "test-user@test.user",
Actions: []*types.OktaAssignmentActionV1{
Targets: []*types.OktaAssignmentTargetV1{
{
Status: types.OktaAssignmentActionV1_PENDING,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_APPLICATION,
Id: "123456",
},
Type: types.OktaAssignmentTargetV1_APPLICATION,
Id: "123456",
},
{
Status: types.OktaAssignmentActionV1_SUCCESSFUL,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_GROUP,
Id: "234567",
},
Type: types.OktaAssignmentTargetV1_GROUP,
Id: "234567",
},
},
},
+20 -55
View File
@@ -18,8 +18,10 @@ package local
import (
"context"
"time"
"github.com/gravitational/trace"
"github.com/jonboulle/clockwork"
"github.com/sirupsen/logrus"
"github.com/gravitational/teleport/api/types"
@@ -38,12 +40,13 @@ const (
// OktaService manages Okta resources in the Backend.
type OktaService struct {
log logrus.FieldLogger
clock clockwork.Clock
importRuleSvc *generic.Service[types.OktaImportRule]
assignmentSvc *generic.Service[types.OktaAssignment]
}
// NewOktaService creates a new OktaService.
func NewOktaService(backend backend.Backend) (*OktaService, error) {
func NewOktaService(backend backend.Backend, clock clockwork.Clock) (*OktaService, error) {
importRuleSvc, err := generic.NewService(&generic.ServiceConfig[types.OktaImportRule]{
Backend: backend,
PageLimit: oktaImportRuleMaxPageSize,
@@ -70,6 +73,7 @@ func NewOktaService(backend backend.Backend) (*OktaService, error) {
return &OktaService{
log: logrus.WithFields(logrus.Fields{trace.Component: "okta:local-service"}),
clock: clock,
importRuleSvc: importRuleSvc,
assignmentSvc: assignmentSvc,
}, nil
@@ -122,64 +126,31 @@ func (o *OktaService) CreateOktaAssignment(ctx context.Context, assignment types
// UpdateOktaAssignment updates an existing Okta assignment resource.
func (o *OktaService) UpdateOktaAssignment(ctx context.Context, assignment types.OktaAssignment) (types.OktaAssignment, error) {
var previousAssignment types.OktaAssignment
err := o.assignmentSvc.UpdateAndSwapResource(ctx, assignment.GetName(), func(currentAssignment types.OktaAssignment) error {
previousAssignment = currentAssignment.Copy()
currentActions := currentAssignment.GetActions()
return assignment, o.assignmentSvc.UpdateResource(ctx, assignment)
}
if len(currentActions) != len(assignment.GetActions()) {
return trace.BadParameter("Update to Okta assignment %s failed because the previous version has a different number of actions", assignment.GetName())
// UpdateOktaAssignmentStatus will update the status for an Okta assignment if the given time has passed
// since the last transition.
func (o *OktaService) UpdateOktaAssignmentStatus(ctx context.Context, name, status string, timeHasPassed time.Duration) error {
err := o.assignmentSvc.UpdateAndSwapResource(ctx, name, func(currentAssignment types.OktaAssignment) error {
// Only update the status if the given duration has passed.
sinceLastTransition := o.clock.Since(currentAssignment.GetLastTransition())
if sinceLastTransition < timeHasPassed {
return trace.BadParameter("only %s has passed since last transition", sinceLastTransition)
}
// Make sure that the status transitions of the updated assignment are valid.
for i, action := range assignment.GetActions() {
currentAction := currentActions[i]
// Ensure that the previous actions are equal
if !actionsMatch(currentAction, action) {
return trace.BadParameter("action mismatch when updating Okta assignment %s", assignment.GetName())
}
// Don't check the status transition if the statuses are equal and the last transitions are equal.
if currentAction.GetStatus() == action.GetStatus() &&
currentAction.GetLastTransition().Equal(action.GetLastTransition()) {
continue
}
if err := currentAction.SetStatus(action.GetStatus()); err != nil {
return trace.Wrap(err)
}
currentAction.SetLastTransition(action.GetLastTransition())
if err := currentAssignment.SetStatus(status); err != nil {
return trace.Wrap(err)
}
currentAssignment.SetMetadata(assignment.GetMetadata())
currentAssignment.SetLastTransition(o.clock.Now())
return nil
})
if err != nil {
return nil, trace.Wrap(err)
return trace.Wrap(err)
}
return previousAssignment, nil
}
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. If a transition is invalid, it will be logged and the rest of the action statuses
// will be updated if possible.
func (o *OktaService) UpdateOktaAssignmentActionStatuses(ctx context.Context, name, status string) (types.OktaAssignment, error) {
var previousAssignment types.OktaAssignment
err := o.assignmentSvc.UpdateAndSwapResource(ctx, name, func(assignment types.OktaAssignment) error {
previousAssignment = assignment.Copy()
for _, action := range assignment.GetActions() {
if err := action.SetStatus(status); err != nil {
o.log.Warnf("Unable to transition status from %s -> %s", action.GetStatus(), status)
}
}
return nil
})
return previousAssignment, trace.Wrap(err)
return nil
}
// DeleteOktaAssignment removes the specified Okta assignment resource.
@@ -191,9 +162,3 @@ func (o *OktaService) DeleteOktaAssignment(ctx context.Context, name string) err
func (o *OktaService) DeleteAllOktaAssignments(ctx context.Context) error {
return o.assignmentSvc.DeleteAllResources(ctx)
}
// actionsMatch returns true if two actions match minus the status and last transition.
func actionsMatch(a1, a2 types.OktaAssignmentAction) bool {
return a1.GetTargetType() == a2.GetTargetType() &&
a1.GetID() == a2.GetID()
}
+33 -109
View File
@@ -43,7 +43,7 @@ func TestOktaImportRuleCRUD(t *testing.T) {
})
require.NoError(t, err)
service, err := NewOktaService(backend)
service, err := NewOktaService(backend, clock)
require.NoError(t, err)
// Create a couple Okta import rule.
@@ -211,17 +211,17 @@ func TestOktaAssignmentCRUD(t *testing.T) {
})
require.NoError(t, err)
service, err := NewOktaService(backend)
service, err := NewOktaService(backend, clock)
require.NoError(t, err)
// Create a couple Okta assignments.
assignment1 := oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusPending, clock.Now()),
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "234567", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
assignment1 := oktaAssignment(t, "assignment1", "test-user@test.user", constants.OktaAssignmentStatusPending, clock.Now(),
oktaTarget(t, types.OktaAssignmentTargetV1_APPLICATION, "123456"),
oktaTarget(t, types.OktaAssignmentTargetV1_GROUP, "234567"),
)
assignment2 := oktaAssignment(t, "assignment2", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusPending, clock.Now()),
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "234567", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
assignment2 := oktaAssignment(t, "assignment2", "test-user@test.user", constants.OktaAssignmentStatusPending, clock.Now(),
oktaTarget(t, types.OktaAssignmentTargetV1_APPLICATION, "123456"),
oktaTarget(t, types.OktaAssignmentTargetV1_GROUP, "234567"),
)
// Initially we expect no assignments.
@@ -285,41 +285,10 @@ func TestOktaAssignmentCRUD(t *testing.T) {
_, err = service.CreateOktaAssignment(ctx, assignment1)
require.True(t, trace.IsAlreadyExists(err), "expected already exists error, got %v", err)
// Fail to update the assignment due to mismatching number of actions
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusPending, clock.Now()),
)
_, err = service.UpdateOktaAssignment(ctx, assignment1)
require.ErrorContains(t, err, "different number of actions")
// Fail to update the assignment due to actions with differing contents.
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "diff", constants.OktaAssignmentActionStatusPending, clock.Now()),
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "diff", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
)
_, err = service.UpdateOktaAssignment(ctx, assignment1)
require.ErrorContains(t, err, "action mismatch")
// Fail to update the assignment due to bad transition.
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusFailed, clock.Now()),
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "234567", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
)
_, err = service.UpdateOktaAssignment(ctx, assignment1)
require.ErrorContains(t, err, "invalid transition")
// Fail to update the assignment because last transition is different even though status remains the same.
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusPending, clock.Now().Add(5*time.Minute)),
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "234567", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
)
_, err = service.UpdateOktaAssignment(ctx, assignment1)
require.ErrorContains(t, err, "invalid transition")
// Update succeeds with a valid transition.
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user",
oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "123456", constants.OktaAssignmentActionStatusProcessing, clock.Now()),
oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "234567", constants.OktaAssignmentActionStatusSuccessful, clock.Now()),
// Update the assignment.
assignment1 = oktaAssignment(t, "assignment1", "test-user@test.user", constants.OktaAssignmentStatusProcessing, clock.Now(),
oktaTarget(t, types.OktaAssignmentTargetV1_APPLICATION, "123456"),
oktaTarget(t, types.OktaAssignmentTargetV1_GROUP, "234567"),
)
_, err = service.UpdateOktaAssignment(ctx, assignment1)
require.NoError(t, err)
@@ -330,13 +299,18 @@ func TestOktaAssignmentCRUD(t *testing.T) {
cmpopts.IgnoreFields(types.Metadata{}, "ID"),
))
// Update the statuses for an assignment.
assignment1.GetActions()[0].SetStatus(constants.OktaAssignmentActionStatusProcessing)
assignment, err = service.UpdateOktaAssignmentActionStatuses(ctx, assignment1.GetName(), constants.OktaAssignmentActionStatusProcessing)
// Fail to update the status for an assignment due to a bad transition.
err = service.UpdateOktaAssignmentStatus(ctx, assignment1.GetName(), constants.OktaAssignmentStatusPending, 0)
require.ErrorIs(t, err, trace.BadParameter("invalid transition: processing -> pending"))
// Fail to update the status because not enough time has passed.
err = service.UpdateOktaAssignmentStatus(ctx, assignment1.GetName(), constants.OktaAssignmentStatusPending, time.Hour)
require.ErrorIs(t, err, trace.BadParameter("only 0s has passed since last transition"))
// Successfully update the status for an assignment.
require.NoError(t, assignment1.SetStatus(constants.OktaAssignmentStatusSuccessful))
err = service.UpdateOktaAssignmentStatus(ctx, assignment1.GetName(), constants.OktaAssignmentStatusSuccessful, 0)
require.NoError(t, err)
require.Empty(t, cmp.Diff(assignment1, assignment,
cmpopts.IgnoreFields(types.Metadata{}, "ID"),
))
assignment, err = service.GetOktaAssignment(ctx, assignment1.GetName())
require.NoError(t, err)
require.Empty(t, cmp.Diff(assignment1, assignment,
@@ -366,80 +340,30 @@ func TestOktaAssignmentCRUD(t *testing.T) {
require.Empty(t, out)
}
func TestActionsMatch(t *testing.T) {
now := time.Now()
tests := []struct {
name string
action1 types.OktaAssignmentAction
action2 types.OktaAssignmentAction
expected bool
}{
{
name: "actions match",
action1: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
action2: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
expected: true,
},
{
name: "target mismatch",
action1: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
action2: oktaAction(t, types.OktaAssignmentActionTargetV1_GROUP, "1", constants.OktaAssignmentActionStatusPending, now),
expected: false,
},
{
name: "id mismatch",
action1: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
action2: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "2", constants.OktaAssignmentActionStatusPending, now),
expected: false,
},
{
name: "status ignored",
action1: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
action2: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusCleanupPending, now),
expected: true,
},
{
name: "last transition ignored",
action1: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now),
action2: oktaAction(t, types.OktaAssignmentActionTargetV1_APPLICATION, "1", constants.OktaAssignmentActionStatusPending, now.Add(time.Hour)),
expected: true,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
require.Equal(t, test.expected, actionsMatch(test.action1, test.action2))
})
}
}
func oktaAssignment(t *testing.T, name, username string, actions ...*types.OktaAssignmentActionV1) types.OktaAssignment {
func oktaAssignment(t *testing.T, name, username, status string, lastTransition time.Time, targets ...*types.OktaAssignmentTargetV1) types.OktaAssignment {
assignment, err := types.NewOktaAssignment(
types.Metadata{
Name: name,
},
types.OktaAssignmentSpecV1{
User: username,
Actions: actions,
Targets: targets,
},
)
require.NoError(t, err)
require.NoError(t, assignment.SetStatus(status))
assignment.SetLastTransition(lastTransition)
return assignment
}
func oktaAction(t *testing.T, targetType types.OktaAssignmentActionTargetV1_OktaAssignmentActionTargetType,
id string, status string, lastTransition time.Time) *types.OktaAssignmentActionV1 {
func oktaTarget(t *testing.T, targetType types.OktaAssignmentTargetV1_OktaAssignmentTargetType,
id string) *types.OktaAssignmentTargetV1 {
action := &types.OktaAssignmentActionV1{
Target: &types.OktaAssignmentActionTargetV1{
Type: targetType,
Id: id,
},
LastTransition: lastTransition,
target := &types.OktaAssignmentTargetV1{
Type: targetType,
Id: id,
}
require.NoError(t, action.SetStatus(status))
return action
return target
}
+4 -4
View File
@@ -18,6 +18,7 @@ package services
import (
"context"
"time"
"github.com/gravitational/trace"
@@ -68,10 +69,9 @@ type OktaAssignments interface {
CreateOktaAssignment(context.Context, types.OktaAssignment) (types.OktaAssignment, error)
// UpdateOktaAssignment updates an existing Okta assignment resource.
UpdateOktaAssignment(context.Context, types.OktaAssignment) (types.OktaAssignment, error)
// UpdateOktaAssignmentActionStatuses will update the statuses for all actions in an Okta assignment if the
// status is a valid transition. If a transition is invalid, it will be logged and the rest of the action statuses
// will be updated if possible.
UpdateOktaAssignmentActionStatuses(ctx context.Context, name, status string) (types.OktaAssignment, error)
// UpdateOktaAssignmentStatus will update the status for an Okta assignment if the given time has passed
// since the last transition.
UpdateOktaAssignmentStatus(ctx context.Context, name, status string, timeHasPassed time.Duration) error
// DeleteOktaAssignment removes the specified Okta assignment resource.
DeleteOktaAssignment(ctx context.Context, name string) error
// DeleteAllOktaAssignments removes all Okta assignments.
+19 -31
View File
@@ -111,22 +111,17 @@ func TestOktaAssignmentUnmarshal(t *testing.T) {
},
types.OktaAssignmentSpecV1{
User: "test-user@test.user",
Actions: []*types.OktaAssignmentActionV1{
Targets: []*types.OktaAssignmentTargetV1{
{
Status: types.OktaAssignmentActionV1_PENDING,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_APPLICATION,
Id: "123456",
},
Type: types.OktaAssignmentTargetV1_APPLICATION,
Id: "123456",
},
{
Status: types.OktaAssignmentActionV1_SUCCESSFUL,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_GROUP,
Id: "234567",
},
Type: types.OktaAssignmentTargetV1_GROUP,
Id: "234567",
},
},
Status: types.OktaAssignmentSpecV1_PENDING,
},
)
require.NoError(t, err)
@@ -145,22 +140,18 @@ func TestOktaAssignmentMarshal(t *testing.T) {
},
types.OktaAssignmentSpecV1{
User: "test-user@test.user",
Actions: []*types.OktaAssignmentActionV1{
Targets: []*types.OktaAssignmentTargetV1{
{
Status: types.OktaAssignmentActionV1_PENDING,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_APPLICATION,
Id: "123456",
},
Type: types.OktaAssignmentTargetV1_APPLICATION,
Id: "123456",
},
{
Status: types.OktaAssignmentActionV1_SUCCESSFUL,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_GROUP,
Id: "234567",
},
Type: types.OktaAssignmentTargetV1_GROUP,
Id: "234567",
},
},
Status: types.OktaAssignmentSpecV1_PENDING,
},
)
require.NoError(t, err)
@@ -196,14 +187,11 @@ metadata:
name: test-assignment
spec:
user: test-user@test.user
actions:
- status: 1
target:
type: 1
id: "123456"
- status: 2
target:
type: 2
id: "234567"
targets:
- type: 1
id: "123456"
- type: 2
id: "234567"
status: 1
`
)
+5 -7
View File
@@ -1126,7 +1126,7 @@ func TestOktaAssignmentWatcher(t *testing.T) {
types.Events
}
oktaService, err := local.NewOktaService(bk)
oktaService, err := local.NewOktaService(bk, clock)
require.NoError(t, err)
w, err := services.NewOktaAssignmentWatcher(ctx, services.OktaAssignmentWatcherConfig{
RWCfg: services.ResourceWatcherConfig{
@@ -1256,15 +1256,13 @@ func newOktaAssignment(t *testing.T, name string) types.OktaAssignment {
},
types.OktaAssignmentSpecV1{
User: "test-user@test.user",
Actions: []*types.OktaAssignmentActionV1{
Targets: []*types.OktaAssignmentTargetV1{
{
Status: types.OktaAssignmentActionV1_PENDING,
Target: &types.OktaAssignmentActionTargetV1{
Type: types.OktaAssignmentActionTargetV1_APPLICATION,
Id: "123456",
},
Type: types.OktaAssignmentTargetV1_APPLICATION,
Id: "123456",
},
},
Status: types.OktaAssignmentSpecV1_PENDING,
},
)
require.NoError(t, err)