diff --git a/internal/api/osac/private/v1/identity_provider_logging.go b/internal/api/osac/private/v1/identity_provider_logging.go new file mode 100644 index 000000000..d45c0cfdc --- /dev/null +++ b/internal/api/osac/private/v1/identity_provider_logging.go @@ -0,0 +1,40 @@ +/* +Copyright (c) 2026 Red Hat Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +package privatev1 + +import ( + "log/slog" +) + +// LogValue implements slog.LogValuer for IdentityProviderHealth to redact detailed error messages. +func (h *IdentityProviderHealth) LogValue() slog.Value { + if h == nil { + return slog.Value{} + } + + attrs := []slog.Attr{ + slog.String("status", h.Status.String()), + } + + if h.LastChecked != nil { + attrs = append(attrs, slog.Time("last_checked", h.LastChecked.AsTime())) + } + + // Redact message - may contain internal network details or error information + if h.Message != nil { + attrs = append(attrs, slog.Bool("has_message", true)) + } + + return slog.GroupValue(attrs...) +} diff --git a/internal/api/osac/private/v1/identity_provider_logging_test.go b/internal/api/osac/private/v1/identity_provider_logging_test.go new file mode 100644 index 000000000..4b6838d09 --- /dev/null +++ b/internal/api/osac/private/v1/identity_provider_logging_test.go @@ -0,0 +1,53 @@ +/* +Copyright (c) 2026 Red Hat Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +package privatev1 + +import ( + "bytes" + "log/slog" + "strings" + "testing" + "time" + + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestIdentityProviderHealth_LogValue(t *testing.T) { + message := "LDAP connection to ldap://internal-server.example.com:389 failed" + + health := &IdentityProviderHealth{ + Status: IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY, + Message: &message, + LastChecked: timestamppb.New(time.Now()), + } + + var buf bytes.Buffer + logger := slog.New(slog.NewJSONHandler(&buf, nil)) + logger.Info("health check", "health", health) + + logOutput := buf.String() + + // Verify internal network details are NOT in logs + if strings.Contains(logOutput, "internal-server") { + t.Errorf("internal network details should be redacted: %s", logOutput) + } + + // Verify status IS in logs + if !strings.Contains(logOutput, "UNHEALTHY") { + t.Errorf("status should be present: %s", logOutput) + } + if !strings.Contains(logOutput, "has_message") { + t.Errorf("has_message indicator should be present: %s", logOutput) + } +} diff --git a/internal/api/osac/private/v1/identity_provider_type.pb.go b/internal/api/osac/private/v1/identity_provider_type.pb.go index fa2f64e91..d6837082b 100644 --- a/internal/api/osac/private/v1/identity_provider_type.pb.go +++ b/internal/api/osac/private/v1/identity_provider_type.pb.go @@ -88,6 +88,58 @@ func (x IdentityProviderPhase) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } +// IdentityProviderHealthStatus represents the health status of an identity provider. +type IdentityProviderHealthStatus int32 + +const ( + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED IdentityProviderHealthStatus = 0 + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY IdentityProviderHealthStatus = 1 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY IdentityProviderHealthStatus = 2 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN IdentityProviderHealthStatus = 3 +) + +// Enum value maps for IdentityProviderHealthStatus. +var ( + IdentityProviderHealthStatus_name = map[int32]string{ + 0: "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED", + 1: "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY", + 2: "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY", + 3: "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN", + } + IdentityProviderHealthStatus_value = map[string]int32{ + "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED": 0, + "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY": 1, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY": 2, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN": 3, + } +) + +func (x IdentityProviderHealthStatus) Enum() *IdentityProviderHealthStatus { + p := new(IdentityProviderHealthStatus) + *p = x + return p +} + +func (x IdentityProviderHealthStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdentityProviderHealthStatus) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_identity_provider_type_proto_enumTypes[1].Descriptor() +} + +func (IdentityProviderHealthStatus) Type() protoreflect.EnumType { + return &file_osac_private_v1_identity_provider_type_proto_enumTypes[1] +} + +func (x IdentityProviderHealthStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + // IdentityProvider represents an external identity provider configuration. // Identity providers enable users to authenticate using their existing corporate credentials // (LDAP, Active Directory, OIDC, SAML, etc.). @@ -1379,6 +1431,120 @@ func (b0 IdentityProviderCondition_builder) Build() *IdentityProviderCondition { return m0 } +// IdentityProviderHealth represents the health status of an identity provider. +type IdentityProviderHealth struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Status indicates the overall health status. + Status IdentityProviderHealthStatus `protobuf:"varint,1,opt,name=status,proto3,enum=osac.private.v1.IdentityProviderHealthStatus" json:"status,omitempty"` + // Message provides details about the health status. + Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"` + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_checked,json=lastChecked,proto3" json:"last_checked,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProviderHealth) Reset() { + *x = IdentityProviderHealth{} + mi := &file_osac_private_v1_identity_provider_type_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProviderHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProviderHealth) ProtoMessage() {} + +func (x *IdentityProviderHealth) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_provider_type_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *IdentityProviderHealth) GetStatus() IdentityProviderHealthStatus { + if x != nil { + return x.Status + } + return IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED +} + +func (x *IdentityProviderHealth) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +func (x *IdentityProviderHealth) GetLastChecked() *timestamppb.Timestamp { + if x != nil { + return x.LastChecked + } + return nil +} + +func (x *IdentityProviderHealth) SetStatus(v IdentityProviderHealthStatus) { + x.Status = v +} + +func (x *IdentityProviderHealth) SetMessage(v string) { + x.Message = &v +} + +func (x *IdentityProviderHealth) SetLastChecked(v *timestamppb.Timestamp) { + x.LastChecked = v +} + +func (x *IdentityProviderHealth) HasMessage() bool { + if x == nil { + return false + } + return x.Message != nil +} + +func (x *IdentityProviderHealth) HasLastChecked() bool { + if x == nil { + return false + } + return x.LastChecked != nil +} + +func (x *IdentityProviderHealth) ClearMessage() { + x.Message = nil +} + +func (x *IdentityProviderHealth) ClearLastChecked() { + x.LastChecked = nil +} + +type IdentityProviderHealth_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Status indicates the overall health status. + Status IdentityProviderHealthStatus + // Message provides details about the health status. + Message *string + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp +} + +func (b0 IdentityProviderHealth_builder) Build() *IdentityProviderHealth { + m0 := &IdentityProviderHealth{} + b, x := &b0, m0 + _, _ = b, x + x.Status = b.Status + x.Message = b.Message + x.LastChecked = b.LastChecked + return m0 +} + var File_osac_private_v1_identity_provider_type_proto protoreflect.FileDescriptor var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ @@ -1520,64 +1686,94 @@ var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, - 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x21, 0x0a, - 0x1d, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, - 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, - 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xe4, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0f, 0x4f, 0x73, 0x61, 0x63, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4f, 0x73, 0x61, 0x63, - 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x4f, 0x73, 0x61, 0x63, 0x3a, - 0x3a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x27, 0x0a, + 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, + 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, + 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, + 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, 0x45, + 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, + 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, + 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x03, 0x2a, 0xd8, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x01, + 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, + 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xe4, 0x01, 0x0a, + 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0f, 0x4f, 0x73, + 0x61, 0x63, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, + 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1c, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x11, 0x4f, 0x73, 0x61, 0x63, 0x3a, 0x3a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_osac_private_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_osac_private_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_osac_private_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_osac_private_v1_identity_provider_type_proto_goTypes = []any{ (IdentityProviderPhase)(0), // 0: osac.private.v1.IdentityProviderPhase - (*IdentityProvider)(nil), // 1: osac.private.v1.IdentityProvider - (*IdentityProviderSpec)(nil), // 2: osac.private.v1.IdentityProviderSpec - (*OidcConfig)(nil), // 3: osac.private.v1.OidcConfig - (*LdapConfig)(nil), // 4: osac.private.v1.LdapConfig - (*IdentityProviderStatus)(nil), // 5: osac.private.v1.IdentityProviderStatus - (*IdentityProviderCondition)(nil), // 6: osac.private.v1.IdentityProviderCondition - (*Metadata)(nil), // 7: osac.private.v1.Metadata - (ConditionStatus)(0), // 8: osac.private.v1.ConditionStatus - (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp + (IdentityProviderHealthStatus)(0), // 1: osac.private.v1.IdentityProviderHealthStatus + (*IdentityProvider)(nil), // 2: osac.private.v1.IdentityProvider + (*IdentityProviderSpec)(nil), // 3: osac.private.v1.IdentityProviderSpec + (*OidcConfig)(nil), // 4: osac.private.v1.OidcConfig + (*LdapConfig)(nil), // 5: osac.private.v1.LdapConfig + (*IdentityProviderStatus)(nil), // 6: osac.private.v1.IdentityProviderStatus + (*IdentityProviderCondition)(nil), // 7: osac.private.v1.IdentityProviderCondition + (*IdentityProviderHealth)(nil), // 8: osac.private.v1.IdentityProviderHealth + (*Metadata)(nil), // 9: osac.private.v1.Metadata + (ConditionStatus)(0), // 10: osac.private.v1.ConditionStatus + (*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp } var file_osac_private_v1_identity_provider_type_proto_depIdxs = []int32{ - 7, // 0: osac.private.v1.IdentityProvider.metadata:type_name -> osac.private.v1.Metadata - 2, // 1: osac.private.v1.IdentityProvider.spec:type_name -> osac.private.v1.IdentityProviderSpec - 5, // 2: osac.private.v1.IdentityProvider.status:type_name -> osac.private.v1.IdentityProviderStatus - 3, // 3: osac.private.v1.IdentityProviderSpec.oidc:type_name -> osac.private.v1.OidcConfig - 4, // 4: osac.private.v1.IdentityProviderSpec.ldap:type_name -> osac.private.v1.LdapConfig - 0, // 5: osac.private.v1.IdentityProviderStatus.phase:type_name -> osac.private.v1.IdentityProviderPhase - 6, // 6: osac.private.v1.IdentityProviderStatus.conditions:type_name -> osac.private.v1.IdentityProviderCondition - 8, // 7: osac.private.v1.IdentityProviderCondition.status:type_name -> osac.private.v1.ConditionStatus - 9, // 8: osac.private.v1.IdentityProviderCondition.last_transition_time:type_name -> google.protobuf.Timestamp - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 9, // 0: osac.private.v1.IdentityProvider.metadata:type_name -> osac.private.v1.Metadata + 3, // 1: osac.private.v1.IdentityProvider.spec:type_name -> osac.private.v1.IdentityProviderSpec + 6, // 2: osac.private.v1.IdentityProvider.status:type_name -> osac.private.v1.IdentityProviderStatus + 4, // 3: osac.private.v1.IdentityProviderSpec.oidc:type_name -> osac.private.v1.OidcConfig + 5, // 4: osac.private.v1.IdentityProviderSpec.ldap:type_name -> osac.private.v1.LdapConfig + 0, // 5: osac.private.v1.IdentityProviderStatus.phase:type_name -> osac.private.v1.IdentityProviderPhase + 7, // 6: osac.private.v1.IdentityProviderStatus.conditions:type_name -> osac.private.v1.IdentityProviderCondition + 10, // 7: osac.private.v1.IdentityProviderCondition.status:type_name -> osac.private.v1.ConditionStatus + 11, // 8: osac.private.v1.IdentityProviderCondition.last_transition_time:type_name -> google.protobuf.Timestamp + 1, // 9: osac.private.v1.IdentityProviderHealth.status:type_name -> osac.private.v1.IdentityProviderHealthStatus + 11, // 10: osac.private.v1.IdentityProviderHealth.last_checked:type_name -> google.protobuf.Timestamp + 11, // [11:11] is the sub-list for method output_type + 11, // [11:11] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_osac_private_v1_identity_provider_type_proto_init() } @@ -1593,13 +1789,14 @@ func file_osac_private_v1_identity_provider_type_proto_init() { } file_osac_private_v1_identity_provider_type_proto_msgTypes[2].OneofWrappers = []any{} file_osac_private_v1_identity_provider_type_proto_msgTypes[3].OneofWrappers = []any{} + file_osac_private_v1_identity_provider_type_proto_msgTypes[6].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_identity_provider_type_proto_rawDesc), len(file_osac_private_v1_identity_provider_type_proto_rawDesc)), - NumEnums: 1, - NumMessages: 6, + NumEnums: 2, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/api/osac/private/v1/identity_provider_type_protoopaque.pb.go b/internal/api/osac/private/v1/identity_provider_type_protoopaque.pb.go index 4863d6548..2fec9b158 100644 --- a/internal/api/osac/private/v1/identity_provider_type_protoopaque.pb.go +++ b/internal/api/osac/private/v1/identity_provider_type_protoopaque.pb.go @@ -88,6 +88,58 @@ func (x IdentityProviderPhase) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } +// IdentityProviderHealthStatus represents the health status of an identity provider. +type IdentityProviderHealthStatus int32 + +const ( + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED IdentityProviderHealthStatus = 0 + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY IdentityProviderHealthStatus = 1 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY IdentityProviderHealthStatus = 2 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN IdentityProviderHealthStatus = 3 +) + +// Enum value maps for IdentityProviderHealthStatus. +var ( + IdentityProviderHealthStatus_name = map[int32]string{ + 0: "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED", + 1: "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY", + 2: "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY", + 3: "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN", + } + IdentityProviderHealthStatus_value = map[string]int32{ + "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED": 0, + "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY": 1, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY": 2, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN": 3, + } +) + +func (x IdentityProviderHealthStatus) Enum() *IdentityProviderHealthStatus { + p := new(IdentityProviderHealthStatus) + *p = x + return p +} + +func (x IdentityProviderHealthStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdentityProviderHealthStatus) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_identity_provider_type_proto_enumTypes[1].Descriptor() +} + +func (IdentityProviderHealthStatus) Type() protoreflect.EnumType { + return &file_osac_private_v1_identity_provider_type_proto_enumTypes[1] +} + +func (x IdentityProviderHealthStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + // IdentityProvider represents an external identity provider configuration. // Identity providers enable users to authenticate using their existing corporate credentials // (LDAP, Active Directory, OIDC, SAML, etc.). @@ -1396,6 +1448,127 @@ func (b0 IdentityProviderCondition_builder) Build() *IdentityProviderCondition { return m0 } +// IdentityProviderHealth represents the health status of an identity provider. +type IdentityProviderHealth struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Status IdentityProviderHealthStatus `protobuf:"varint,1,opt,name=status,proto3,enum=osac.private.v1.IdentityProviderHealthStatus"` + xxx_hidden_Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof"` + xxx_hidden_LastChecked *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_checked,json=lastChecked,proto3"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProviderHealth) Reset() { + *x = IdentityProviderHealth{} + mi := &file_osac_private_v1_identity_provider_type_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProviderHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProviderHealth) ProtoMessage() {} + +func (x *IdentityProviderHealth) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_provider_type_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *IdentityProviderHealth) GetStatus() IdentityProviderHealthStatus { + if x != nil { + return x.xxx_hidden_Status + } + return IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED +} + +func (x *IdentityProviderHealth) GetMessage() string { + if x != nil { + if x.xxx_hidden_Message != nil { + return *x.xxx_hidden_Message + } + return "" + } + return "" +} + +func (x *IdentityProviderHealth) GetLastChecked() *timestamppb.Timestamp { + if x != nil { + return x.xxx_hidden_LastChecked + } + return nil +} + +func (x *IdentityProviderHealth) SetStatus(v IdentityProviderHealthStatus) { + x.xxx_hidden_Status = v +} + +func (x *IdentityProviderHealth) SetMessage(v string) { + x.xxx_hidden_Message = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 3) +} + +func (x *IdentityProviderHealth) SetLastChecked(v *timestamppb.Timestamp) { + x.xxx_hidden_LastChecked = v +} + +func (x *IdentityProviderHealth) HasMessage() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *IdentityProviderHealth) HasLastChecked() bool { + if x == nil { + return false + } + return x.xxx_hidden_LastChecked != nil +} + +func (x *IdentityProviderHealth) ClearMessage() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Message = nil +} + +func (x *IdentityProviderHealth) ClearLastChecked() { + x.xxx_hidden_LastChecked = nil +} + +type IdentityProviderHealth_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Status indicates the overall health status. + Status IdentityProviderHealthStatus + // Message provides details about the health status. + Message *string + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp +} + +func (b0 IdentityProviderHealth_builder) Build() *IdentityProviderHealth { + m0 := &IdentityProviderHealth{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Status = b.Status + if b.Message != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 3) + x.xxx_hidden_Message = b.Message + } + x.xxx_hidden_LastChecked = b.LastChecked + return m0 +} + var File_osac_private_v1_identity_provider_type_proto protoreflect.FileDescriptor var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ @@ -1537,64 +1710,94 @@ var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, - 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, - 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x21, 0x0a, - 0x1d, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, - 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, - 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xe4, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, - 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0f, 0x4f, 0x73, 0x61, 0x63, 0x2e, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x4f, 0x73, 0x61, 0x63, - 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x11, 0x4f, 0x73, 0x61, 0x63, 0x3a, - 0x3a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x22, 0xc9, 0x01, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x12, 0x45, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x27, 0x0a, + 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, + 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, + 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, + 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x44, 0x45, + 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, + 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, + 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x03, 0x2a, 0xd8, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, + 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x01, + 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, 0x12, + 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xe4, 0x01, 0x0a, + 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0f, 0x4f, 0x73, + 0x61, 0x63, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, + 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1c, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x11, 0x4f, 0x73, 0x61, 0x63, 0x3a, 0x3a, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_osac_private_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_osac_private_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_osac_private_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_osac_private_v1_identity_provider_type_proto_goTypes = []any{ (IdentityProviderPhase)(0), // 0: osac.private.v1.IdentityProviderPhase - (*IdentityProvider)(nil), // 1: osac.private.v1.IdentityProvider - (*IdentityProviderSpec)(nil), // 2: osac.private.v1.IdentityProviderSpec - (*OidcConfig)(nil), // 3: osac.private.v1.OidcConfig - (*LdapConfig)(nil), // 4: osac.private.v1.LdapConfig - (*IdentityProviderStatus)(nil), // 5: osac.private.v1.IdentityProviderStatus - (*IdentityProviderCondition)(nil), // 6: osac.private.v1.IdentityProviderCondition - (*Metadata)(nil), // 7: osac.private.v1.Metadata - (ConditionStatus)(0), // 8: osac.private.v1.ConditionStatus - (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp + (IdentityProviderHealthStatus)(0), // 1: osac.private.v1.IdentityProviderHealthStatus + (*IdentityProvider)(nil), // 2: osac.private.v1.IdentityProvider + (*IdentityProviderSpec)(nil), // 3: osac.private.v1.IdentityProviderSpec + (*OidcConfig)(nil), // 4: osac.private.v1.OidcConfig + (*LdapConfig)(nil), // 5: osac.private.v1.LdapConfig + (*IdentityProviderStatus)(nil), // 6: osac.private.v1.IdentityProviderStatus + (*IdentityProviderCondition)(nil), // 7: osac.private.v1.IdentityProviderCondition + (*IdentityProviderHealth)(nil), // 8: osac.private.v1.IdentityProviderHealth + (*Metadata)(nil), // 9: osac.private.v1.Metadata + (ConditionStatus)(0), // 10: osac.private.v1.ConditionStatus + (*timestamppb.Timestamp)(nil), // 11: google.protobuf.Timestamp } var file_osac_private_v1_identity_provider_type_proto_depIdxs = []int32{ - 7, // 0: osac.private.v1.IdentityProvider.metadata:type_name -> osac.private.v1.Metadata - 2, // 1: osac.private.v1.IdentityProvider.spec:type_name -> osac.private.v1.IdentityProviderSpec - 5, // 2: osac.private.v1.IdentityProvider.status:type_name -> osac.private.v1.IdentityProviderStatus - 3, // 3: osac.private.v1.IdentityProviderSpec.oidc:type_name -> osac.private.v1.OidcConfig - 4, // 4: osac.private.v1.IdentityProviderSpec.ldap:type_name -> osac.private.v1.LdapConfig - 0, // 5: osac.private.v1.IdentityProviderStatus.phase:type_name -> osac.private.v1.IdentityProviderPhase - 6, // 6: osac.private.v1.IdentityProviderStatus.conditions:type_name -> osac.private.v1.IdentityProviderCondition - 8, // 7: osac.private.v1.IdentityProviderCondition.status:type_name -> osac.private.v1.ConditionStatus - 9, // 8: osac.private.v1.IdentityProviderCondition.last_transition_time:type_name -> google.protobuf.Timestamp - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 9, // 0: osac.private.v1.IdentityProvider.metadata:type_name -> osac.private.v1.Metadata + 3, // 1: osac.private.v1.IdentityProvider.spec:type_name -> osac.private.v1.IdentityProviderSpec + 6, // 2: osac.private.v1.IdentityProvider.status:type_name -> osac.private.v1.IdentityProviderStatus + 4, // 3: osac.private.v1.IdentityProviderSpec.oidc:type_name -> osac.private.v1.OidcConfig + 5, // 4: osac.private.v1.IdentityProviderSpec.ldap:type_name -> osac.private.v1.LdapConfig + 0, // 5: osac.private.v1.IdentityProviderStatus.phase:type_name -> osac.private.v1.IdentityProviderPhase + 7, // 6: osac.private.v1.IdentityProviderStatus.conditions:type_name -> osac.private.v1.IdentityProviderCondition + 10, // 7: osac.private.v1.IdentityProviderCondition.status:type_name -> osac.private.v1.ConditionStatus + 11, // 8: osac.private.v1.IdentityProviderCondition.last_transition_time:type_name -> google.protobuf.Timestamp + 1, // 9: osac.private.v1.IdentityProviderHealth.status:type_name -> osac.private.v1.IdentityProviderHealthStatus + 11, // 10: osac.private.v1.IdentityProviderHealth.last_checked:type_name -> google.protobuf.Timestamp + 11, // [11:11] is the sub-list for method output_type + 11, // [11:11] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_osac_private_v1_identity_provider_type_proto_init() } @@ -1610,13 +1813,14 @@ func file_osac_private_v1_identity_provider_type_proto_init() { } file_osac_private_v1_identity_provider_type_proto_msgTypes[2].OneofWrappers = []any{} file_osac_private_v1_identity_provider_type_proto_msgTypes[3].OneofWrappers = []any{} + file_osac_private_v1_identity_provider_type_proto_msgTypes[6].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_identity_provider_type_proto_rawDesc), len(file_osac_private_v1_identity_provider_type_proto_rawDesc)), - NumEnums: 1, - NumMessages: 6, + NumEnums: 2, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/api/osac/public/v1/identity_provider_logging.go b/internal/api/osac/public/v1/identity_provider_logging.go new file mode 100644 index 000000000..34c13b8ee --- /dev/null +++ b/internal/api/osac/public/v1/identity_provider_logging.go @@ -0,0 +1,40 @@ +/* +Copyright (c) 2026 Red Hat Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +package publicv1 + +import ( + "log/slog" +) + +// LogValue implements slog.LogValuer for IdentityProviderHealth to redact detailed error messages. +func (h *IdentityProviderHealth) LogValue() slog.Value { + if h == nil { + return slog.Value{} + } + + attrs := []slog.Attr{ + slog.String("status", h.Status.String()), + } + + if h.LastChecked != nil { + attrs = append(attrs, slog.Time("last_checked", h.LastChecked.AsTime())) + } + + // Redact message - may contain internal network details or error information + if h.Message != nil { + attrs = append(attrs, slog.Bool("has_message", true)) + } + + return slog.GroupValue(attrs...) +} diff --git a/internal/api/osac/public/v1/identity_provider_logging_test.go b/internal/api/osac/public/v1/identity_provider_logging_test.go new file mode 100644 index 000000000..a88e91696 --- /dev/null +++ b/internal/api/osac/public/v1/identity_provider_logging_test.go @@ -0,0 +1,53 @@ +/* +Copyright (c) 2026 Red Hat Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the +License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific +language governing permissions and limitations under the License. +*/ + +package publicv1 + +import ( + "bytes" + "log/slog" + "strings" + "testing" + "time" + + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestIdentityProviderHealth_LogValue(t *testing.T) { + message := "LDAP connection to ldap://internal-server.example.com:389 failed" + + health := &IdentityProviderHealth{ + Status: IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY, + Message: &message, + LastChecked: timestamppb.New(time.Now()), + } + + var buf bytes.Buffer + logger := slog.New(slog.NewJSONHandler(&buf, nil)) + logger.Info("health check", "health", health) + + logOutput := buf.String() + + // Verify internal network details are NOT in logs + if strings.Contains(logOutput, "internal-server") { + t.Errorf("internal network details should be redacted: %s", logOutput) + } + + // Verify status IS in logs + if !strings.Contains(logOutput, "UNHEALTHY") { + t.Errorf("status should be present: %s", logOutput) + } + if !strings.Contains(logOutput, "has_message") { + t.Errorf("has_message indicator should be present: %s", logOutput) + } +} diff --git a/internal/api/osac/public/v1/identity_provider_type.pb.go b/internal/api/osac/public/v1/identity_provider_type.pb.go index 9555e6c82..595414b58 100644 --- a/internal/api/osac/public/v1/identity_provider_type.pb.go +++ b/internal/api/osac/public/v1/identity_provider_type.pb.go @@ -24,7 +24,7 @@ package publicv1 import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/timestamppb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" unsafe "unsafe" ) @@ -88,6 +88,58 @@ func (x IdentityProviderPhase) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } +// IdentityProviderHealthStatus represents the health status of an identity provider. +type IdentityProviderHealthStatus int32 + +const ( + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED IdentityProviderHealthStatus = 0 + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY IdentityProviderHealthStatus = 1 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY IdentityProviderHealthStatus = 2 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN IdentityProviderHealthStatus = 3 +) + +// Enum value maps for IdentityProviderHealthStatus. +var ( + IdentityProviderHealthStatus_name = map[int32]string{ + 0: "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED", + 1: "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY", + 2: "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY", + 3: "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN", + } + IdentityProviderHealthStatus_value = map[string]int32{ + "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED": 0, + "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY": 1, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY": 2, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN": 3, + } +) + +func (x IdentityProviderHealthStatus) Enum() *IdentityProviderHealthStatus { + p := new(IdentityProviderHealthStatus) + *p = x + return p +} + +func (x IdentityProviderHealthStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdentityProviderHealthStatus) Descriptor() protoreflect.EnumDescriptor { + return file_osac_public_v1_identity_provider_type_proto_enumTypes[1].Descriptor() +} + +func (IdentityProviderHealthStatus) Type() protoreflect.EnumType { + return &file_osac_public_v1_identity_provider_type_proto_enumTypes[1] +} + +func (x IdentityProviderHealthStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + // IdentityProvider represents an external identity provider configuration. // Identity providers enable users to authenticate using their existing corporate credentials // (LDAP, Active Directory, OIDC, SAML, etc.) rather than managing separate credentials. @@ -251,9 +303,16 @@ type IdentityProviderSpec struct { // // *IdentityProviderSpec_Oidc // *IdentityProviderSpec_Ldap - Config isIdentityProviderSpec_Config `protobuf_oneof:"config"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Config isIdentityProviderSpec_Config `protobuf_oneof:"config"` + // This field is used to trigger a health check of the identity provider. + // The user can write any value here; the actual value doesn't matter. + // The only important thing is that when it changes, the system will eventually + // initiate a health check and report the result in the status. + // The user can set this to any string (e.g., a timestamp or random value) to request a new check. + // Common pattern: use a timestamp or increment a counter when requesting a check. + HealthCheckTrigger *string `protobuf:"bytes,6,opt,name=health_check_trigger,json=healthCheckTrigger,proto3,oneof" json:"health_check_trigger,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProviderSpec) Reset() { @@ -327,6 +386,13 @@ func (x *IdentityProviderSpec) GetLdap() *LdapConfig { return nil } +func (x *IdentityProviderSpec) GetHealthCheckTrigger() string { + if x != nil && x.HealthCheckTrigger != nil { + return *x.HealthCheckTrigger + } + return "" +} + func (x *IdentityProviderSpec) SetTitle(v string) { x.Title = v } @@ -355,6 +421,10 @@ func (x *IdentityProviderSpec) SetLdap(v *LdapConfig) { x.Config = &IdentityProviderSpec_Ldap{v} } +func (x *IdentityProviderSpec) SetHealthCheckTrigger(v string) { + x.HealthCheckTrigger = &v +} + func (x *IdentityProviderSpec) HasDescription() bool { if x == nil { return false @@ -385,6 +455,13 @@ func (x *IdentityProviderSpec) HasLdap() bool { return ok } +func (x *IdentityProviderSpec) HasHealthCheckTrigger() bool { + if x == nil { + return false + } + return x.HealthCheckTrigger != nil +} + func (x *IdentityProviderSpec) ClearDescription() { x.Description = nil } @@ -405,6 +482,10 @@ func (x *IdentityProviderSpec) ClearLdap() { } } +func (x *IdentityProviderSpec) ClearHealthCheckTrigger() { + x.HealthCheckTrigger = nil +} + const IdentityProviderSpec_Config_not_set_case case_IdentityProviderSpec_Config = 0 const IdentityProviderSpec_Oidc_case case_IdentityProviderSpec_Config = 4 const IdentityProviderSpec_Ldap_case case_IdentityProviderSpec_Config = 5 @@ -443,6 +524,13 @@ type IdentityProviderSpec_builder struct { // Configuration for LDAP providers. Ldap *LdapConfig // -- end of Config + // This field is used to trigger a health check of the identity provider. + // The user can write any value here; the actual value doesn't matter. + // The only important thing is that when it changes, the system will eventually + // initiate a health check and report the result in the status. + // The user can set this to any string (e.g., a timestamp or random value) to request a new check. + // Common pattern: use a timestamp or increment a counter when requesting a check. + HealthCheckTrigger *string } func (b0 IdentityProviderSpec_builder) Build() *IdentityProviderSpec { @@ -458,6 +546,7 @@ func (b0 IdentityProviderSpec_builder) Build() *IdentityProviderSpec { if b.Ldap != nil { x.Config = &IdentityProviderSpec_Ldap{b.Ldap} } + x.HealthCheckTrigger = b.HealthCheckTrigger return m0 } @@ -1158,7 +1247,15 @@ type IdentityProviderStatus struct { // Phase represents the current phase of the identity provider. Phase IdentityProviderPhase `protobuf:"varint,1,opt,name=phase,proto3,enum=osac.public.v1.IdentityProviderPhase" json:"phase,omitempty"` // Message provides additional context about the current status. - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + // This is used by the system to track when the spec.health_check_trigger has changed + // and to acknowledge that the health check process has started. + // The system will update it to match spec.health_check_trigger when the check begins. + // Users can compare this to spec.health_check_trigger to see if their check request has been acknowledged. + HealthCheckTrigger *string `protobuf:"bytes,3,opt,name=health_check_trigger,json=healthCheckTrigger,proto3,oneof" json:"health_check_trigger,omitempty"` + // Health check results from the last health check that completed. + // This is populated after a health check triggered by spec.health_check_trigger completes. + Health *IdentityProviderHealth `protobuf:"bytes,4,opt,name=health,proto3,oneof" json:"health,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1202,6 +1299,20 @@ func (x *IdentityProviderStatus) GetMessage() string { return "" } +func (x *IdentityProviderStatus) GetHealthCheckTrigger() string { + if x != nil && x.HealthCheckTrigger != nil { + return *x.HealthCheckTrigger + } + return "" +} + +func (x *IdentityProviderStatus) GetHealth() *IdentityProviderHealth { + if x != nil { + return x.Health + } + return nil +} + func (x *IdentityProviderStatus) SetPhase(v IdentityProviderPhase) { x.Phase = v } @@ -1210,6 +1321,36 @@ func (x *IdentityProviderStatus) SetMessage(v string) { x.Message = v } +func (x *IdentityProviderStatus) SetHealthCheckTrigger(v string) { + x.HealthCheckTrigger = &v +} + +func (x *IdentityProviderStatus) SetHealth(v *IdentityProviderHealth) { + x.Health = v +} + +func (x *IdentityProviderStatus) HasHealthCheckTrigger() bool { + if x == nil { + return false + } + return x.HealthCheckTrigger != nil +} + +func (x *IdentityProviderStatus) HasHealth() bool { + if x == nil { + return false + } + return x.Health != nil +} + +func (x *IdentityProviderStatus) ClearHealthCheckTrigger() { + x.HealthCheckTrigger = nil +} + +func (x *IdentityProviderStatus) ClearHealth() { + x.Health = nil +} + type IdentityProviderStatus_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -1217,6 +1358,14 @@ type IdentityProviderStatus_builder struct { Phase IdentityProviderPhase // Message provides additional context about the current status. Message string + // This is used by the system to track when the spec.health_check_trigger has changed + // and to acknowledge that the health check process has started. + // The system will update it to match spec.health_check_trigger when the check begins. + // Users can compare this to spec.health_check_trigger to see if their check request has been acknowledged. + HealthCheckTrigger *string + // Health check results from the last health check that completed. + // This is populated after a health check triggered by spec.health_check_trigger completes. + Health *IdentityProviderHealth } func (b0 IdentityProviderStatus_builder) Build() *IdentityProviderStatus { @@ -1225,6 +1374,122 @@ func (b0 IdentityProviderStatus_builder) Build() *IdentityProviderStatus { _, _ = b, x x.Phase = b.Phase x.Message = b.Message + x.HealthCheckTrigger = b.HealthCheckTrigger + x.Health = b.Health + return m0 +} + +// IdentityProviderHealth represents the health status of an identity provider. +type IdentityProviderHealth struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Status indicates the overall health status. + Status IdentityProviderHealthStatus `protobuf:"varint,1,opt,name=status,proto3,enum=osac.public.v1.IdentityProviderHealthStatus" json:"status,omitempty"` + // Message provides details about the health status. + Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"` + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_checked,json=lastChecked,proto3" json:"last_checked,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProviderHealth) Reset() { + *x = IdentityProviderHealth{} + mi := &file_osac_public_v1_identity_provider_type_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProviderHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProviderHealth) ProtoMessage() {} + +func (x *IdentityProviderHealth) ProtoReflect() protoreflect.Message { + mi := &file_osac_public_v1_identity_provider_type_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *IdentityProviderHealth) GetStatus() IdentityProviderHealthStatus { + if x != nil { + return x.Status + } + return IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED +} + +func (x *IdentityProviderHealth) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +func (x *IdentityProviderHealth) GetLastChecked() *timestamppb.Timestamp { + if x != nil { + return x.LastChecked + } + return nil +} + +func (x *IdentityProviderHealth) SetStatus(v IdentityProviderHealthStatus) { + x.Status = v +} + +func (x *IdentityProviderHealth) SetMessage(v string) { + x.Message = &v +} + +func (x *IdentityProviderHealth) SetLastChecked(v *timestamppb.Timestamp) { + x.LastChecked = v +} + +func (x *IdentityProviderHealth) HasMessage() bool { + if x == nil { + return false + } + return x.Message != nil +} + +func (x *IdentityProviderHealth) HasLastChecked() bool { + if x == nil { + return false + } + return x.LastChecked != nil +} + +func (x *IdentityProviderHealth) ClearMessage() { + x.Message = nil +} + +func (x *IdentityProviderHealth) ClearLastChecked() { + x.LastChecked = nil +} + +type IdentityProviderHealth_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Status indicates the overall health status. + Status IdentityProviderHealthStatus + // Message provides details about the health status. + Message *string + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp +} + +func (b0 IdentityProviderHealth_builder) Build() *IdentityProviderHealth { + m0 := &IdentityProviderHealth{} + b, x := &b0, m0 + _, _ = b, x + x.Status = b.Status + x.Message = b.Message + x.LastChecked = b.LastChecked return m0 } @@ -1236,119 +1501,144 @@ var file_osac_public_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, - 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x6f, 0x73, 0x61, 0x63, - 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, - 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x73, 0x61, 0x63, - 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x73, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, + 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x14, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x30, 0x0a, 0x04, 0x6c, 0x64, 0x61, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x03, 0x0a, 0x0a, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, - 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, - 0x08, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x02, 0x52, 0x07, 0x6a, 0x77, 0x6b, 0x73, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, - 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x11, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x55, - 0x72, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6a, - 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0xa3, 0x05, - 0x0a, 0x0a, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x64, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x64, 0x44, 0x6e, 0x12, 0x27, 0x0a, 0x0f, - 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x73, 0x5f, 0x64, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x73, 0x44, 0x6e, - 0x12, 0x3b, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x64, 0x61, - 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4c, 0x64, 0x61, - 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, - 0x12, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x72, 0x64, 0x6e, - 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x33, 0x0a, 0x13, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x11, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, - 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, - 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, - 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x75, 0x73, 0x65, - 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x70, 0x69, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x10, 0x75, 0x73, 0x65, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x70, 0x69, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x07, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, - 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, - 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x73, 0x70, 0x69, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, - 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6f, - 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, - 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xbb, 0x02, 0x0a, 0x14, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6f, + 0x69, 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x30, 0x0a, + 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x64, 0x61, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x12, + 0x35, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xd5, 0x03, 0x0a, 0x0a, 0x4f, 0x69, + 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, + 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x0e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x6a, 0x77, 0x6b, 0x73, 0x55, 0x72, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x32, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, + 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x09, 0x6c, 0x6f, 0x67, + 0x6f, 0x75, 0x74, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, + 0x6c, 0x22, 0xa3, 0x05, 0x0a, 0x0a, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x5f, + 0x64, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x64, 0x44, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x5f, 0x64, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x44, 0x6e, 0x12, 0x3b, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x31, 0x0a, 0x12, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x10, 0x72, 0x64, 0x6e, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, 0x61, + 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x11, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x04, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x1b, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x05, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, + 0x12, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x73, 0x70, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x10, 0x75, 0x73, 0x65, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x70, 0x69, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x70, 0x69, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x02, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x14, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x43, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x22, 0xc8, 0x01, 0x0a, 0x16, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, + 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, @@ -1360,46 +1650,66 @@ var file_osac_public_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x03, 0x42, 0xdd, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, - 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x3b, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, - 0x0e, 0x4f, 0x73, 0x61, 0x63, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x0f, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x1b, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x10, 0x4f, 0x73, 0x61, 0x63, 0x3a, 0x3a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x10, 0x03, 0x2a, 0xd8, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, + 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, + 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, + 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xdd, 0x01, + 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x73, 0x61, 0x63, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x4f, 0x73, 0x61, + 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x4f, + 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x4f, 0x73, 0x61, + 0x63, 0x3a, 0x3a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_osac_public_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_osac_public_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_osac_public_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_public_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_osac_public_v1_identity_provider_type_proto_goTypes = []any{ - (IdentityProviderPhase)(0), // 0: osac.public.v1.IdentityProviderPhase - (*IdentityProvider)(nil), // 1: osac.public.v1.IdentityProvider - (*IdentityProviderSpec)(nil), // 2: osac.public.v1.IdentityProviderSpec - (*OidcConfig)(nil), // 3: osac.public.v1.OidcConfig - (*LdapConfig)(nil), // 4: osac.public.v1.LdapConfig - (*IdentityProviderStatus)(nil), // 5: osac.public.v1.IdentityProviderStatus - (*Metadata)(nil), // 6: osac.public.v1.Metadata + (IdentityProviderPhase)(0), // 0: osac.public.v1.IdentityProviderPhase + (IdentityProviderHealthStatus)(0), // 1: osac.public.v1.IdentityProviderHealthStatus + (*IdentityProvider)(nil), // 2: osac.public.v1.IdentityProvider + (*IdentityProviderSpec)(nil), // 3: osac.public.v1.IdentityProviderSpec + (*OidcConfig)(nil), // 4: osac.public.v1.OidcConfig + (*LdapConfig)(nil), // 5: osac.public.v1.LdapConfig + (*IdentityProviderStatus)(nil), // 6: osac.public.v1.IdentityProviderStatus + (*IdentityProviderHealth)(nil), // 7: osac.public.v1.IdentityProviderHealth + (*Metadata)(nil), // 8: osac.public.v1.Metadata + (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp } var file_osac_public_v1_identity_provider_type_proto_depIdxs = []int32{ - 6, // 0: osac.public.v1.IdentityProvider.metadata:type_name -> osac.public.v1.Metadata - 2, // 1: osac.public.v1.IdentityProvider.spec:type_name -> osac.public.v1.IdentityProviderSpec - 5, // 2: osac.public.v1.IdentityProvider.status:type_name -> osac.public.v1.IdentityProviderStatus - 3, // 3: osac.public.v1.IdentityProviderSpec.oidc:type_name -> osac.public.v1.OidcConfig - 4, // 4: osac.public.v1.IdentityProviderSpec.ldap:type_name -> osac.public.v1.LdapConfig + 8, // 0: osac.public.v1.IdentityProvider.metadata:type_name -> osac.public.v1.Metadata + 3, // 1: osac.public.v1.IdentityProvider.spec:type_name -> osac.public.v1.IdentityProviderSpec + 6, // 2: osac.public.v1.IdentityProvider.status:type_name -> osac.public.v1.IdentityProviderStatus + 4, // 3: osac.public.v1.IdentityProviderSpec.oidc:type_name -> osac.public.v1.OidcConfig + 5, // 4: osac.public.v1.IdentityProviderSpec.ldap:type_name -> osac.public.v1.LdapConfig 0, // 5: osac.public.v1.IdentityProviderStatus.phase:type_name -> osac.public.v1.IdentityProviderPhase - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 7, // 6: osac.public.v1.IdentityProviderStatus.health:type_name -> osac.public.v1.IdentityProviderHealth + 1, // 7: osac.public.v1.IdentityProviderHealth.status:type_name -> osac.public.v1.IdentityProviderHealthStatus + 9, // 8: osac.public.v1.IdentityProviderHealth.last_checked:type_name -> google.protobuf.Timestamp + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_osac_public_v1_identity_provider_type_proto_init() } @@ -1407,7 +1717,6 @@ func file_osac_public_v1_identity_provider_type_proto_init() { if File_osac_public_v1_identity_provider_type_proto != nil { return } - file_osac_public_v1_condition_status_type_proto_init() file_osac_public_v1_metadata_type_proto_init() file_osac_public_v1_identity_provider_type_proto_msgTypes[1].OneofWrappers = []any{ (*IdentityProviderSpec_Oidc)(nil), @@ -1415,13 +1724,15 @@ func file_osac_public_v1_identity_provider_type_proto_init() { } file_osac_public_v1_identity_provider_type_proto_msgTypes[2].OneofWrappers = []any{} file_osac_public_v1_identity_provider_type_proto_msgTypes[3].OneofWrappers = []any{} + file_osac_public_v1_identity_provider_type_proto_msgTypes[4].OneofWrappers = []any{} + file_osac_public_v1_identity_provider_type_proto_msgTypes[5].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_public_v1_identity_provider_type_proto_rawDesc), len(file_osac_public_v1_identity_provider_type_proto_rawDesc)), - NumEnums: 1, - NumMessages: 5, + NumEnums: 2, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/internal/api/osac/public/v1/identity_provider_type_protoopaque.pb.go b/internal/api/osac/public/v1/identity_provider_type_protoopaque.pb.go index c57895de1..97a63f34e 100644 --- a/internal/api/osac/public/v1/identity_provider_type_protoopaque.pb.go +++ b/internal/api/osac/public/v1/identity_provider_type_protoopaque.pb.go @@ -24,7 +24,7 @@ package publicv1 import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - _ "google.golang.org/protobuf/types/known/timestamppb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" unsafe "unsafe" ) @@ -88,6 +88,58 @@ func (x IdentityProviderPhase) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } +// IdentityProviderHealthStatus represents the health status of an identity provider. +type IdentityProviderHealthStatus int32 + +const ( + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED IdentityProviderHealthStatus = 0 + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY IdentityProviderHealthStatus = 1 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY IdentityProviderHealthStatus = 2 + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN IdentityProviderHealthStatus = 3 +) + +// Enum value maps for IdentityProviderHealthStatus. +var ( + IdentityProviderHealthStatus_name = map[int32]string{ + 0: "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED", + 1: "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY", + 2: "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY", + 3: "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN", + } + IdentityProviderHealthStatus_value = map[string]int32{ + "IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED": 0, + "IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY": 1, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY": 2, + "IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN": 3, + } +) + +func (x IdentityProviderHealthStatus) Enum() *IdentityProviderHealthStatus { + p := new(IdentityProviderHealthStatus) + *p = x + return p +} + +func (x IdentityProviderHealthStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IdentityProviderHealthStatus) Descriptor() protoreflect.EnumDescriptor { + return file_osac_public_v1_identity_provider_type_proto_enumTypes[1].Descriptor() +} + +func (IdentityProviderHealthStatus) Type() protoreflect.EnumType { + return &file_osac_public_v1_identity_provider_type_proto_enumTypes[1] +} + +func (x IdentityProviderHealthStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + // IdentityProvider represents an external identity provider configuration. // Identity providers enable users to authenticate using their existing corporate credentials // (LDAP, Active Directory, OIDC, SAML, etc.) rather than managing separate credentials. @@ -230,15 +282,16 @@ func (b0 IdentityProvider_builder) Build() *IdentityProvider { // IdentityProviderSpec represents the desired state of an identity provider. type IdentityProviderSpec struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Title string `protobuf:"bytes,1,opt,name=title,proto3"` - xxx_hidden_Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof"` - xxx_hidden_Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3"` - xxx_hidden_Config isIdentityProviderSpec_Config `protobuf_oneof:"config"` - XXX_raceDetectHookData protoimpl.RaceDetectHookData - XXX_presence [1]uint32 - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Title string `protobuf:"bytes,1,opt,name=title,proto3"` + xxx_hidden_Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof"` + xxx_hidden_Enabled bool `protobuf:"varint,3,opt,name=enabled,proto3"` + xxx_hidden_Config isIdentityProviderSpec_Config `protobuf_oneof:"config"` + xxx_hidden_HealthCheckTrigger *string `protobuf:"bytes,6,opt,name=health_check_trigger,json=healthCheckTrigger,proto3,oneof"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProviderSpec) Reset() { @@ -308,13 +361,23 @@ func (x *IdentityProviderSpec) GetLdap() *LdapConfig { return nil } +func (x *IdentityProviderSpec) GetHealthCheckTrigger() string { + if x != nil { + if x.xxx_hidden_HealthCheckTrigger != nil { + return *x.xxx_hidden_HealthCheckTrigger + } + return "" + } + return "" +} + func (x *IdentityProviderSpec) SetTitle(v string) { x.xxx_hidden_Title = v } func (x *IdentityProviderSpec) SetDescription(v string) { x.xxx_hidden_Description = &v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 4) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 5) } func (x *IdentityProviderSpec) SetEnabled(v bool) { @@ -337,6 +400,11 @@ func (x *IdentityProviderSpec) SetLdap(v *LdapConfig) { x.xxx_hidden_Config = &identityProviderSpec_Ldap{v} } +func (x *IdentityProviderSpec) SetHealthCheckTrigger(v string) { + x.xxx_hidden_HealthCheckTrigger = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 5) +} + func (x *IdentityProviderSpec) HasDescription() bool { if x == nil { return false @@ -367,6 +435,13 @@ func (x *IdentityProviderSpec) HasLdap() bool { return ok } +func (x *IdentityProviderSpec) HasHealthCheckTrigger() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 4) +} + func (x *IdentityProviderSpec) ClearDescription() { protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) x.xxx_hidden_Description = nil @@ -388,6 +463,11 @@ func (x *IdentityProviderSpec) ClearLdap() { } } +func (x *IdentityProviderSpec) ClearHealthCheckTrigger() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 4) + x.xxx_hidden_HealthCheckTrigger = nil +} + const IdentityProviderSpec_Config_not_set_case case_IdentityProviderSpec_Config = 0 const IdentityProviderSpec_Oidc_case case_IdentityProviderSpec_Config = 4 const IdentityProviderSpec_Ldap_case case_IdentityProviderSpec_Config = 5 @@ -426,6 +506,13 @@ type IdentityProviderSpec_builder struct { // Configuration for LDAP providers. Ldap *LdapConfig // -- end of xxx_hidden_Config + // This field is used to trigger a health check of the identity provider. + // The user can write any value here; the actual value doesn't matter. + // The only important thing is that when it changes, the system will eventually + // initiate a health check and report the result in the status. + // The user can set this to any string (e.g., a timestamp or random value) to request a new check. + // Common pattern: use a timestamp or increment a counter when requesting a check. + HealthCheckTrigger *string } func (b0 IdentityProviderSpec_builder) Build() *IdentityProviderSpec { @@ -434,7 +521,7 @@ func (b0 IdentityProviderSpec_builder) Build() *IdentityProviderSpec { _, _ = b, x x.xxx_hidden_Title = b.Title if b.Description != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 4) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 5) x.xxx_hidden_Description = b.Description } x.xxx_hidden_Enabled = b.Enabled @@ -444,6 +531,10 @@ func (b0 IdentityProviderSpec_builder) Build() *IdentityProviderSpec { if b.Ldap != nil { x.xxx_hidden_Config = &identityProviderSpec_Ldap{b.Ldap} } + if b.HealthCheckTrigger != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 5) + x.xxx_hidden_HealthCheckTrigger = b.HealthCheckTrigger + } return m0 } @@ -1177,11 +1268,15 @@ func (b0 LdapConfig_builder) Build() *LdapConfig { // IdentityProviderStatus represents the operational status of an identity provider. type IdentityProviderStatus struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Phase IdentityProviderPhase `protobuf:"varint,1,opt,name=phase,proto3,enum=osac.public.v1.IdentityProviderPhase"` - xxx_hidden_Message string `protobuf:"bytes,2,opt,name=message,proto3"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Phase IdentityProviderPhase `protobuf:"varint,1,opt,name=phase,proto3,enum=osac.public.v1.IdentityProviderPhase"` + xxx_hidden_Message string `protobuf:"bytes,2,opt,name=message,proto3"` + xxx_hidden_HealthCheckTrigger *string `protobuf:"bytes,3,opt,name=health_check_trigger,json=healthCheckTrigger,proto3,oneof"` + xxx_hidden_Health *IdentityProviderHealth `protobuf:"bytes,4,opt,name=health,proto3,oneof"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProviderStatus) Reset() { @@ -1223,6 +1318,23 @@ func (x *IdentityProviderStatus) GetMessage() string { return "" } +func (x *IdentityProviderStatus) GetHealthCheckTrigger() string { + if x != nil { + if x.xxx_hidden_HealthCheckTrigger != nil { + return *x.xxx_hidden_HealthCheckTrigger + } + return "" + } + return "" +} + +func (x *IdentityProviderStatus) GetHealth() *IdentityProviderHealth { + if x != nil { + return x.xxx_hidden_Health + } + return nil +} + func (x *IdentityProviderStatus) SetPhase(v IdentityProviderPhase) { x.xxx_hidden_Phase = v } @@ -1231,6 +1343,38 @@ func (x *IdentityProviderStatus) SetMessage(v string) { x.xxx_hidden_Message = v } +func (x *IdentityProviderStatus) SetHealthCheckTrigger(v string) { + x.xxx_hidden_HealthCheckTrigger = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 4) +} + +func (x *IdentityProviderStatus) SetHealth(v *IdentityProviderHealth) { + x.xxx_hidden_Health = v +} + +func (x *IdentityProviderStatus) HasHealthCheckTrigger() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 2) +} + +func (x *IdentityProviderStatus) HasHealth() bool { + if x == nil { + return false + } + return x.xxx_hidden_Health != nil +} + +func (x *IdentityProviderStatus) ClearHealthCheckTrigger() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2) + x.xxx_hidden_HealthCheckTrigger = nil +} + +func (x *IdentityProviderStatus) ClearHealth() { + x.xxx_hidden_Health = nil +} + type IdentityProviderStatus_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -1238,6 +1382,14 @@ type IdentityProviderStatus_builder struct { Phase IdentityProviderPhase // Message provides additional context about the current status. Message string + // This is used by the system to track when the spec.health_check_trigger has changed + // and to acknowledge that the health check process has started. + // The system will update it to match spec.health_check_trigger when the check begins. + // Users can compare this to spec.health_check_trigger to see if their check request has been acknowledged. + HealthCheckTrigger *string + // Health check results from the last health check that completed. + // This is populated after a health check triggered by spec.health_check_trigger completes. + Health *IdentityProviderHealth } func (b0 IdentityProviderStatus_builder) Build() *IdentityProviderStatus { @@ -1246,6 +1398,132 @@ func (b0 IdentityProviderStatus_builder) Build() *IdentityProviderStatus { _, _ = b, x x.xxx_hidden_Phase = b.Phase x.xxx_hidden_Message = b.Message + if b.HealthCheckTrigger != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 4) + x.xxx_hidden_HealthCheckTrigger = b.HealthCheckTrigger + } + x.xxx_hidden_Health = b.Health + return m0 +} + +// IdentityProviderHealth represents the health status of an identity provider. +type IdentityProviderHealth struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Status IdentityProviderHealthStatus `protobuf:"varint,1,opt,name=status,proto3,enum=osac.public.v1.IdentityProviderHealthStatus"` + xxx_hidden_Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof"` + xxx_hidden_LastChecked *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_checked,json=lastChecked,proto3"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProviderHealth) Reset() { + *x = IdentityProviderHealth{} + mi := &file_osac_public_v1_identity_provider_type_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProviderHealth) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProviderHealth) ProtoMessage() {} + +func (x *IdentityProviderHealth) ProtoReflect() protoreflect.Message { + mi := &file_osac_public_v1_identity_provider_type_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *IdentityProviderHealth) GetStatus() IdentityProviderHealthStatus { + if x != nil { + return x.xxx_hidden_Status + } + return IdentityProviderHealthStatus_IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED +} + +func (x *IdentityProviderHealth) GetMessage() string { + if x != nil { + if x.xxx_hidden_Message != nil { + return *x.xxx_hidden_Message + } + return "" + } + return "" +} + +func (x *IdentityProviderHealth) GetLastChecked() *timestamppb.Timestamp { + if x != nil { + return x.xxx_hidden_LastChecked + } + return nil +} + +func (x *IdentityProviderHealth) SetStatus(v IdentityProviderHealthStatus) { + x.xxx_hidden_Status = v +} + +func (x *IdentityProviderHealth) SetMessage(v string) { + x.xxx_hidden_Message = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 3) +} + +func (x *IdentityProviderHealth) SetLastChecked(v *timestamppb.Timestamp) { + x.xxx_hidden_LastChecked = v +} + +func (x *IdentityProviderHealth) HasMessage() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *IdentityProviderHealth) HasLastChecked() bool { + if x == nil { + return false + } + return x.xxx_hidden_LastChecked != nil +} + +func (x *IdentityProviderHealth) ClearMessage() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Message = nil +} + +func (x *IdentityProviderHealth) ClearLastChecked() { + x.xxx_hidden_LastChecked = nil +} + +type IdentityProviderHealth_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Status indicates the overall health status. + Status IdentityProviderHealthStatus + // Message provides details about the health status. + Message *string + // LastChecked is when the health was last checked. + LastChecked *timestamppb.Timestamp +} + +func (b0 IdentityProviderHealth_builder) Build() *IdentityProviderHealth { + m0 := &IdentityProviderHealth{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Status = b.Status + if b.Message != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 3) + x.xxx_hidden_Message = b.Message + } + x.xxx_hidden_LastChecked = b.LastChecked return m0 } @@ -1257,119 +1535,144 @@ var file_osac_public_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2a, - 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, 0x6f, 0x73, 0x61, 0x63, - 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, - 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x73, 0x61, 0x63, - 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, - 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x73, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x22, + 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x2f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xd6, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, + 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xeb, 0x01, 0x0a, 0x14, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x30, 0x0a, 0x04, 0x6c, 0x64, 0x61, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd5, 0x03, 0x0a, 0x0a, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, - 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, - 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x0e, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x1e, 0x0a, - 0x08, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x02, 0x52, 0x07, 0x6a, 0x77, 0x6b, 0x73, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, - 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x11, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x55, - 0x72, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6a, - 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0xa3, 0x05, - 0x0a, 0x0a, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x64, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x64, 0x44, 0x6e, 0x12, 0x27, 0x0a, 0x0f, - 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x73, 0x5f, 0x64, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, 0x73, 0x44, 0x6e, - 0x12, 0x3b, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x64, 0x61, - 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x4c, 0x64, 0x61, - 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, - 0x12, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x72, 0x64, 0x6e, - 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x33, 0x0a, 0x13, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x11, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, - 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, - 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x06, - 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x75, 0x73, 0x65, - 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x70, 0x69, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x10, 0x75, 0x73, 0x65, 0x54, 0x72, 0x75, 0x73, - 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x70, 0x69, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x07, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, - 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, - 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x42, 0x15, 0x0a, - 0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x73, 0x70, 0x69, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, - 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6f, - 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, - 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xbb, 0x02, 0x0a, 0x14, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x6f, + 0x69, 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x30, 0x0a, + 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x64, 0x61, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x12, + 0x35, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, + 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0xd5, 0x03, 0x0a, 0x0a, 0x4f, 0x69, + 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x55, + 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x0e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x01, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x72, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x1e, 0x0a, 0x08, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x07, 0x6a, 0x77, 0x6b, 0x73, 0x55, 0x72, 0x6c, 0x88, 0x01, + 0x01, 0x12, 0x32, 0x0a, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, + 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x09, 0x6c, 0x6f, 0x67, + 0x6f, 0x75, 0x74, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x6a, 0x77, 0x6b, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x15, 0x0a, 0x13, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, + 0x6c, 0x22, 0xa3, 0x05, 0x0a, 0x0a, 0x4c, 0x64, 0x61, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x69, 0x6e, 0x64, 0x5f, + 0x64, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x64, 0x44, 0x6e, + 0x12, 0x27, 0x0a, 0x0f, 0x62, 0x69, 0x6e, 0x64, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x62, 0x69, 0x6e, 0x64, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x5f, 0x64, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x44, 0x6e, 0x12, 0x3b, 0x0a, 0x17, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x31, 0x0a, 0x12, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, + 0x10, 0x72, 0x64, 0x6e, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x75, 0x69, 0x64, 0x5f, 0x6c, 0x64, 0x61, + 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x02, 0x52, 0x11, 0x75, 0x75, 0x69, 0x64, 0x4c, 0x64, 0x61, 0x70, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x13, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x11, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x04, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x1b, 0x0a, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x05, 0x52, 0x06, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, + 0x12, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x73, 0x70, 0x69, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x10, 0x75, 0x73, 0x65, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x70, 0x69, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x72, 0x64, 0x6e, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x5f, 0x6c, 0x64, 0x61, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x76, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x75, 0x73, 0x65, 0x5f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x70, 0x69, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x02, 0x0a, 0x16, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, + 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x52, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x35, 0x0a, 0x14, 0x68, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x12, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x43, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, + 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x48, 0x01, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x22, 0xc8, 0x01, 0x0a, 0x16, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x12, 0x44, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, + 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xab, 0x01, 0x0a, 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x50, 0x68, 0x61, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, @@ -1381,46 +1684,66 @@ var file_osac_public_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x48, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, - 0x10, 0x03, 0x42, 0xdd, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, - 0x66, 0x75, 0x6c, 0x66, 0x69, 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x3b, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, - 0x0e, 0x4f, 0x73, 0x61, 0x63, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x56, 0x31, 0xca, - 0x02, 0x0f, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, - 0x31, 0xe2, 0x02, 0x1b, 0x4f, 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, - 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x10, 0x4f, 0x73, 0x61, 0x63, 0x3a, 0x3a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x10, 0x03, 0x2a, 0xd8, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, + 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, + 0x01, 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x59, 0x10, 0x02, + 0x12, 0x2b, 0x0a, 0x27, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x45, 0x41, 0x4c, 0x54, 0x48, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x42, 0xdd, 0x01, + 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x2e, 0x76, 0x31, 0x42, 0x19, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x66, 0x75, 0x6c, 0x66, 0x69, + 0x6c, 0x6c, 0x6d, 0x65, 0x6e, 0x74, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x50, 0x58, 0xaa, 0x02, 0x0e, 0x4f, 0x73, 0x61, 0x63, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0f, 0x4f, 0x73, 0x61, + 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1b, 0x4f, + 0x73, 0x61, 0x63, 0x5c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x5c, 0x56, 0x31, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x4f, 0x73, 0x61, + 0x63, 0x3a, 0x3a, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_osac_public_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_osac_public_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_osac_public_v1_identity_provider_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_public_v1_identity_provider_type_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_osac_public_v1_identity_provider_type_proto_goTypes = []any{ - (IdentityProviderPhase)(0), // 0: osac.public.v1.IdentityProviderPhase - (*IdentityProvider)(nil), // 1: osac.public.v1.IdentityProvider - (*IdentityProviderSpec)(nil), // 2: osac.public.v1.IdentityProviderSpec - (*OidcConfig)(nil), // 3: osac.public.v1.OidcConfig - (*LdapConfig)(nil), // 4: osac.public.v1.LdapConfig - (*IdentityProviderStatus)(nil), // 5: osac.public.v1.IdentityProviderStatus - (*Metadata)(nil), // 6: osac.public.v1.Metadata + (IdentityProviderPhase)(0), // 0: osac.public.v1.IdentityProviderPhase + (IdentityProviderHealthStatus)(0), // 1: osac.public.v1.IdentityProviderHealthStatus + (*IdentityProvider)(nil), // 2: osac.public.v1.IdentityProvider + (*IdentityProviderSpec)(nil), // 3: osac.public.v1.IdentityProviderSpec + (*OidcConfig)(nil), // 4: osac.public.v1.OidcConfig + (*LdapConfig)(nil), // 5: osac.public.v1.LdapConfig + (*IdentityProviderStatus)(nil), // 6: osac.public.v1.IdentityProviderStatus + (*IdentityProviderHealth)(nil), // 7: osac.public.v1.IdentityProviderHealth + (*Metadata)(nil), // 8: osac.public.v1.Metadata + (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp } var file_osac_public_v1_identity_provider_type_proto_depIdxs = []int32{ - 6, // 0: osac.public.v1.IdentityProvider.metadata:type_name -> osac.public.v1.Metadata - 2, // 1: osac.public.v1.IdentityProvider.spec:type_name -> osac.public.v1.IdentityProviderSpec - 5, // 2: osac.public.v1.IdentityProvider.status:type_name -> osac.public.v1.IdentityProviderStatus - 3, // 3: osac.public.v1.IdentityProviderSpec.oidc:type_name -> osac.public.v1.OidcConfig - 4, // 4: osac.public.v1.IdentityProviderSpec.ldap:type_name -> osac.public.v1.LdapConfig + 8, // 0: osac.public.v1.IdentityProvider.metadata:type_name -> osac.public.v1.Metadata + 3, // 1: osac.public.v1.IdentityProvider.spec:type_name -> osac.public.v1.IdentityProviderSpec + 6, // 2: osac.public.v1.IdentityProvider.status:type_name -> osac.public.v1.IdentityProviderStatus + 4, // 3: osac.public.v1.IdentityProviderSpec.oidc:type_name -> osac.public.v1.OidcConfig + 5, // 4: osac.public.v1.IdentityProviderSpec.ldap:type_name -> osac.public.v1.LdapConfig 0, // 5: osac.public.v1.IdentityProviderStatus.phase:type_name -> osac.public.v1.IdentityProviderPhase - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 7, // 6: osac.public.v1.IdentityProviderStatus.health:type_name -> osac.public.v1.IdentityProviderHealth + 1, // 7: osac.public.v1.IdentityProviderHealth.status:type_name -> osac.public.v1.IdentityProviderHealthStatus + 9, // 8: osac.public.v1.IdentityProviderHealth.last_checked:type_name -> google.protobuf.Timestamp + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_osac_public_v1_identity_provider_type_proto_init() } @@ -1428,7 +1751,6 @@ func file_osac_public_v1_identity_provider_type_proto_init() { if File_osac_public_v1_identity_provider_type_proto != nil { return } - file_osac_public_v1_condition_status_type_proto_init() file_osac_public_v1_metadata_type_proto_init() file_osac_public_v1_identity_provider_type_proto_msgTypes[1].OneofWrappers = []any{ (*identityProviderSpec_Oidc)(nil), @@ -1436,13 +1758,15 @@ func file_osac_public_v1_identity_provider_type_proto_init() { } file_osac_public_v1_identity_provider_type_proto_msgTypes[2].OneofWrappers = []any{} file_osac_public_v1_identity_provider_type_proto_msgTypes[3].OneofWrappers = []any{} + file_osac_public_v1_identity_provider_type_proto_msgTypes[4].OneofWrappers = []any{} + file_osac_public_v1_identity_provider_type_proto_msgTypes[5].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_public_v1_identity_provider_type_proto_rawDesc), len(file_osac_public_v1_identity_provider_type_proto_rawDesc)), - NumEnums: 1, - NumMessages: 5, + NumEnums: 2, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/private/osac/private/v1/identity_provider_type.proto b/proto/private/osac/private/v1/identity_provider_type.proto index 63eeca71c..91b081889 100644 --- a/proto/private/osac/private/v1/identity_provider_type.proto +++ b/proto/private/osac/private/v1/identity_provider_type.proto @@ -217,3 +217,30 @@ message IdentityProviderCondition { // LastTransitionTime is the last time the condition transitioned from one status to another. google.protobuf.Timestamp last_transition_time = 5; } + +// IdentityProviderHealthStatus represents the health status of an identity provider. +enum IdentityProviderHealthStatus { + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED = 0; + + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY = 1; + + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY = 2; + + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN = 3; +} + +// IdentityProviderHealth represents the health status of an identity provider. +message IdentityProviderHealth { + // Status indicates the overall health status. + IdentityProviderHealthStatus status = 1; + + // Message provides details about the health status. + optional string message = 2; + + // LastChecked is when the health was last checked. + google.protobuf.Timestamp last_checked = 3; +} diff --git a/proto/public/osac/public/v1/identity_provider_type.proto b/proto/public/osac/public/v1/identity_provider_type.proto index 0c4f1a476..a1965a454 100644 --- a/proto/public/osac/public/v1/identity_provider_type.proto +++ b/proto/public/osac/public/v1/identity_provider_type.proto @@ -16,7 +16,6 @@ syntax = "proto3"; package osac.public.v1; import "google/protobuf/timestamp.proto"; -import "osac/public/v1/condition_status_type.proto"; import "osac/public/v1/metadata_type.proto"; // IdentityProvider represents an external identity provider configuration. @@ -59,6 +58,14 @@ message IdentityProviderSpec { // Configuration for LDAP providers. LdapConfig ldap = 5; } + + // This field is used to trigger a health check of the identity provider. + // The user can write any value here; the actual value doesn't matter. + // The only important thing is that when it changes, the system will eventually + // initiate a health check and report the result in the status. + // The user can set this to any string (e.g., a timestamp or random value) to request a new check. + // Common pattern: use a timestamp or increment a counter when requesting a check. + optional string health_check_trigger = 6; } // OidcConfig contains configuration for OpenID Connect identity providers. @@ -195,4 +202,41 @@ message IdentityProviderStatus { // Message provides additional context about the current status. string message = 2; + + // This is used by the system to track when the spec.health_check_trigger has changed + // and to acknowledge that the health check process has started. + // The system will update it to match spec.health_check_trigger when the check begins. + // Users can compare this to spec.health_check_trigger to see if their check request has been acknowledged. + optional string health_check_trigger = 3; + + // Health check results from the last health check that completed. + // This is populated after a health check triggered by spec.health_check_trigger completes. + optional IdentityProviderHealth health = 4; +} + +// IdentityProviderHealthStatus represents the health status of an identity provider. +enum IdentityProviderHealthStatus { + // IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED is the default value. + IDENTITY_PROVIDER_HEALTH_STATUS_UNSPECIFIED = 0; + + // IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY indicates the IdP is healthy. + IDENTITY_PROVIDER_HEALTH_STATUS_HEALTHY = 1; + + // IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY indicates the IdP is unhealthy. + IDENTITY_PROVIDER_HEALTH_STATUS_UNHEALTHY = 2; + + // IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN indicates the health status is unknown. + IDENTITY_PROVIDER_HEALTH_STATUS_UNKNOWN = 3; +} + +// IdentityProviderHealth represents the health status of an identity provider. +message IdentityProviderHealth { + // Status indicates the overall health status. + IdentityProviderHealthStatus status = 1; + + // Message provides details about the health status. + optional string message = 2; + + // LastChecked is when the health was last checked. + google.protobuf.Timestamp last_checked = 3; }