diff --git a/api/v1alpha1/externalip_conditions.go b/api/v1alpha1/externalip_conditions.go new file mode 100644 index 00000000..84171579 --- /dev/null +++ b/api/v1alpha1/externalip_conditions.go @@ -0,0 +1,41 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPConditionType is a valid value for .status.conditions.type +type ExternalIPConditionType string + +const ( + // ExternalIPConditionConfigurationApplied indicates whether the controller + // has processed the current spec version + ExternalIPConditionConfigurationApplied ExternalIPConditionType = "ConfigurationApplied" +) + +// GetExternalIPStatusCondition returns the condition with the specified type from the ExternalIP status +func GetExternalIPStatusCondition(ip *ExternalIP, conditionType ExternalIPConditionType) *metav1.Condition { + return meta.FindStatusCondition(ip.Status.Conditions, string(conditionType)) +} + +// SetExternalIPStatusCondition sets the condition with the specified type in the ExternalIP status +func SetExternalIPStatusCondition(ip *ExternalIP, condition metav1.Condition) { + meta.SetStatusCondition(&ip.Status.Conditions, condition) +} diff --git a/api/v1alpha1/externalip_types.go b/api/v1alpha1/externalip_types.go new file mode 100644 index 00000000..ea57d293 --- /dev/null +++ b/api/v1alpha1/externalip_types.go @@ -0,0 +1,137 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPSpec defines the desired state of ExternalIP +type ExternalIPSpec struct { + // Pool is the name of the ExternalIPPool this IP is allocated from. + // This field is immutable after creation. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="pool is immutable" + Pool string `json:"pool"` +} + +// ExternalIPPhaseType is a valid value for .status.phase +type ExternalIPPhaseType string + +const ( + // ExternalIPPhaseProgressing means an update is in progress + ExternalIPPhaseProgressing ExternalIPPhaseType = "Progressing" + + // ExternalIPPhaseFailed means the IP provisioning has failed + ExternalIPPhaseFailed ExternalIPPhaseType = "Failed" + + // ExternalIPPhaseReady means the IP and all associated resources are ready + ExternalIPPhaseReady ExternalIPPhaseType = "Ready" + + // ExternalIPPhaseDeleting means there has been a request to delete the ExternalIP + ExternalIPPhaseDeleting ExternalIPPhaseType = "Deleting" +) + +// ExternalIPStateType is a valid value for .status.state +type ExternalIPStateType string + +const ( + // ExternalIPStatePending means the IP allocation is pending + ExternalIPStatePending ExternalIPStateType = "Pending" + + // ExternalIPStateAllocated means the IP has been allocated from the pool + ExternalIPStateAllocated ExternalIPStateType = "Allocated" + + // ExternalIPStateFailed means provisioning failed + ExternalIPStateFailed ExternalIPStateType = "Failed" +) + +// ExternalIPStatus defines the observed state of ExternalIP +type ExternalIPStatus struct { + // Phase provides a single-value overview of the state of the ExternalIP + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=Progressing;Failed;Ready;Deleting + Phase ExternalIPPhaseType `json:"phase,omitempty"` + + // DesiredConfigVersion is a hash of the spec, used to detect spec changes and control retry behavior. + // +kubebuilder:validation:Optional + DesiredConfigVersion string `json:"desiredConfigVersion,omitempty"` + + // ProvisioningJobs holds an array of JobStatus tracking provisioning and deprovisioning operations + // +kubebuilder:validation:Optional + ProvisioningJobs []JobStatus `json:"provisioningJobs,omitempty"` + + // Conditions holds an array of metav1.Condition that describe the state of the ExternalIP + // +kubebuilder:validation:Optional + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` + + // Address is the allocated external IP address + // +kubebuilder:validation:Optional + Address string `json:"address,omitempty"` + + // State tracks the attachment lifecycle of the ExternalIP + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=Pending;Allocated;Failed + State ExternalIPStateType `json:"state,omitempty"` + + // Attached indicates whether a ExternalIPAttachment has successfully attached this IP to a target. + // +kubebuilder:validation:Optional + Attached bool `json:"attached,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:shortName=externalip +// +kubebuilder:printcolumn:name="Pool",type=string,JSONPath=`.spec.pool` +// +kubebuilder:printcolumn:name="Address",type=string,JSONPath=`.status.address` +// +kubebuilder:printcolumn:name="State",type=string,JSONPath=`.status.state` +// +kubebuilder:printcolumn:name="Phase",type=string,JSONPath=`.status.phase` +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + +// ExternalIP is the Schema for the externalips API +type ExternalIP struct { + metav1.TypeMeta `json:",inline"` + + // metadata is a standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty,omitzero"` + + // spec defines the desired state of ExternalIP + // +required + Spec ExternalIPSpec `json:"spec"` + + // status defines the observed state of ExternalIP + // +optional + Status ExternalIPStatus `json:"status,omitempty,omitzero"` +} + +// +kubebuilder:object:root=true + +// ExternalIPList contains a list of ExternalIP +type ExternalIPList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []ExternalIP `json:"items"` +} + +// GetName returns the name of the ExternalIP resource +func (p *ExternalIP) GetName() string { + return p.ObjectMeta.Name +} diff --git a/api/v1alpha1/externalip_types_test.go b/api/v1alpha1/externalip_types_test.go new file mode 100644 index 00000000..31a4cec0 --- /dev/null +++ b/api/v1alpha1/externalip_types_test.go @@ -0,0 +1,105 @@ +/* +Copyright 2026. + +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 v1alpha1_test + +import ( + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/osac-project/osac-operator/api/v1alpha1" +) + +var _ = Describe("ExternalIPSpec", func() { + It("should accept a valid spec with pool", func() { + spec := v1alpha1.ExternalIPSpec{ + Pool: "my-pool", + } + + Expect(spec.Pool).To(Equal("my-pool")) + }) +}) + +var _ = Describe("ExternalIPPhaseType", func() { + DescribeTable("should have correct string values", + func(phase v1alpha1.ExternalIPPhaseType, expected string) { + Expect(string(phase)).To(Equal(expected)) + }, + Entry("Progressing phase", v1alpha1.ExternalIPPhaseProgressing, "Progressing"), + Entry("Failed phase", v1alpha1.ExternalIPPhaseFailed, "Failed"), + Entry("Ready phase", v1alpha1.ExternalIPPhaseReady, "Ready"), + Entry("Deleting phase", v1alpha1.ExternalIPPhaseDeleting, "Deleting"), + ) +}) + +var _ = Describe("ExternalIPStateType", func() { + DescribeTable("should have correct string values", + func(state v1alpha1.ExternalIPStateType, expected string) { + Expect(string(state)).To(Equal(expected)) + }, + Entry("Pending state", v1alpha1.ExternalIPStatePending, "Pending"), + Entry("Allocated state", v1alpha1.ExternalIPStateAllocated, "Allocated"), + Entry("Failed state", v1alpha1.ExternalIPStateFailed, "Failed"), + ) +}) + +var _ = Describe("ExternalIPConditionType", func() { + It("should have ConfigurationApplied condition type", func() { + Expect(string(v1alpha1.ExternalIPConditionConfigurationApplied)).To(Equal("ConfigurationApplied")) + }) +}) + +var _ = Describe("ExternalIP", func() { + Describe("GetName", func() { + It("should return the name", func() { + ip := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-ip", + }, + } + + Expect(ip.GetName()).To(Equal("test-ip")) + }) + }) +}) + +var _ = Describe("ExternalIP Condition Helpers", func() { + It("should set and get a condition", func() { + ip := &v1alpha1.ExternalIP{} + + condition := metav1.Condition{ + Type: string(v1alpha1.ExternalIPConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: "ConfigurationApplied", + Message: "applied", + LastTransitionTime: metav1.Now(), + } + + v1alpha1.SetExternalIPStatusCondition(ip, condition) + + got := v1alpha1.GetExternalIPStatusCondition(ip, v1alpha1.ExternalIPConditionConfigurationApplied) + Expect(got).ToNot(BeNil()) + Expect(got.Status).To(Equal(metav1.ConditionTrue)) + }) + + It("should return nil for missing condition", func() { + ip := &v1alpha1.ExternalIP{} + + got := v1alpha1.GetExternalIPStatusCondition(ip, v1alpha1.ExternalIPConditionConfigurationApplied) + Expect(got).To(BeNil()) + }) +}) diff --git a/api/v1alpha1/externalipattachment_conditions.go b/api/v1alpha1/externalipattachment_conditions.go new file mode 100644 index 00000000..6c620c7e --- /dev/null +++ b/api/v1alpha1/externalipattachment_conditions.go @@ -0,0 +1,41 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPAttachmentConditionType is a valid value for .status.conditions.type +type ExternalIPAttachmentConditionType string + +const ( + // ExternalIPAttachmentConditionConfigurationApplied indicates whether the controller + // has processed the current spec version + ExternalIPAttachmentConditionConfigurationApplied ExternalIPAttachmentConditionType = "ConfigurationApplied" +) + +// GetExternalIPAttachmentStatusCondition returns the condition with the specified type from the ExternalIPAttachment status +func GetExternalIPAttachmentStatusCondition(attachment *ExternalIPAttachment, conditionType ExternalIPAttachmentConditionType) *metav1.Condition { + return meta.FindStatusCondition(attachment.Status.Conditions, string(conditionType)) +} + +// SetExternalIPAttachmentStatusCondition sets the condition with the specified type in the ExternalIPAttachment status +func SetExternalIPAttachmentStatusCondition(attachment *ExternalIPAttachment, condition metav1.Condition) { + meta.SetStatusCondition(&attachment.Status.Conditions, condition) +} diff --git a/api/v1alpha1/externalipattachment_types.go b/api/v1alpha1/externalipattachment_types.go new file mode 100644 index 00000000..50a0ae64 --- /dev/null +++ b/api/v1alpha1/externalipattachment_types.go @@ -0,0 +1,115 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPAttachmentSpec defines the desired state of ExternalIPAttachment. +// The entire spec is immutable after creation: to change the target, delete +// the attachment and create a new one. +// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="spec is immutable after creation" +type ExternalIPAttachmentSpec struct { + // ExternalIP is the name of the ExternalIP resource to attach. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinLength=1 + ExternalIP string `json:"externalIP"` + + // ComputeInstance is the name of the ComputeInstance to attach to. + // Exactly one target field must be set. + // +kubebuilder:validation:Optional + // +kubebuilder:validation:MinLength=1 + ComputeInstance *string `json:"computeInstance,omitempty"` +} + +// ExternalIPAttachmentPhaseType is a valid value for .status.phase +type ExternalIPAttachmentPhaseType string + +const ( + // ExternalIPAttachmentPhaseProgressing means the attach or detach operation is in progress + ExternalIPAttachmentPhaseProgressing ExternalIPAttachmentPhaseType = "Progressing" + + // ExternalIPAttachmentPhaseFailed means the attach or detach operation has failed + ExternalIPAttachmentPhaseFailed ExternalIPAttachmentPhaseType = "Failed" + + // ExternalIPAttachmentPhaseReady means the external IP is attached and routing traffic + ExternalIPAttachmentPhaseReady ExternalIPAttachmentPhaseType = "Ready" + + // ExternalIPAttachmentPhaseDeleting means a detach operation is in progress + ExternalIPAttachmentPhaseDeleting ExternalIPAttachmentPhaseType = "Deleting" +) + +// ExternalIPAttachmentStatus defines the observed state of ExternalIPAttachment +type ExternalIPAttachmentStatus struct { + // Phase provides a single-value overview of the state of the ExternalIPAttachment + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=Progressing;Failed;Ready;Deleting + Phase ExternalIPAttachmentPhaseType `json:"phase,omitempty"` + + // DesiredConfigVersion is a hash of the spec, used to detect spec changes and control retry behavior. + // +kubebuilder:validation:Optional + DesiredConfigVersion string `json:"desiredConfigVersion,omitempty"` + + // ProvisioningJobs holds an array of JobStatus tracking provisioning and deprovisioning operations + // +kubebuilder:validation:Optional + ProvisioningJobs []JobStatus `json:"provisioningJobs,omitempty"` + + // Conditions holds an array of metav1.Condition that describe the state of the ExternalIPAttachment + // +kubebuilder:validation:Optional + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:shortName=externalipattachment +// +kubebuilder:printcolumn:name="ExternalIP",type=string,JSONPath=`.spec.externalIP` +// +kubebuilder:printcolumn:name="ComputeInstance",type=string,JSONPath=`.spec.computeInstance` +// +kubebuilder:printcolumn:name="Phase",type=string,JSONPath=`.status.phase` +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + +// ExternalIPAttachment is the Schema for the externalipattachments API +type ExternalIPAttachment struct { + metav1.TypeMeta `json:",inline"` + + // metadata is a standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty,omitzero"` + + // spec defines the desired state of ExternalIPAttachment + // +required + Spec ExternalIPAttachmentSpec `json:"spec"` + + // status defines the observed state of ExternalIPAttachment + // +optional + Status ExternalIPAttachmentStatus `json:"status,omitempty,omitzero"` +} + +// +kubebuilder:object:root=true + +// ExternalIPAttachmentList contains a list of ExternalIPAttachment +type ExternalIPAttachmentList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []ExternalIPAttachment `json:"items"` +} + +// GetName returns the name of the ExternalIPAttachment resource +func (p *ExternalIPAttachment) GetName() string { + return p.ObjectMeta.Name +} diff --git a/api/v1alpha1/externalipattachment_types_test.go b/api/v1alpha1/externalipattachment_types_test.go new file mode 100644 index 00000000..9c803b02 --- /dev/null +++ b/api/v1alpha1/externalipattachment_types_test.go @@ -0,0 +1,107 @@ +/* +Copyright 2026. + +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 v1alpha1_test + +import ( + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/osac-project/osac-operator/api/v1alpha1" +) + +var _ = Describe("ExternalIPAttachmentSpec", func() { + It("should accept a valid spec with all fields", func() { + ci := "my-instance" + spec := v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "my-public-ip", + ComputeInstance: &ci, + } + + Expect(spec.ExternalIP).To(Equal("my-public-ip")) + Expect(spec.ComputeInstance).ToNot(BeNil()) + Expect(*spec.ComputeInstance).To(Equal("my-instance")) + }) + + It("should accept a minimal spec without optional target", func() { + spec := v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "my-public-ip", + } + + Expect(spec.ExternalIP).To(Equal("my-public-ip")) + Expect(spec.ComputeInstance).To(BeNil()) + }) +}) + +var _ = Describe("ExternalIPAttachmentPhaseType", func() { + DescribeTable("should have correct string values", + func(phase v1alpha1.ExternalIPAttachmentPhaseType, expected string) { + Expect(string(phase)).To(Equal(expected)) + }, + Entry("Progressing phase", v1alpha1.ExternalIPAttachmentPhaseProgressing, "Progressing"), + Entry("Failed phase", v1alpha1.ExternalIPAttachmentPhaseFailed, "Failed"), + Entry("Ready phase", v1alpha1.ExternalIPAttachmentPhaseReady, "Ready"), + Entry("Deleting phase", v1alpha1.ExternalIPAttachmentPhaseDeleting, "Deleting"), + ) +}) + +var _ = Describe("ExternalIPAttachmentConditionType", func() { + It("should have ConfigurationApplied condition type", func() { + Expect(string(v1alpha1.ExternalIPAttachmentConditionConfigurationApplied)).To(Equal("ConfigurationApplied")) + }) +}) + +var _ = Describe("ExternalIPAttachment", func() { + Describe("GetName", func() { + It("should return the name", func() { + attachment := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-attachment", + }, + } + + Expect(attachment.GetName()).To(Equal("test-attachment")) + }) + }) +}) + +var _ = Describe("ExternalIPAttachment Condition Helpers", func() { + It("should set and get a condition", func() { + attachment := &v1alpha1.ExternalIPAttachment{} + + condition := metav1.Condition{ + Type: string(v1alpha1.ExternalIPAttachmentConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: "ConfigurationApplied", + Message: "applied", + LastTransitionTime: metav1.Now(), + } + + v1alpha1.SetExternalIPAttachmentStatusCondition(attachment, condition) + + got := v1alpha1.GetExternalIPAttachmentStatusCondition(attachment, v1alpha1.ExternalIPAttachmentConditionConfigurationApplied) + Expect(got).ToNot(BeNil()) + Expect(got.Status).To(Equal(metav1.ConditionTrue)) + }) + + It("should return nil for missing condition", func() { + attachment := &v1alpha1.ExternalIPAttachment{} + + got := v1alpha1.GetExternalIPAttachmentStatusCondition(attachment, v1alpha1.ExternalIPAttachmentConditionConfigurationApplied) + Expect(got).To(BeNil()) + }) +}) diff --git a/api/v1alpha1/externalippool_conditions.go b/api/v1alpha1/externalippool_conditions.go new file mode 100644 index 00000000..5ef12e03 --- /dev/null +++ b/api/v1alpha1/externalippool_conditions.go @@ -0,0 +1,41 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPPoolConditionType is a valid value for .status.conditions.type +type ExternalIPPoolConditionType string + +const ( + // ExternalIPPoolConditionConfigurationApplied indicates whether the controller + // has processed the current spec version + ExternalIPPoolConditionConfigurationApplied ExternalIPPoolConditionType = "ConfigurationApplied" +) + +// GetExternalIPPoolStatusCondition returns the condition with the specified type from the ExternalIPPool status +func GetExternalIPPoolStatusCondition(pool *ExternalIPPool, conditionType ExternalIPPoolConditionType) *metav1.Condition { + return meta.FindStatusCondition(pool.Status.Conditions, string(conditionType)) +} + +// SetExternalIPPoolStatusCondition sets the condition with the specified type in the ExternalIPPool status +func SetExternalIPPoolStatusCondition(pool *ExternalIPPool, condition metav1.Condition) { + meta.SetStatusCondition(&pool.Status.Conditions, condition) +} diff --git a/api/v1alpha1/externalippool_types.go b/api/v1alpha1/externalippool_types.go new file mode 100644 index 00000000..ed0f56fc --- /dev/null +++ b/api/v1alpha1/externalippool_types.go @@ -0,0 +1,136 @@ +/* +Copyright 2026. + +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 v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// ExternalIPPoolSpec defines the desired state of ExternalIPPool +type ExternalIPPoolSpec struct { + // CIDRs is the list of CIDR blocks for this pool. All CIDRs must match the declared IPFamily. + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="cidrs is immutable" + CIDRs []string `json:"cidrs"` + + // IPFamily indicates the IP address family for this pool (IPv4 or IPv6) + // +kubebuilder:validation:Required + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=IPv4;IPv6 + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="ipFamily is immutable" + IPFamily string `json:"ipFamily"` + + // ImplementationStrategy determines the backend used to advertise IPs (e.g., metallb-l2). + // Defaults to metallb-l2 for v7.0. + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=metallb-l2;netris + // +kubebuilder:validation:XValidation:rule="self == oldSelf",message="implementationStrategy is immutable" + ImplementationStrategy string `json:"implementationStrategy,omitempty"` +} + +// ExternalIPPoolPhaseType is a valid value for .status.phase +type ExternalIPPoolPhaseType string + +const ( + // ExternalIPPoolPhaseProgressing means an update is in progress + ExternalIPPoolPhaseProgressing ExternalIPPoolPhaseType = "Progressing" + + // ExternalIPPoolPhaseFailed means the pool provisioning has failed + ExternalIPPoolPhaseFailed ExternalIPPoolPhaseType = "Failed" + + // ExternalIPPoolPhaseReady means the pool and all associated resources are ready + ExternalIPPoolPhaseReady ExternalIPPoolPhaseType = "Ready" + + // ExternalIPPoolPhaseDeleting means there has been a request to delete the ExternalIPPool + ExternalIPPoolPhaseDeleting ExternalIPPoolPhaseType = "Deleting" +) + +// ExternalIPPoolStatus defines the observed state of ExternalIPPool +type ExternalIPPoolStatus struct { + // Phase provides a single-value overview of the state of the ExternalIPPool + // +kubebuilder:validation:Optional + // +kubebuilder:validation:Type=string + // +kubebuilder:validation:Enum=Progressing;Failed;Ready;Deleting + Phase ExternalIPPoolPhaseType `json:"phase,omitempty"` + + // DesiredConfigVersion is a hash of the spec, used to detect spec changes and control retry behavior. + // +kubebuilder:validation:Optional + DesiredConfigVersion string `json:"desiredConfigVersion,omitempty"` + + // ProvisioningJobs holds an array of JobStatus tracking provisioning and deprovisioning operations + // +kubebuilder:validation:Optional + ProvisioningJobs []JobStatus `json:"provisioningJobs,omitempty"` + + // Conditions holds an array of metav1.Condition that describe the state of the ExternalIPPool + // +kubebuilder:validation:Optional + Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,1,rep,name=conditions"` + + // Total is the total number of usable IP addresses across all CIDRs in this pool. + // Uses int64 to accommodate large IPv6 CIDR ranges. + // +kubebuilder:validation:Optional + Total int64 `json:"total,omitempty"` + + // Allocated is the number of IPs currently allocated from the pool. + // +kubebuilder:validation:Optional + Allocated int64 `json:"allocated,omitempty"` + + // Available is the number of IPs available for allocation. + // +kubebuilder:validation:Optional + Available int64 `json:"available,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:shortName=externalippool +// +kubebuilder:printcolumn:name="IPFamily",type=string,JSONPath=`.spec.ipFamily` +// +kubebuilder:printcolumn:name="Phase",type=string,JSONPath=`.status.phase` +// +kubebuilder:printcolumn:name="Total",type=integer,JSONPath=`.status.total` +// +kubebuilder:printcolumn:name="Available",type=integer,JSONPath=`.status.available` +// +kubebuilder:printcolumn:name="Age",type=date,JSONPath=`.metadata.creationTimestamp` + +// ExternalIPPool is the Schema for the externalippools API +type ExternalIPPool struct { + metav1.TypeMeta `json:",inline"` + + // metadata is a standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty,omitzero"` + + // spec defines the desired state of ExternalIPPool + // +required + Spec ExternalIPPoolSpec `json:"spec"` + + // status defines the observed state of ExternalIPPool + // +optional + Status ExternalIPPoolStatus `json:"status,omitempty,omitzero"` +} + +// +kubebuilder:object:root=true + +// ExternalIPPoolList contains a list of ExternalIPPool +type ExternalIPPoolList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []ExternalIPPool `json:"items"` +} + +// GetName returns the name of the ExternalIPPool resource +func (p *ExternalIPPool) GetName() string { + return p.ObjectMeta.Name +} diff --git a/api/v1alpha1/externalippool_types_test.go b/api/v1alpha1/externalippool_types_test.go new file mode 100644 index 00000000..745f5a35 --- /dev/null +++ b/api/v1alpha1/externalippool_types_test.go @@ -0,0 +1,117 @@ +package v1alpha1_test + +import ( + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/osac-project/osac-operator/api/v1alpha1" +) + +var _ = Describe("ExternalIPPoolSpec", func() { + It("should accept a valid spec with all required fields", func() { + spec := v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"192.168.1.0/24", "192.168.2.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + } + + Expect(spec.CIDRs).To(Equal([]string{"192.168.1.0/24", "192.168.2.0/24"})) + Expect(spec.IPFamily).To(Equal("IPv4")) + Expect(spec.ImplementationStrategy).To(Equal("metallb-l2")) + }) + + It("should accept netris as a valid implementation strategy", func() { + spec := v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"192.168.1.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "netris", + } + + Expect(spec.ImplementationStrategy).To(Equal("netris")) + }) + + It("should accept a minimal spec without optional fields", func() { + spec := v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/16"}, + IPFamily: "IPv4", + } + + Expect(spec.CIDRs).To(HaveLen(1)) + Expect(spec.IPFamily).To(Equal("IPv4")) + Expect(spec.ImplementationStrategy).To(BeEmpty()) + }) +}) + +var _ = Describe("ExternalIPPoolPhaseType", func() { + DescribeTable("should have correct string values", + func(phase v1alpha1.ExternalIPPoolPhaseType, expected string) { + Expect(string(phase)).To(Equal(expected)) + }, + Entry("Progressing phase", v1alpha1.ExternalIPPoolPhaseProgressing, "Progressing"), + Entry("Failed phase", v1alpha1.ExternalIPPoolPhaseFailed, "Failed"), + Entry("Ready phase", v1alpha1.ExternalIPPoolPhaseReady, "Ready"), + Entry("Deleting phase", v1alpha1.ExternalIPPoolPhaseDeleting, "Deleting"), + ) +}) + +var _ = Describe("ExternalIPPoolConditionType", func() { + It("should have ConfigurationApplied condition type", func() { + Expect(string(v1alpha1.ExternalIPPoolConditionConfigurationApplied)).To(Equal("ConfigurationApplied")) + }) +}) + +var _ = Describe("ExternalIPPool", func() { + Describe("GetName", func() { + It("should return the name", func() { + pool := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pool", + }, + } + + Expect(pool.GetName()).To(Equal("test-pool")) + }) + }) +}) + +var _ = Describe("ExternalIPPool Condition Helpers", func() { + It("should set and get a condition", func() { + pool := &v1alpha1.ExternalIPPool{} + + condition := metav1.Condition{ + Type: string(v1alpha1.ExternalIPPoolConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: "ConfigurationApplied", + Message: "applied", + LastTransitionTime: metav1.Now(), + } + + v1alpha1.SetExternalIPPoolStatusCondition(pool, condition) + + got := v1alpha1.GetExternalIPPoolStatusCondition(pool, v1alpha1.ExternalIPPoolConditionConfigurationApplied) + Expect(got).ToNot(BeNil()) + Expect(got.Status).To(Equal(metav1.ConditionTrue)) + }) + + It("should return nil for missing condition", func() { + pool := &v1alpha1.ExternalIPPool{} + + got := v1alpha1.GetExternalIPPoolStatusCondition(pool, v1alpha1.ExternalIPPoolConditionConfigurationApplied) + Expect(got).To(BeNil()) + }) +}) + +var _ = Describe("ExternalIPPoolStatus", func() { + It("should accept capacity fields", func() { + status := v1alpha1.ExternalIPPoolStatus{ + Total: 256, + Allocated: 10, + Available: 246, + } + + Expect(status.Total).To(Equal(int64(256))) + Expect(status.Allocated).To(Equal(int64(10))) + Expect(status.Available).To(Equal(int64(246))) + }) +}) diff --git a/api/v1alpha1/groupversion_info.go b/api/v1alpha1/groupversion_info.go index 0b9d1fc8..e2842346 100644 --- a/api/v1alpha1/groupversion_info.go +++ b/api/v1alpha1/groupversion_info.go @@ -56,6 +56,12 @@ func addKnownTypes(s *runtime.Scheme) error { &PublicIPList{}, &PublicIPAttachment{}, &PublicIPAttachmentList{}, + &ExternalIPPool{}, + &ExternalIPPoolList{}, + &ExternalIP{}, + &ExternalIPList{}, + &ExternalIPAttachment{}, + &ExternalIPAttachmentList{}, ) metav1.AddToGroupVersion(s, GroupVersion) return nil diff --git a/api/v1alpha1/scheme_test.go b/api/v1alpha1/scheme_test.go index 3e300f62..a125502a 100644 --- a/api/v1alpha1/scheme_test.go +++ b/api/v1alpha1/scheme_test.go @@ -60,6 +60,9 @@ var _ = Describe("Scheme Registration", func() { {"PublicIPPool", "PublicIPPoolList", &v1alpha1.PublicIPPool{}, &v1alpha1.PublicIPPoolList{}}, {"PublicIP", "PublicIPList", &v1alpha1.PublicIP{}, &v1alpha1.PublicIPList{}}, {"PublicIPAttachment", "PublicIPAttachmentList", &v1alpha1.PublicIPAttachment{}, &v1alpha1.PublicIPAttachmentList{}}, + {"ExternalIPPool", "ExternalIPPoolList", &v1alpha1.ExternalIPPool{}, &v1alpha1.ExternalIPPoolList{}}, + {"ExternalIP", "ExternalIPList", &v1alpha1.ExternalIP{}, &v1alpha1.ExternalIPList{}}, + {"ExternalIPAttachment", "ExternalIPAttachmentList", &v1alpha1.ExternalIPAttachment{}, &v1alpha1.ExternalIPAttachmentList{}}, } for _, e := range entries { @@ -80,8 +83,8 @@ var _ = Describe("Scheme Registration", func() { }) } - It("should have exactly 18 registered types plus internal types", func() { - // Verify all 18 expected GVKs are known + It("should have exactly 24 registered types plus internal types", func() { + // Verify all 24 expected GVKs are known expectedKinds := []string{ "ClusterOrder", "ClusterOrderList", "ComputeInstance", "ComputeInstanceList", @@ -92,6 +95,9 @@ var _ = Describe("Scheme Registration", func() { "PublicIPPool", "PublicIPPoolList", "PublicIP", "PublicIPList", "PublicIPAttachment", "PublicIPAttachmentList", + "ExternalIPPool", "ExternalIPPoolList", + "ExternalIP", "ExternalIPList", + "ExternalIPAttachment", "ExternalIPAttachmentList", } for _, kind := range expectedKinds { gvk := v1alpha1.GroupVersion.WithKind(kind) diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 26177736..c0786dce 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -356,6 +356,325 @@ func (in *DiskSpec) DeepCopy() *DiskSpec { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIP) DeepCopyInto(out *ExternalIP) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + out.Spec = in.Spec + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIP. +func (in *ExternalIP) DeepCopy() *ExternalIP { + if in == nil { + return nil + } + out := new(ExternalIP) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIP) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPAttachment) DeepCopyInto(out *ExternalIPAttachment) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPAttachment. +func (in *ExternalIPAttachment) DeepCopy() *ExternalIPAttachment { + if in == nil { + return nil + } + out := new(ExternalIPAttachment) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIPAttachment) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPAttachmentList) DeepCopyInto(out *ExternalIPAttachmentList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ExternalIPAttachment, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPAttachmentList. +func (in *ExternalIPAttachmentList) DeepCopy() *ExternalIPAttachmentList { + if in == nil { + return nil + } + out := new(ExternalIPAttachmentList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIPAttachmentList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPAttachmentSpec) DeepCopyInto(out *ExternalIPAttachmentSpec) { + *out = *in + if in.ComputeInstance != nil { + in, out := &in.ComputeInstance, &out.ComputeInstance + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPAttachmentSpec. +func (in *ExternalIPAttachmentSpec) DeepCopy() *ExternalIPAttachmentSpec { + if in == nil { + return nil + } + out := new(ExternalIPAttachmentSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPAttachmentStatus) DeepCopyInto(out *ExternalIPAttachmentStatus) { + *out = *in + if in.ProvisioningJobs != nil { + in, out := &in.ProvisioningJobs, &out.ProvisioningJobs + *out = make([]JobStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPAttachmentStatus. +func (in *ExternalIPAttachmentStatus) DeepCopy() *ExternalIPAttachmentStatus { + if in == nil { + return nil + } + out := new(ExternalIPAttachmentStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPList) DeepCopyInto(out *ExternalIPList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ExternalIP, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPList. +func (in *ExternalIPList) DeepCopy() *ExternalIPList { + if in == nil { + return nil + } + out := new(ExternalIPList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIPList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPPool) DeepCopyInto(out *ExternalIPPool) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPPool. +func (in *ExternalIPPool) DeepCopy() *ExternalIPPool { + if in == nil { + return nil + } + out := new(ExternalIPPool) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIPPool) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPPoolList) DeepCopyInto(out *ExternalIPPoolList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]ExternalIPPool, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPPoolList. +func (in *ExternalIPPoolList) DeepCopy() *ExternalIPPoolList { + if in == nil { + return nil + } + out := new(ExternalIPPoolList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *ExternalIPPoolList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPPoolSpec) DeepCopyInto(out *ExternalIPPoolSpec) { + *out = *in + if in.CIDRs != nil { + in, out := &in.CIDRs, &out.CIDRs + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPPoolSpec. +func (in *ExternalIPPoolSpec) DeepCopy() *ExternalIPPoolSpec { + if in == nil { + return nil + } + out := new(ExternalIPPoolSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPPoolStatus) DeepCopyInto(out *ExternalIPPoolStatus) { + *out = *in + if in.ProvisioningJobs != nil { + in, out := &in.ProvisioningJobs, &out.ProvisioningJobs + *out = make([]JobStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPPoolStatus. +func (in *ExternalIPPoolStatus) DeepCopy() *ExternalIPPoolStatus { + if in == nil { + return nil + } + out := new(ExternalIPPoolStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPSpec) DeepCopyInto(out *ExternalIPSpec) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPSpec. +func (in *ExternalIPSpec) DeepCopy() *ExternalIPSpec { + if in == nil { + return nil + } + out := new(ExternalIPSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ExternalIPStatus) DeepCopyInto(out *ExternalIPStatus) { + *out = *in + if in.ProvisioningJobs != nil { + in, out := &in.ProvisioningJobs, &out.ProvisioningJobs + *out = make([]JobStatus, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ExternalIPStatus. +func (in *ExternalIPStatus) DeepCopy() *ExternalIPStatus { + if in == nil { + return nil + } + out := new(ExternalIPStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ImageSpec) DeepCopyInto(out *ImageSpec) { *out = *in diff --git a/buf.gen.yaml b/buf.gen.yaml index 5b7d1bc7..2ecdf609 100755 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -24,7 +24,7 @@ managed: inputs: -- module: buf.build/osac-project/private-api:v0.0.65 +- module: buf.build/osac-project/private-api:v0.0.67 plugins: diff --git a/charts/operator-crds/templates/osac.openshift.io_externalipattachments.yaml b/charts/operator-crds/templates/osac.openshift.io_externalipattachments.yaml new file mode 100644 index 00000000..098e528c --- /dev/null +++ b/charts/operator-crds/templates/osac.openshift.io_externalipattachments.yaml @@ -0,0 +1,214 @@ +{{- if .Values.install }} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + "helm.sh/resource-policy": keep + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalipattachments.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIPAttachment + listKind: ExternalIPAttachmentList + plural: externalipattachments + shortNames: + - externalipattachment + singular: externalipattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.externalIP + name: ExternalIP + type: string + - jsonPath: .spec.computeInstance + name: ComputeInstance + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIPAttachment is the Schema for the externalipattachments + API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIPAttachment + properties: + computeInstance: + description: |- + ComputeInstance is the name of the ComputeInstance to attach to. + Exactly one target field must be set. + minLength: 1 + type: string + externalIP: + description: ExternalIP is the name of the ExternalIP resource to + attach. + minLength: 1 + type: string + required: + - externalIP + type: object + x-kubernetes-validations: + - message: spec is immutable after creation + rule: self == oldSelf + status: + description: status defines the observed state of ExternalIPAttachment + properties: + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIPAttachment + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIPAttachment + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +{{- end }} diff --git a/charts/operator-crds/templates/osac.openshift.io_externalippools.yaml b/charts/operator-crds/templates/osac.openshift.io_externalippools.yaml new file mode 100644 index 00000000..b01d2fa7 --- /dev/null +++ b/charts/operator-crds/templates/osac.openshift.io_externalippools.yaml @@ -0,0 +1,249 @@ +{{- if .Values.install }} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + "helm.sh/resource-policy": keep + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalippools.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIPPool + listKind: ExternalIPPoolList + plural: externalippools + shortNames: + - externalippool + singular: externalippool + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.ipFamily + name: IPFamily + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .status.total + name: Total + type: integer + - jsonPath: .status.available + name: Available + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIPPool is the Schema for the externalippools API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIPPool + properties: + cidrs: + description: CIDRs is the list of CIDR blocks for this pool. All CIDRs + must match the declared IPFamily. + items: + type: string + minItems: 1 + type: array + x-kubernetes-validations: + - message: cidrs is immutable + rule: self == oldSelf + implementationStrategy: + description: |- + ImplementationStrategy determines the backend used to advertise IPs (e.g., metallb-l2). + Defaults to metallb-l2 for v7.0. + enum: + - metallb-l2 + - netris + type: string + x-kubernetes-validations: + - message: implementationStrategy is immutable + rule: self == oldSelf + ipFamily: + description: IPFamily indicates the IP address family for this pool + (IPv4 or IPv6) + enum: + - IPv4 + - IPv6 + type: string + x-kubernetes-validations: + - message: ipFamily is immutable + rule: self == oldSelf + required: + - cidrs + - ipFamily + type: object + status: + description: status defines the observed state of ExternalIPPool + properties: + allocated: + description: Allocated is the number of IPs currently allocated from + the pool. + format: int64 + type: integer + available: + description: Available is the number of IPs available for allocation. + format: int64 + type: integer + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIPPool + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIPPool + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + total: + description: |- + Total is the total number of usable IP addresses across all CIDRs in this pool. + Uses int64 to accommodate large IPv6 CIDR ranges. + format: int64 + type: integer + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +{{- end }} diff --git a/charts/operator-crds/templates/osac.openshift.io_externalips.yaml b/charts/operator-crds/templates/osac.openshift.io_externalips.yaml new file mode 100644 index 00000000..5c300142 --- /dev/null +++ b/charts/operator-crds/templates/osac.openshift.io_externalips.yaml @@ -0,0 +1,225 @@ +{{- if .Values.install }} +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + "helm.sh/resource-policy": keep + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalips.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIP + listKind: ExternalIPList + plural: externalips + shortNames: + - externalip + singular: externalip + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.pool + name: Pool + type: string + - jsonPath: .status.address + name: Address + type: string + - jsonPath: .status.state + name: State + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIP is the Schema for the externalips API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIP + properties: + pool: + description: |- + Pool is the name of the ExternalIPPool this IP is allocated from. + This field is immutable after creation. + minLength: 1 + type: string + x-kubernetes-validations: + - message: pool is immutable + rule: self == oldSelf + required: + - pool + type: object + status: + description: status defines the observed state of ExternalIP + properties: + address: + description: Address is the allocated external IP address + type: string + attached: + description: Attached indicates whether a ExternalIPAttachment has + successfully attached this IP to a target. + type: boolean + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIP + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIP + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + state: + description: State tracks the attachment lifecycle of the ExternalIP + enum: + - Pending + - Allocated + - Failed + type: string + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +{{- end }} diff --git a/charts/operator/templates/clusterrole.yaml b/charts/operator/templates/clusterrole.yaml index 81a1fe9f..eebee1f7 100644 --- a/charts/operator/templates/clusterrole.yaml +++ b/charts/operator/templates/clusterrole.yaml @@ -67,6 +67,9 @@ rules: resources: - clusterorders - computeinstances + - externalipattachments + - externalippools + - externalips - publicipattachments - publicippools - publicips @@ -87,6 +90,9 @@ rules: resources: - clusterorders/finalizers - computeinstances/finalizers + - externalipattachments/finalizers + - externalippools/finalizers + - externalips/finalizers - publicipattachments/finalizers - publicippools/finalizers - publicips/finalizers @@ -101,6 +107,9 @@ rules: resources: - clusterorders/status - computeinstances/status + - externalipattachments/status + - externalippools/status + - externalips/status - publicipattachments/status - publicippools/status - publicips/status diff --git a/cmd/main.go b/cmd/main.go index 28dc1363..4fb23b7e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -597,6 +597,71 @@ func setupNetworkingControllers( } } + // Create a dedicated provider for ExternalIP attach/detach operations. + externalIPAttachmentProvider, err := provisioning.NewProvider(provisioning.ProviderConfig{ + AAPClient: aapClient, + ProvisionTemplate: fmt.Sprintf("%s-attach-external-ip", templatePrefix), + DeprovisionTemplate: fmt.Sprintf("%s-detach-external-ip", templatePrefix), + }) + if err != nil { + return fmt.Errorf("externalip attachment provider: %w", err) + } + + // Setup ExternalIPPool controller and feedback + if grpcConn != nil { + if err := controller.NewExternalIPPoolFeedbackReconciler( + localMgr.GetClient(), + grpcConn, + networkingNamespace, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalippool feedback controller: %w", err) + } + } + + if err := controller.NewExternalIPPoolReconciler(mgr, networkingNamespace, networkingProvider, statusPollInterval, + maxJobHistory, targetCluster, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalippool controller: %w", err) + } + + // Setup ExternalIP controller + if err := controller.NewExternalIPReconciler( + mgr, networkingNamespace, + networkingProvider, statusPollInterval, maxJobHistory, targetCluster, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalip controller: %w", err) + } + + // Setup ExternalIPAttachment controller + if err := controller.NewExternalIPAttachmentReconciler( + mgr, networkingNamespace, computeInstanceNamespace, + externalIPAttachmentProvider, statusPollInterval, maxJobHistory, targetCluster, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalipattachment controller: %w", err) + } + + // Setup ExternalIP feedback controller + if grpcConn != nil { + if err := controller.NewExternalIPFeedbackReconciler( + localMgr.GetClient(), + grpcConn, + networkingNamespace, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalip feedback controller: %w", err) + } + } + + // Setup ExternalIPAttachment feedback controller + if grpcConn != nil { + if err := controller.NewExternalIPAttachmentFeedbackReconciler( + localMgr.GetClient(), + grpcConn, + networkingNamespace, + ).SetupWithManager(mgr); err != nil { + return fmt.Errorf("externalipattachment feedback controller: %w", err) + } + } + return nil } diff --git a/config/crd/bases/osac.openshift.io_externalipattachments.yaml b/config/crd/bases/osac.openshift.io_externalipattachments.yaml new file mode 100644 index 00000000..2db60a30 --- /dev/null +++ b/config/crd/bases/osac.openshift.io_externalipattachments.yaml @@ -0,0 +1,211 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalipattachments.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIPAttachment + listKind: ExternalIPAttachmentList + plural: externalipattachments + shortNames: + - externalipattachment + singular: externalipattachment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.externalIP + name: ExternalIP + type: string + - jsonPath: .spec.computeInstance + name: ComputeInstance + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIPAttachment is the Schema for the externalipattachments + API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIPAttachment + properties: + computeInstance: + description: |- + ComputeInstance is the name of the ComputeInstance to attach to. + Exactly one target field must be set. + minLength: 1 + type: string + externalIP: + description: ExternalIP is the name of the ExternalIP resource to + attach. + minLength: 1 + type: string + required: + - externalIP + type: object + x-kubernetes-validations: + - message: spec is immutable after creation + rule: self == oldSelf + status: + description: status defines the observed state of ExternalIPAttachment + properties: + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIPAttachment + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIPAttachment + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/bases/osac.openshift.io_externalippools.yaml b/config/crd/bases/osac.openshift.io_externalippools.yaml new file mode 100644 index 00000000..6e72a7d2 --- /dev/null +++ b/config/crd/bases/osac.openshift.io_externalippools.yaml @@ -0,0 +1,246 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalippools.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIPPool + listKind: ExternalIPPoolList + plural: externalippools + shortNames: + - externalippool + singular: externalippool + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.ipFamily + name: IPFamily + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .status.total + name: Total + type: integer + - jsonPath: .status.available + name: Available + type: integer + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIPPool is the Schema for the externalippools API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIPPool + properties: + cidrs: + description: CIDRs is the list of CIDR blocks for this pool. All CIDRs + must match the declared IPFamily. + items: + type: string + minItems: 1 + type: array + x-kubernetes-validations: + - message: cidrs is immutable + rule: self == oldSelf + implementationStrategy: + description: |- + ImplementationStrategy determines the backend used to advertise IPs (e.g., metallb-l2). + Defaults to metallb-l2 for v7.0. + enum: + - metallb-l2 + - netris + type: string + x-kubernetes-validations: + - message: implementationStrategy is immutable + rule: self == oldSelf + ipFamily: + description: IPFamily indicates the IP address family for this pool + (IPv4 or IPv6) + enum: + - IPv4 + - IPv6 + type: string + x-kubernetes-validations: + - message: ipFamily is immutable + rule: self == oldSelf + required: + - cidrs + - ipFamily + type: object + status: + description: status defines the observed state of ExternalIPPool + properties: + allocated: + description: Allocated is the number of IPs currently allocated from + the pool. + format: int64 + type: integer + available: + description: Available is the number of IPs available for allocation. + format: int64 + type: integer + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIPPool + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIPPool + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + total: + description: |- + Total is the total number of usable IP addresses across all CIDRs in this pool. + Uses int64 to accommodate large IPv6 CIDR ranges. + format: int64 + type: integer + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/crd/bases/osac.openshift.io_externalips.yaml b/config/crd/bases/osac.openshift.io_externalips.yaml new file mode 100644 index 00000000..b0122b35 --- /dev/null +++ b/config/crd/bases/osac.openshift.io_externalips.yaml @@ -0,0 +1,222 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.20.0 + name: externalips.osac.openshift.io +spec: + group: osac.openshift.io + names: + kind: ExternalIP + listKind: ExternalIPList + plural: externalips + shortNames: + - externalip + singular: externalip + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.pool + name: Pool + type: string + - jsonPath: .status.address + name: Address + type: string + - jsonPath: .status.state + name: State + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: ExternalIP is the Schema for the externalips API + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: spec defines the desired state of ExternalIP + properties: + pool: + description: |- + Pool is the name of the ExternalIPPool this IP is allocated from. + This field is immutable after creation. + minLength: 1 + type: string + x-kubernetes-validations: + - message: pool is immutable + rule: self == oldSelf + required: + - pool + type: object + status: + description: status defines the observed state of ExternalIP + properties: + address: + description: Address is the allocated external IP address + type: string + attached: + description: Attached indicates whether a ExternalIPAttachment has + successfully attached this IP to a target. + type: boolean + conditions: + description: Conditions holds an array of metav1.Condition that describe + the state of the ExternalIP + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + desiredConfigVersion: + description: DesiredConfigVersion is a hash of the spec, used to detect + spec changes and control retry behavior. + type: string + phase: + description: Phase provides a single-value overview of the state of + the ExternalIP + enum: + - Progressing + - Failed + - Ready + - Deleting + type: string + provisioningJobs: + description: ProvisioningJobs holds an array of JobStatus tracking + provisioning and deprovisioning operations + items: + description: JobStatus represents the status of a provisioning or + deprovisioning job + properties: + blockDeletionOnFailure: + description: |- + BlockDeletionOnFailure indicates whether CR deletion should be blocked if this job fails. + AAP sets this to true to prevent orphaned cloud resources when deprovisioning fails. + type: boolean + configVersion: + description: |- + ConfigVersion is the DesiredConfigVersion at the time this job was triggered. + Used to determine retry behavior on failure: if ConfigVersion differs from + the current DesiredConfigVersion, a new job is triggered immediately. + If they match, the controller retries with exponential backoff. + type: string + jobID: + description: JobID is the AAP job identifier from the provisioning + provider API response. + type: string + message: + description: Message provides human-readable status or error + information + type: string + state: + description: State is the current state of the job + enum: + - Pending + - Waiting + - Running + - Succeeded + - Failed + - Canceled + - Unknown + type: string + timestamp: + description: Timestamp when this job was created/triggered + format: date-time + type: string + type: + description: Type indicates the operation type + enum: + - provision + - deprovision + type: string + required: + - jobID + - state + - timestamp + - type + type: object + type: array + state: + description: State tracks the attachment lifecycle of the ExternalIP + enum: + - Pending + - Allocated + - Failed + type: string + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml index c7d4bb24..088aa071 100644 --- a/config/rbac/role.yaml +++ b/config/rbac/role.yaml @@ -76,6 +76,9 @@ rules: - baremetalinstances/finalizers - clusterorders/finalizers - computeinstances/finalizers + - externalipattachments/finalizers + - externalippools/finalizers + - externalips/finalizers - publicipattachments/finalizers - publicippools/finalizers - publicips/finalizers @@ -90,6 +93,9 @@ rules: resources: - clusterorders - computeinstances + - externalipattachments + - externalippools + - externalips - publicipattachments - publicippools - publicips @@ -110,6 +116,9 @@ rules: resources: - clusterorders/status - computeinstances/status + - externalipattachments/status + - externalippools/status + - externalips/status - publicipattachments/status - publicippools/status - publicips/status diff --git a/internal/api/osac/private/v1/baremetal_instance_type.pb.go b/internal/api/osac/private/v1/baremetal_instance_type.pb.go index 4f9728a8..96fcef2d 100644 --- a/internal/api/osac/private/v1/baremetal_instance_type.pb.go +++ b/internal/api/osac/private/v1/baremetal_instance_type.pb.go @@ -345,7 +345,7 @@ type BareMetalInstanceSpec struct { // SSH public key injected into the OS at provisioning time. Immutable after creation. // Must be a valid SSH public key in OpenSSH format (ssh-rsa, ssh-ed25519, etc.). // Invalid keys are rejected at create time with a 400 error. - SshKey *string `protobuf:"bytes,2,opt,name=ssh_key,json=sshKey,proto3,oneof" json:"ssh_key,omitempty"` + SshPublicKey *string `protobuf:"bytes,2,opt,name=ssh_public_key,json=sshPublicKey,proto3,oneof" json:"ssh_public_key,omitempty"` // User data (e.g. cloud-init). Passed to the OS at first boot. Immutable after creation. // Maximum size: 64 KB. UserData *string `protobuf:"bytes,3,opt,name=user_data,json=userData,proto3,oneof" json:"user_data,omitempty"` @@ -392,9 +392,9 @@ func (x *BareMetalInstanceSpec) GetCatalogItem() string { return "" } -func (x *BareMetalInstanceSpec) GetSshKey() string { - if x != nil && x.SshKey != nil { - return *x.SshKey +func (x *BareMetalInstanceSpec) GetSshPublicKey() string { + if x != nil && x.SshPublicKey != nil { + return *x.SshPublicKey } return "" } @@ -424,8 +424,8 @@ func (x *BareMetalInstanceSpec) SetCatalogItem(v string) { x.CatalogItem = v } -func (x *BareMetalInstanceSpec) SetSshKey(v string) { - x.SshKey = &v +func (x *BareMetalInstanceSpec) SetSshPublicKey(v string) { + x.SshPublicKey = &v } func (x *BareMetalInstanceSpec) SetUserData(v string) { @@ -440,11 +440,11 @@ func (x *BareMetalInstanceSpec) SetRestartTrigger(v int64) { x.RestartTrigger = v } -func (x *BareMetalInstanceSpec) HasSshKey() bool { +func (x *BareMetalInstanceSpec) HasSshPublicKey() bool { if x == nil { return false } - return x.SshKey != nil + return x.SshPublicKey != nil } func (x *BareMetalInstanceSpec) HasUserData() bool { @@ -461,8 +461,8 @@ func (x *BareMetalInstanceSpec) HasRunStrategy() bool { return x.RunStrategy != nil } -func (x *BareMetalInstanceSpec) ClearSshKey() { - x.SshKey = nil +func (x *BareMetalInstanceSpec) ClearSshPublicKey() { + x.SshPublicKey = nil } func (x *BareMetalInstanceSpec) ClearUserData() { @@ -481,7 +481,7 @@ type BareMetalInstanceSpec_builder struct { // SSH public key injected into the OS at provisioning time. Immutable after creation. // Must be a valid SSH public key in OpenSSH format (ssh-rsa, ssh-ed25519, etc.). // Invalid keys are rejected at create time with a 400 error. - SshKey *string + SshPublicKey *string // User data (e.g. cloud-init). Passed to the OS at first boot. Immutable after creation. // Maximum size: 64 KB. UserData *string @@ -499,7 +499,7 @@ func (b0 BareMetalInstanceSpec_builder) Build() *BareMetalInstanceSpec { b, x := &b0, m0 _, _ = b, x x.CatalogItem = b.CatalogItem - x.SshKey = b.SshKey + x.SshPublicKey = b.SshPublicKey x.UserData = b.UserData x.RunStrategy = b.RunStrategy x.RestartTrigger = b.RestartTrigger @@ -793,126 +793,127 @@ var file_osac_private_v1_baremetal_instance_type_proto_rawDesc = string([]byte{ 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0xb4, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, + 0xc8, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x49, 0x74, 0x65, - 0x6d, 0x12, 0x21, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x00, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, - 0x79, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x01, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x48, 0x02, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, - 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xe0, 0x01, 0x0a, 0x17, 0x42, 0x61, 0x72, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x6d, 0x12, 0x2e, 0x0a, 0x0e, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x00, + 0x52, 0x0c, 0x73, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, + 0x01, 0x12, 0x25, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x5f, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x02, 0x52, + 0x0b, 0x72, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x73, 0x68, + 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, + 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xe0, 0x01, 0x0a, 0x17, 0x42, + 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x22, 0xbc, 0x02, 0x0a, 0x1a, 0x42, 0x61, - 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xaa, 0x01, 0x0a, 0x1c, 0x42, 0x61, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x41, 0x52, - 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x42, + 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x68, + 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x22, 0xbc, 0x02, + 0x0a, 0x1a, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xaa, 0x01, 0x0a, + 0x1c, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, + 0x2c, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, + 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x2b, 0x0a, 0x27, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, + 0x45, 0x47, 0x59, 0x5f, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, + 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, + 0x5f, 0x48, 0x41, 0x4c, 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0xe4, 0x01, 0x0a, 0x16, 0x42, 0x61, + 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, + 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x2a, 0x0a, 0x26, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, - 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, - 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x41, 0x52, 0x45, + 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, + 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, - 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x48, 0x41, 0x4c, - 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0xe4, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x29, 0x0a, 0x25, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x42, - 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, - 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x41, 0x52, 0x45, 0x5f, - 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x24, - 0x0a, 0x20, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, - 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x2a, 0xa0, 0x03, 0x0a, - 0x1e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x2a, 0xa0, 0x03, 0x0a, 0x1e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, - 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3c, 0x0a, 0x38, 0x42, 0x41, 0x52, 0x45, 0x5f, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, + 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, + 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3c, 0x0a, 0x38, 0x42, + 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, + 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x41, 0x52, + 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, + 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, - 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, - 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, - 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, + 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x10, 0x04, 0x12, 0x35, 0x0a, 0x31, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, - 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, - 0x35, 0x0a, 0x31, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x37, 0x0a, 0x33, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, - 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x06, 0x42, - 0xdf, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1a, 0x42, 0x61, 0x72, 0x65, 0x6d, 0x65, 0x74, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, - 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x37, 0x0a, 0x33, 0x42, 0x41, + 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, + 0x44, 0x10, 0x06, 0x42, 0xdf, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1a, 0x42, 0x61, 0x72, + 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 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_baremetal_instance_type_proto_enumTypes = make([]protoimpl.EnumInfo, 3) diff --git a/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go b/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go index 58a0da39..eac677fa 100644 --- a/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go +++ b/internal/api/osac/private/v1/baremetal_instance_type_protoopaque.pb.go @@ -340,7 +340,7 @@ func (b0 BareMetalInstance_builder) Build() *BareMetalInstance { type BareMetalInstanceSpec struct { state protoimpl.MessageState `protogen:"opaque.v1"` xxx_hidden_CatalogItem string `protobuf:"bytes,1,opt,name=catalog_item,json=catalogItem,proto3"` - xxx_hidden_SshKey *string `protobuf:"bytes,2,opt,name=ssh_key,json=sshKey,proto3,oneof"` + xxx_hidden_SshPublicKey *string `protobuf:"bytes,2,opt,name=ssh_public_key,json=sshPublicKey,proto3,oneof"` xxx_hidden_UserData *string `protobuf:"bytes,3,opt,name=user_data,json=userData,proto3,oneof"` xxx_hidden_RunStrategy BareMetalInstanceRunStrategy `protobuf:"varint,4,opt,name=run_strategy,json=runStrategy,proto3,enum=osac.private.v1.BareMetalInstanceRunStrategy,oneof"` xxx_hidden_RestartTrigger int64 `protobuf:"varint,5,opt,name=restart_trigger,json=restartTrigger,proto3"` @@ -382,10 +382,10 @@ func (x *BareMetalInstanceSpec) GetCatalogItem() string { return "" } -func (x *BareMetalInstanceSpec) GetSshKey() string { +func (x *BareMetalInstanceSpec) GetSshPublicKey() string { if x != nil { - if x.xxx_hidden_SshKey != nil { - return *x.xxx_hidden_SshKey + if x.xxx_hidden_SshPublicKey != nil { + return *x.xxx_hidden_SshPublicKey } return "" } @@ -422,8 +422,8 @@ func (x *BareMetalInstanceSpec) SetCatalogItem(v string) { x.xxx_hidden_CatalogItem = v } -func (x *BareMetalInstanceSpec) SetSshKey(v string) { - x.xxx_hidden_SshKey = &v +func (x *BareMetalInstanceSpec) SetSshPublicKey(v string) { + x.xxx_hidden_SshPublicKey = &v protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 5) } @@ -441,7 +441,7 @@ func (x *BareMetalInstanceSpec) SetRestartTrigger(v int64) { x.xxx_hidden_RestartTrigger = v } -func (x *BareMetalInstanceSpec) HasSshKey() bool { +func (x *BareMetalInstanceSpec) HasSshPublicKey() bool { if x == nil { return false } @@ -462,9 +462,9 @@ func (x *BareMetalInstanceSpec) HasRunStrategy() bool { return protoimpl.X.Present(&(x.XXX_presence[0]), 3) } -func (x *BareMetalInstanceSpec) ClearSshKey() { +func (x *BareMetalInstanceSpec) ClearSshPublicKey() { protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) - x.xxx_hidden_SshKey = nil + x.xxx_hidden_SshPublicKey = nil } func (x *BareMetalInstanceSpec) ClearUserData() { @@ -485,7 +485,7 @@ type BareMetalInstanceSpec_builder struct { // SSH public key injected into the OS at provisioning time. Immutable after creation. // Must be a valid SSH public key in OpenSSH format (ssh-rsa, ssh-ed25519, etc.). // Invalid keys are rejected at create time with a 400 error. - SshKey *string + SshPublicKey *string // User data (e.g. cloud-init). Passed to the OS at first boot. Immutable after creation. // Maximum size: 64 KB. UserData *string @@ -503,9 +503,9 @@ func (b0 BareMetalInstanceSpec_builder) Build() *BareMetalInstanceSpec { b, x := &b0, m0 _, _ = b, x x.xxx_hidden_CatalogItem = b.CatalogItem - if b.SshKey != nil { + if b.SshPublicKey != nil { protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 5) - x.xxx_hidden_SshKey = b.SshKey + x.xxx_hidden_SshPublicKey = b.SshPublicKey } if b.UserData != nil { protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 5) @@ -821,126 +821,127 @@ var file_osac_private_v1_baremetal_instance_type_proto_rawDesc = string([]byte{ 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0xb4, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, + 0xc8, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x26, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x49, 0x74, 0x65, - 0x6d, 0x12, 0x21, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x00, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, - 0x79, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x01, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x48, 0x02, 0x52, 0x0b, 0x72, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, - 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xe0, 0x01, 0x0a, 0x17, 0x42, 0x61, 0x72, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x6d, 0x12, 0x2e, 0x0a, 0x0e, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x00, + 0x52, 0x0c, 0x73, 0x73, 0x68, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x88, 0x01, + 0x01, 0x12, 0x25, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x48, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x44, 0x61, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x55, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x5f, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x02, 0x52, + 0x0b, 0x72, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x73, 0x68, + 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, + 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xe0, 0x01, 0x0a, 0x17, 0x42, + 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, - 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x22, 0xbc, 0x02, 0x0a, 0x1a, 0x42, 0x61, - 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, - 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xaa, 0x01, 0x0a, 0x1c, 0x42, 0x61, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, 0x2c, 0x42, 0x41, 0x52, - 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x42, + 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x68, + 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x22, 0xbc, 0x02, + 0x0a, 0x1a, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xaa, 0x01, 0x0a, + 0x1c, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x30, 0x0a, + 0x2c, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, + 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x2b, 0x0a, 0x27, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, + 0x45, 0x47, 0x59, 0x5f, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, + 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, + 0x5f, 0x48, 0x41, 0x4c, 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0xe4, 0x01, 0x0a, 0x16, 0x42, 0x61, + 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x29, 0x0a, 0x25, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, + 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x2a, 0x0a, 0x26, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, - 0x43, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, - 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x42, 0x41, 0x52, 0x45, + 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x02, 0x12, 0x24, 0x0a, 0x20, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, + 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, - 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x48, 0x41, 0x4c, - 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0xe4, 0x01, 0x0a, 0x16, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x29, 0x0a, 0x25, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x42, - 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, - 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x42, 0x41, 0x52, 0x45, 0x5f, - 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x24, - 0x0a, 0x20, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x45, 0x44, 0x10, 0x03, 0x12, 0x26, 0x0a, 0x22, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, - 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x2a, 0xa0, 0x03, 0x0a, - 0x1e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x2a, 0xa0, 0x03, 0x0a, 0x1e, 0x42, 0x61, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, - 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3c, 0x0a, 0x38, 0x42, 0x41, 0x52, 0x45, 0x5f, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x32, 0x0a, 0x2e, 0x42, 0x41, 0x52, 0x45, 0x5f, + 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, + 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x3c, 0x0a, 0x38, 0x42, + 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, + 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x41, 0x52, + 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, + 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, - 0x49, 0x45, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, - 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, - 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x10, 0x03, 0x12, 0x3a, 0x0a, 0x36, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, + 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x10, 0x04, 0x12, 0x35, 0x0a, 0x31, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, - 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x04, 0x12, - 0x35, 0x0a, 0x31, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, - 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x37, 0x0a, 0x33, 0x42, 0x41, 0x52, 0x45, 0x5f, 0x4d, - 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x06, 0x42, - 0xdf, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1a, 0x42, 0x61, 0x72, 0x65, 0x6d, 0x65, 0x74, - 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, - 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x12, 0x37, 0x0a, 0x33, 0x42, 0x41, + 0x52, 0x45, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, + 0x44, 0x10, 0x06, 0x42, 0xdf, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1a, 0x42, 0x61, 0x72, + 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 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_baremetal_instance_type_proto_enumTypes = make([]protoimpl.EnumInfo, 3) diff --git a/internal/api/osac/private/v1/compute_instance_type.pb.go b/internal/api/osac/private/v1/compute_instance_type.pb.go index 152e4843..1814c781 100644 --- a/internal/api/osac/private/v1/compute_instance_type.pb.go +++ b/internal/api/osac/private/v1/compute_instance_type.pb.go @@ -525,7 +525,9 @@ type ComputeInstanceSpec struct { NetworkAttachments []*NetworkAttachment `protobuf:"bytes,14,rep,name=network_attachments,json=networkAttachments,proto3" json:"network_attachments,omitempty"` // Reference to a compute instance catalog item. Mutually exclusive with template during the migration period. // When set, the server fetches the catalog item and applies its field definitions. - CatalogItem string `protobuf:"bytes,15,opt,name=catalog_item,json=catalogItem,proto3" json:"catalog_item,omitempty"` + CatalogItem string `protobuf:"bytes,15,opt,name=catalog_item,json=catalogItem,proto3" json:"catalog_item,omitempty"` + // Indicates whether this compute instance runs a Windows guest OS (true) or Linux (false/omitted). + IsWindows *bool `protobuf:"varint,16,opt,name=is_windows,json=isWindows,proto3,oneof" json:"is_windows,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -646,6 +648,13 @@ func (x *ComputeInstanceSpec) GetCatalogItem() string { return "" } +func (x *ComputeInstanceSpec) GetIsWindows() bool { + if x != nil && x.IsWindows != nil { + return *x.IsWindows + } + return false +} + func (x *ComputeInstanceSpec) SetTemplate(v string) { x.Template = v } @@ -698,6 +707,10 @@ func (x *ComputeInstanceSpec) SetCatalogItem(v string) { x.CatalogItem = v } +func (x *ComputeInstanceSpec) SetIsWindows(v bool) { + x.IsWindows = &v +} + func (x *ComputeInstanceSpec) HasRestartRequestedAt() bool { if x == nil { return false @@ -754,6 +767,13 @@ func (x *ComputeInstanceSpec) HasUserData() bool { return x.UserData != nil } +func (x *ComputeInstanceSpec) HasIsWindows() bool { + if x == nil { + return false + } + return x.IsWindows != nil +} + func (x *ComputeInstanceSpec) ClearRestartRequestedAt() { x.RestartRequestedAt = nil } @@ -786,6 +806,10 @@ func (x *ComputeInstanceSpec) ClearUserData() { x.UserData = nil } +func (x *ComputeInstanceSpec) ClearIsWindows() { + x.IsWindows = nil +} + type ComputeInstanceSpec_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -814,6 +838,8 @@ type ComputeInstanceSpec_builder struct { // Reference to a compute instance catalog item. Mutually exclusive with template during the migration period. // When set, the server fetches the catalog item and applies its field definitions. CatalogItem string + // Indicates whether this compute instance runs a Windows guest OS (true) or Linux (false/omitted). + IsWindows *bool } func (b0 ComputeInstanceSpec_builder) Build() *ComputeInstanceSpec { @@ -833,6 +859,7 @@ func (b0 ComputeInstanceSpec_builder) Build() *ComputeInstanceSpec { x.UserData = b.UserData x.NetworkAttachments = b.NetworkAttachments x.CatalogItem = b.CatalogItem + x.IsWindows = b.IsWindows return m0 } @@ -1171,7 +1198,7 @@ var file_osac_private_v1_compute_instance_type_proto_rawDesc = string([]byte{ 0x52, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x22, 0xe4, 0x07, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, + 0x73, 0x22, 0x97, 0x08, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x6d, 0x0a, 0x13, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, @@ -1218,124 +1245,127 @@ var file_osac_private_v1_compute_instance_type_proto_rawDesc = string([]byte{ 0x6f, 0x72, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x49, 0x74, 0x65, - 0x6d, 0x1a, 0x5b, 0x0a, 0x17, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x17, - 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, - 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, - 0x64, 0x69, 0x73, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x52, - 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xf0, 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x75, - 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x4b, 0x0a, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 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, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xb8, 0x02, 0x0a, 0x18, - 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x6d, 0x12, 0x22, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, 0x52, 0x09, 0x69, 0x73, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x5b, 0x0a, 0x17, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, + 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, + 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, 0x73, 0x5f, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, + 0x10, 0x0e, 0x52, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xf0, 0x02, 0x0a, 0x15, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, - 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xbb, 0x02, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x75, - 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, - 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, - 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, - 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, - 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x22, 0x0a, - 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x55, 0x53, - 0x45, 0x44, 0x10, 0x07, 0x2a, 0x89, 0x03, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x39, 0x0a, 0x35, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, - 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x37, 0x0a, 0x33, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, + 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 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, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, + 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xb8, + 0x02, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 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, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xbb, 0x02, 0x0a, 0x14, 0x43, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, + 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, + 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, + 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x43, + 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, + 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, + 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, + 0x41, 0x55, 0x53, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x89, 0x03, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x39, 0x0a, 0x35, 0x43, 0x4f, 0x4d, + 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, + 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, + 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, + 0x37, 0x0a, 0x33, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, - 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, - 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x34, 0x0a, 0x30, 0x43, 0x4f, - 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x06, - 0x42, 0xdd, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, - 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x34, 0x0a, + 0x30, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, + 0x44, 0x10, 0x06, 0x42, 0xdd, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x18, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, - 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, + 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_compute_instance_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) diff --git a/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go b/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go index ac7e97c0..5065f2e9 100644 --- a/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go +++ b/internal/api/osac/private/v1/compute_instance_type_protoopaque.pb.go @@ -508,6 +508,7 @@ type ComputeInstanceSpec struct { xxx_hidden_UserData *string `protobuf:"bytes,11,opt,name=user_data,json=userData,proto3,oneof"` xxx_hidden_NetworkAttachments *[]*NetworkAttachment `protobuf:"bytes,14,rep,name=network_attachments,json=networkAttachments,proto3"` xxx_hidden_CatalogItem string `protobuf:"bytes,15,opt,name=catalog_item,json=catalogItem,proto3"` + xxx_hidden_IsWindows bool `protobuf:"varint,16,opt,name=is_windows,json=isWindows,proto3,oneof"` XXX_raceDetectHookData protoimpl.RaceDetectHookData XXX_presence [1]uint32 unknownFields protoimpl.UnknownFields @@ -643,6 +644,13 @@ func (x *ComputeInstanceSpec) GetCatalogItem() string { return "" } +func (x *ComputeInstanceSpec) GetIsWindows() bool { + if x != nil { + return x.xxx_hidden_IsWindows + } + return false +} + func (x *ComputeInstanceSpec) SetTemplate(v string) { x.xxx_hidden_Template = v } @@ -661,17 +669,17 @@ func (x *ComputeInstanceSpec) SetImage(v *ComputeInstanceImage) { func (x *ComputeInstanceSpec) SetCores(v int32) { x.xxx_hidden_Cores = v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 13) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 4, 14) } func (x *ComputeInstanceSpec) SetMemoryGib(v int32) { x.xxx_hidden_MemoryGib = v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 5, 13) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 5, 14) } func (x *ComputeInstanceSpec) SetSshKey(v string) { x.xxx_hidden_SshKey = &v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 6, 13) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 6, 14) } func (x *ComputeInstanceSpec) SetBootDisk(v *ComputeInstanceDisk) { @@ -684,12 +692,12 @@ func (x *ComputeInstanceSpec) SetAdditionalDisks(v []*ComputeInstanceDisk) { func (x *ComputeInstanceSpec) SetRunStrategy(v string) { x.xxx_hidden_RunStrategy = &v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 9, 13) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 9, 14) } func (x *ComputeInstanceSpec) SetUserData(v string) { x.xxx_hidden_UserData = &v - protoimpl.X.SetPresent(&(x.XXX_presence[0]), 10, 13) + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 10, 14) } func (x *ComputeInstanceSpec) SetNetworkAttachments(v []*NetworkAttachment) { @@ -700,6 +708,11 @@ func (x *ComputeInstanceSpec) SetCatalogItem(v string) { x.xxx_hidden_CatalogItem = v } +func (x *ComputeInstanceSpec) SetIsWindows(v bool) { + x.xxx_hidden_IsWindows = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 13, 14) +} + func (x *ComputeInstanceSpec) HasRestartRequestedAt() bool { if x == nil { return false @@ -756,6 +769,13 @@ func (x *ComputeInstanceSpec) HasUserData() bool { return protoimpl.X.Present(&(x.XXX_presence[0]), 10) } +func (x *ComputeInstanceSpec) HasIsWindows() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 13) +} + func (x *ComputeInstanceSpec) ClearRestartRequestedAt() { x.xxx_hidden_RestartRequestedAt = nil } @@ -793,6 +813,11 @@ func (x *ComputeInstanceSpec) ClearUserData() { x.xxx_hidden_UserData = nil } +func (x *ComputeInstanceSpec) ClearIsWindows() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 13) + x.xxx_hidden_IsWindows = false +} + type ComputeInstanceSpec_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -821,6 +846,8 @@ type ComputeInstanceSpec_builder struct { // Reference to a compute instance catalog item. Mutually exclusive with template during the migration period. // When set, the server fetches the catalog item and applies its field definitions. CatalogItem string + // Indicates whether this compute instance runs a Windows guest OS (true) or Linux (false/omitted). + IsWindows *bool } func (b0 ComputeInstanceSpec_builder) Build() *ComputeInstanceSpec { @@ -832,29 +859,33 @@ func (b0 ComputeInstanceSpec_builder) Build() *ComputeInstanceSpec { x.xxx_hidden_RestartRequestedAt = b.RestartRequestedAt x.xxx_hidden_Image = b.Image if b.Cores != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 13) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 4, 14) x.xxx_hidden_Cores = *b.Cores } if b.MemoryGib != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 5, 13) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 5, 14) x.xxx_hidden_MemoryGib = *b.MemoryGib } if b.SshKey != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 6, 13) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 6, 14) x.xxx_hidden_SshKey = b.SshKey } x.xxx_hidden_BootDisk = b.BootDisk x.xxx_hidden_AdditionalDisks = &b.AdditionalDisks if b.RunStrategy != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 9, 13) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 9, 14) x.xxx_hidden_RunStrategy = b.RunStrategy } if b.UserData != nil { - protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 10, 13) + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 10, 14) x.xxx_hidden_UserData = b.UserData } x.xxx_hidden_NetworkAttachments = &b.NetworkAttachments x.xxx_hidden_CatalogItem = b.CatalogItem + if b.IsWindows != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 13, 14) + x.xxx_hidden_IsWindows = *b.IsWindows + } return m0 } @@ -1209,7 +1240,7 @@ var file_osac_private_v1_compute_instance_type_proto_rawDesc = string([]byte{ 0x52, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x22, 0xe4, 0x07, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, + 0x73, 0x22, 0x97, 0x08, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x6d, 0x0a, 0x13, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, @@ -1256,124 +1287,127 @@ var file_osac_private_v1_compute_instance_type_proto_rawDesc = string([]byte{ 0x6f, 0x72, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x49, 0x74, 0x65, - 0x6d, 0x1a, 0x5b, 0x0a, 0x17, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x17, - 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, - 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x6f, 0x74, 0x5f, - 0x64, 0x69, 0x73, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x52, - 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xf0, 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x68, 0x75, - 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x4b, 0x0a, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 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, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, - 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xb8, 0x02, 0x0a, 0x18, - 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x6d, 0x12, 0x22, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x48, 0x08, 0x52, 0x09, 0x69, 0x73, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x88, 0x01, 0x01, 0x1a, 0x5b, 0x0a, 0x17, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x42, + 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x67, 0x69, 0x62, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, + 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x75, 0x6e, + 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, 0x73, 0x5f, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, 0x0d, + 0x10, 0x0e, 0x52, 0x06, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x52, 0x0f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xf0, 0x02, 0x0a, 0x15, + 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 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, - 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xbb, 0x02, 0x0a, 0x14, 0x43, 0x6f, 0x6d, 0x70, 0x75, - 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, - 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, - 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, - 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, - 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x22, 0x0a, - 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x41, 0x55, 0x53, - 0x45, 0x44, 0x10, 0x07, 0x2a, 0x89, 0x03, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x39, 0x0a, 0x35, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, - 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, - 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x37, 0x0a, 0x33, + 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2e, 0x0a, + 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, + 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 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, 0x48, 0x00, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x11, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, + 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xb8, + 0x02, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 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, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 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, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xbb, 0x02, 0x0a, 0x14, 0x43, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x26, 0x0a, 0x22, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, + 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, + 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, + 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, + 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x23, 0x0a, 0x1f, 0x43, + 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x05, + 0x12, 0x22, 0x0a, 0x1e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, + 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, + 0x45, 0x44, 0x10, 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, + 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, + 0x41, 0x55, 0x53, 0x45, 0x44, 0x10, 0x07, 0x2a, 0x89, 0x03, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x39, 0x0a, 0x35, 0x43, 0x4f, 0x4d, + 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, + 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, + 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, + 0x37, 0x0a, 0x33, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, + 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, - 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x32, 0x0a, 0x2e, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, - 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x2f, 0x0a, 0x2b, 0x43, 0x4f, 0x4d, - 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, 0x4f, - 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x52, 0x4f, - 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x34, 0x0a, 0x30, 0x43, 0x4f, - 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x43, - 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x44, 0x10, 0x06, - 0x42, 0xdd, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, - 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x05, 0x12, 0x34, 0x0a, + 0x30, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, + 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, + 0x44, 0x10, 0x06, 0x42, 0xdd, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x18, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, - 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, + 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_compute_instance_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) diff --git a/internal/api/osac/private/v1/external_ip_attachment_type.pb.go b/internal/api/osac/private/v1/external_ip_attachment_type.pb.go new file mode 100644 index 00000000..4a703ac9 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_attachment_type.pb.go @@ -0,0 +1,932 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_attachment_type.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Endpoint type for cluster-targeted ExternalIPAttachments. +// +// When attaching an external IP to a cluster, this enum specifies which cluster endpoint +// receives the DNAT rule. +type ExternalIPAttachmentEndpoint int32 + +const ( + // Endpoint is unknown or has not been specified. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED ExternalIPAttachmentEndpoint = 0 + // The cluster's API server endpoint. + // + // The external IP will be routed to the cluster's Kubernetes API server VIP, making the + // cluster API reachable from outside the VirtualNetwork. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_API ExternalIPAttachmentEndpoint = 1 + // The cluster's ingress endpoint. + // + // The external IP will be routed to the cluster's ingress controller VIP, making + // applications hosted on the cluster reachable from outside the VirtualNetwork. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS ExternalIPAttachmentEndpoint = 2 +) + +// Enum value maps for ExternalIPAttachmentEndpoint. +var ( + ExternalIPAttachmentEndpoint_name = map[int32]string{ + 0: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED", + 1: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_API", + 2: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS", + } + ExternalIPAttachmentEndpoint_value = map[string]int32{ + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED": 0, + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_API": 1, + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS": 2, + } +) + +func (x ExternalIPAttachmentEndpoint) Enum() *ExternalIPAttachmentEndpoint { + p := new(ExternalIPAttachmentEndpoint) + *p = x + return p +} + +func (x ExternalIPAttachmentEndpoint) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPAttachmentEndpoint) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPAttachmentEndpoint) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[0] +} + +func (x ExternalIPAttachmentEndpoint) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Lifecycle states for ExternalIPAttachment resources. +// +// State transitions: UNSPECIFIED -> PENDING -> READY. On deletion: any state -> DELETING. +// FAILED can occur from PENDING and retries automatically via the provisioning lifecycle. +type ExternalIPAttachmentState int32 + +const ( + // State is unknown or has not been determined yet. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED ExternalIPAttachmentState = 0 + // The attachment is being provisioned (attach workflow in progress). + // + // The system is binding the ExternalIP's allocated address to the target resource. This + // involves creating DNAT rules or MetalLB LoadBalancer Services depending on the target type. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING ExternalIPAttachmentState = 1 + // The attachment is active and the target is reachable via the external IP address. + // + // The ExternalIP's allocated address is bound to the target resource and actively routing + // traffic. The parent ExternalIP's status.attached is set to true. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY ExternalIPAttachmentState = 2 + // The attachment failed. Check status.message for error details. + // + // The provisioning lifecycle retries automatically with exponential backoff. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED ExternalIPAttachmentState = 3 + // The attachment is being deprovisioned (detach workflow in progress). + // + // Triggered by deletion of the ExternalIPAttachment resource. The system unbinds the + // address from the target and cleans up DNAT rules or MetalLB Services. + // On completion, the parent ExternalIP's status.attached is set to false. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_DELETING ExternalIPAttachmentState = 4 +) + +// Enum value maps for ExternalIPAttachmentState. +var ( + ExternalIPAttachmentState_name = map[int32]string{ + 0: "EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_ATTACHMENT_STATE_PENDING", + 2: "EXTERNAL_IP_ATTACHMENT_STATE_READY", + 3: "EXTERNAL_IP_ATTACHMENT_STATE_FAILED", + 4: "EXTERNAL_IP_ATTACHMENT_STATE_DELETING", + } + ExternalIPAttachmentState_value = map[string]int32{ + "EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_ATTACHMENT_STATE_PENDING": 1, + "EXTERNAL_IP_ATTACHMENT_STATE_READY": 2, + "EXTERNAL_IP_ATTACHMENT_STATE_FAILED": 3, + "EXTERNAL_IP_ATTACHMENT_STATE_DELETING": 4, + } +) + +func (x ExternalIPAttachmentState) Enum() *ExternalIPAttachmentState { + p := new(ExternalIPAttachmentState) + *p = x + return p +} + +func (x ExternalIPAttachmentState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPAttachmentState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[1].Descriptor() +} + +func (ExternalIPAttachmentState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[1] +} + +func (x ExternalIPAttachmentState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents a binding between an ExternalIP and a target resource. +// +// An ExternalIPAttachment is a first-class resource that manages the attach/detach lifecycle +// independently from the ExternalIP allocation lifecycle. Creating an ExternalIPAttachment triggers +// the attach workflow; deleting it triggers the detach workflow. +// +// The binding is immutable: to change the target, delete the attachment and create a new one. +// The oneof target field supports ComputeInstance, Cluster, and BareMetalInstance targets. +// +// For cluster targets, the target_endpoint field specifies which cluster endpoint receives the +// external IP (API server or ingress). An ExternalIPAttachment can be created before the cluster +// is ready and will activate automatically once the cluster's VIP is available. +// +// Lifecycle: PENDING (attach in progress) -> READY (attached and routing traffic) -> DELETING +// (detach in progress). FAILED is a terminal error state that retries via the standard +// provisioning lifecycle with exponential backoff. +type ExternalIPAttachment struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Unique identifier of the external IP attachment. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Metadata of the external IP attachment, including name, labels, and timestamps. + Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Desired configuration of the external IP attachment (user-specified). + Spec *ExternalIPAttachmentSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + // Current state of the external IP attachment (system-provided, read-only). + Status *ExternalIPAttachmentStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachment) Reset() { + *x = ExternalIPAttachment{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachment) ProtoMessage() {} + +func (x *ExternalIPAttachment) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[0] + 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 *ExternalIPAttachment) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPAttachment) GetMetadata() *Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ExternalIPAttachment) GetSpec() *ExternalIPAttachmentSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *ExternalIPAttachment) GetStatus() *ExternalIPAttachmentStatus { + if x != nil { + return x.Status + } + return nil +} + +func (x *ExternalIPAttachment) SetId(v string) { + x.Id = v +} + +func (x *ExternalIPAttachment) SetMetadata(v *Metadata) { + x.Metadata = v +} + +func (x *ExternalIPAttachment) SetSpec(v *ExternalIPAttachmentSpec) { + x.Spec = v +} + +func (x *ExternalIPAttachment) SetStatus(v *ExternalIPAttachmentStatus) { + x.Status = v +} + +func (x *ExternalIPAttachment) HasMetadata() bool { + if x == nil { + return false + } + return x.Metadata != nil +} + +func (x *ExternalIPAttachment) HasSpec() bool { + if x == nil { + return false + } + return x.Spec != nil +} + +func (x *ExternalIPAttachment) HasStatus() bool { + if x == nil { + return false + } + return x.Status != nil +} + +func (x *ExternalIPAttachment) ClearMetadata() { + x.Metadata = nil +} + +func (x *ExternalIPAttachment) ClearSpec() { + x.Spec = nil +} + +func (x *ExternalIPAttachment) ClearStatus() { + x.Status = nil +} + +type ExternalIPAttachment_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP attachment. + Id string + // Metadata of the external IP attachment, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP attachment (user-specified). + Spec *ExternalIPAttachmentSpec + // Current state of the external IP attachment (system-provided, read-only). + Status *ExternalIPAttachmentStatus +} + +func (b0 ExternalIPAttachment_builder) Build() *ExternalIPAttachment { + m0 := &ExternalIPAttachment{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + x.Metadata = b.Metadata + x.Spec = b.Spec + x.Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIPAttachment. +// +// All fields are required and immutable after creation. The external_ip must reference an +// existing ExternalIP in ALLOCATED state. The target must reference a valid resource that +// supports external IP attachment. +type ExternalIPAttachmentSpec struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // ExternalIP ID to attach. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIP in ALLOCATED state that is not already + // attached (status.attached == false). Only one ExternalIPAttachment may exist per ExternalIP. + // + // Example: "019728a4-3f5c-7def-8abc-1234567890ab" + ExternalIp string `protobuf:"bytes,1,opt,name=external_ip,json=externalIp,proto3" json:"external_ip,omitempty"` + // Target resource to attach the external IP to. Exactly one target field must be set. + // Required and immutable after creation. + // + // Types that are valid to be assigned to Target: + // + // *ExternalIPAttachmentSpec_ComputeInstance + // *ExternalIPAttachmentSpec_Cluster + // *ExternalIPAttachmentSpec_BaremetalInstance + Target isExternalIPAttachmentSpec_Target `protobuf_oneof:"target"` + // Cluster endpoint to attach the external IP to. Required when target is cluster. + // + // Specifies whether the external IP should be routed to the cluster's API server endpoint + // or its ingress endpoint. Ignored for non-cluster targets. Immutable after creation. + TargetEndpoint ExternalIPAttachmentEndpoint `protobuf:"varint,5,opt,name=target_endpoint,json=targetEndpoint,proto3,enum=osac.private.v1.ExternalIPAttachmentEndpoint" json:"target_endpoint,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentSpec) Reset() { + *x = ExternalIPAttachmentSpec{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentSpec) ProtoMessage() {} + +func (x *ExternalIPAttachmentSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1] + 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 *ExternalIPAttachmentSpec) GetExternalIp() string { + if x != nil { + return x.ExternalIp + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetTarget() isExternalIPAttachmentSpec_Target { + if x != nil { + return x.Target + } + return nil +} + +func (x *ExternalIPAttachmentSpec) GetComputeInstance() string { + if x != nil { + if x, ok := x.Target.(*ExternalIPAttachmentSpec_ComputeInstance); ok { + return x.ComputeInstance + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetCluster() string { + if x != nil { + if x, ok := x.Target.(*ExternalIPAttachmentSpec_Cluster); ok { + return x.Cluster + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetBaremetalInstance() string { + if x != nil { + if x, ok := x.Target.(*ExternalIPAttachmentSpec_BaremetalInstance); ok { + return x.BaremetalInstance + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetTargetEndpoint() ExternalIPAttachmentEndpoint { + if x != nil { + return x.TargetEndpoint + } + return ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED +} + +func (x *ExternalIPAttachmentSpec) SetExternalIp(v string) { + x.ExternalIp = v +} + +func (x *ExternalIPAttachmentSpec) SetComputeInstance(v string) { + x.Target = &ExternalIPAttachmentSpec_ComputeInstance{v} +} + +func (x *ExternalIPAttachmentSpec) SetCluster(v string) { + x.Target = &ExternalIPAttachmentSpec_Cluster{v} +} + +func (x *ExternalIPAttachmentSpec) SetBaremetalInstance(v string) { + x.Target = &ExternalIPAttachmentSpec_BaremetalInstance{v} +} + +func (x *ExternalIPAttachmentSpec) SetTargetEndpoint(v ExternalIPAttachmentEndpoint) { + x.TargetEndpoint = v +} + +func (x *ExternalIPAttachmentSpec) HasTarget() bool { + if x == nil { + return false + } + return x.Target != nil +} + +func (x *ExternalIPAttachmentSpec) HasComputeInstance() bool { + if x == nil { + return false + } + _, ok := x.Target.(*ExternalIPAttachmentSpec_ComputeInstance) + return ok +} + +func (x *ExternalIPAttachmentSpec) HasCluster() bool { + if x == nil { + return false + } + _, ok := x.Target.(*ExternalIPAttachmentSpec_Cluster) + return ok +} + +func (x *ExternalIPAttachmentSpec) HasBaremetalInstance() bool { + if x == nil { + return false + } + _, ok := x.Target.(*ExternalIPAttachmentSpec_BaremetalInstance) + return ok +} + +func (x *ExternalIPAttachmentSpec) ClearTarget() { + x.Target = nil +} + +func (x *ExternalIPAttachmentSpec) ClearComputeInstance() { + if _, ok := x.Target.(*ExternalIPAttachmentSpec_ComputeInstance); ok { + x.Target = nil + } +} + +func (x *ExternalIPAttachmentSpec) ClearCluster() { + if _, ok := x.Target.(*ExternalIPAttachmentSpec_Cluster); ok { + x.Target = nil + } +} + +func (x *ExternalIPAttachmentSpec) ClearBaremetalInstance() { + if _, ok := x.Target.(*ExternalIPAttachmentSpec_BaremetalInstance); ok { + x.Target = nil + } +} + +const ExternalIPAttachmentSpec_Target_not_set_case case_ExternalIPAttachmentSpec_Target = 0 +const ExternalIPAttachmentSpec_ComputeInstance_case case_ExternalIPAttachmentSpec_Target = 2 +const ExternalIPAttachmentSpec_Cluster_case case_ExternalIPAttachmentSpec_Target = 3 +const ExternalIPAttachmentSpec_BaremetalInstance_case case_ExternalIPAttachmentSpec_Target = 4 + +func (x *ExternalIPAttachmentSpec) WhichTarget() case_ExternalIPAttachmentSpec_Target { + if x == nil { + return ExternalIPAttachmentSpec_Target_not_set_case + } + switch x.Target.(type) { + case *ExternalIPAttachmentSpec_ComputeInstance: + return ExternalIPAttachmentSpec_ComputeInstance_case + case *ExternalIPAttachmentSpec_Cluster: + return ExternalIPAttachmentSpec_Cluster_case + case *ExternalIPAttachmentSpec_BaremetalInstance: + return ExternalIPAttachmentSpec_BaremetalInstance_case + default: + return ExternalIPAttachmentSpec_Target_not_set_case + } +} + +type ExternalIPAttachmentSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // ExternalIP ID to attach. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIP in ALLOCATED state that is not already + // attached (status.attached == false). Only one ExternalIPAttachment may exist per ExternalIP. + // + // Example: "019728a4-3f5c-7def-8abc-1234567890ab" + ExternalIp string + // Target resource to attach the external IP to. Exactly one target field must be set. + // Required and immutable after creation. + + // Fields of oneof Target: + // ComputeInstance ID to attach this external IP to. + // + // Must reference the ID of an existing ComputeInstance in RUNNING state. Only one + // ExternalIPAttachment may exist per ComputeInstance. + // + // Example: "01972f1b-a4e9-7c82-9def-abcdef123456" + ComputeInstance *string + // Cluster ID to attach this external IP to. + // + // Must reference the ID of an existing Cluster. The target_endpoint field is required + // when targeting a cluster to specify which endpoint (API or ingress) receives the + // external IP. The attachment can be created before the cluster is ready and will + // activate once the cluster's VIP is available. + // + // Example: "01973a2c-b5f0-7d93-8abc-def012345678" + Cluster *string + // BareMetalInstance ID to attach this external IP to. + // + // Must reference the ID of an existing BareMetalInstance. DNAT rules will be configured + // to forward traffic from the external IP to the bare-metal instance's internal IP. + // + // Example: "01973b3d-c6e1-7ea4-9bcd-ef0123456789" + BaremetalInstance *string + // -- end of Target + // Cluster endpoint to attach the external IP to. Required when target is cluster. + // + // Specifies whether the external IP should be routed to the cluster's API server endpoint + // or its ingress endpoint. Ignored for non-cluster targets. Immutable after creation. + TargetEndpoint ExternalIPAttachmentEndpoint +} + +func (b0 ExternalIPAttachmentSpec_builder) Build() *ExternalIPAttachmentSpec { + m0 := &ExternalIPAttachmentSpec{} + b, x := &b0, m0 + _, _ = b, x + x.ExternalIp = b.ExternalIp + if b.ComputeInstance != nil { + x.Target = &ExternalIPAttachmentSpec_ComputeInstance{*b.ComputeInstance} + } + if b.Cluster != nil { + x.Target = &ExternalIPAttachmentSpec_Cluster{*b.Cluster} + } + if b.BaremetalInstance != nil { + x.Target = &ExternalIPAttachmentSpec_BaremetalInstance{*b.BaremetalInstance} + } + x.TargetEndpoint = b.TargetEndpoint + return m0 +} + +type case_ExternalIPAttachmentSpec_Target protoreflect.FieldNumber + +func (x case_ExternalIPAttachmentSpec_Target) String() string { + md := file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1].Descriptor() + if x == 0 { + return "not set" + } + return protoimpl.X.MessageFieldStringOf(md, protoreflect.FieldNumber(x)) +} + +type isExternalIPAttachmentSpec_Target interface { + isExternalIPAttachmentSpec_Target() +} + +type ExternalIPAttachmentSpec_ComputeInstance struct { + // ComputeInstance ID to attach this external IP to. + // + // Must reference the ID of an existing ComputeInstance in RUNNING state. Only one + // ExternalIPAttachment may exist per ComputeInstance. + // + // Example: "01972f1b-a4e9-7c82-9def-abcdef123456" + ComputeInstance string `protobuf:"bytes,2,opt,name=compute_instance,json=computeInstance,proto3,oneof"` +} + +type ExternalIPAttachmentSpec_Cluster struct { + // Cluster ID to attach this external IP to. + // + // Must reference the ID of an existing Cluster. The target_endpoint field is required + // when targeting a cluster to specify which endpoint (API or ingress) receives the + // external IP. The attachment can be created before the cluster is ready and will + // activate once the cluster's VIP is available. + // + // Example: "01973a2c-b5f0-7d93-8abc-def012345678" + Cluster string `protobuf:"bytes,3,opt,name=cluster,proto3,oneof"` +} + +type ExternalIPAttachmentSpec_BaremetalInstance struct { + // BareMetalInstance ID to attach this external IP to. + // + // Must reference the ID of an existing BareMetalInstance. DNAT rules will be configured + // to forward traffic from the external IP to the bare-metal instance's internal IP. + // + // Example: "01973b3d-c6e1-7ea4-9bcd-ef0123456789" + BaremetalInstance string `protobuf:"bytes,4,opt,name=baremetal_instance,json=baremetalInstance,proto3,oneof"` +} + +func (*ExternalIPAttachmentSpec_ComputeInstance) isExternalIPAttachmentSpec_Target() {} + +func (*ExternalIPAttachmentSpec_Cluster) isExternalIPAttachmentSpec_Target() {} + +func (*ExternalIPAttachmentSpec_BaremetalInstance) isExternalIPAttachmentSpec_Target() {} + +// Represents the current operational state of an ExternalIPAttachment. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the +// system updates them based on reconciliation of the spec and feedback from the cluster +// controller. +type ExternalIPAttachmentStatus struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Current lifecycle state of the external IP attachment. + State ExternalIPAttachmentState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPAttachmentState" json:"state,omitempty"` + // Allocated IP address from the parent ExternalIP. + // + // Populated for convenience once the attachment reaches READY state. Mirrors the address + // field from the referenced ExternalIP's status. + ExternalIpAddress string `protobuf:"bytes,2,opt,name=external_ip_address,json=externalIpAddress,proto3" json:"external_ip_address,omitempty"` + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information. For FAILED state, contains the + // error details. Typically empty for READY state. + Message *string `protobuf:"bytes,3,opt,name=message,proto3,oneof" json:"message,omitempty"` + // Identifier of the hub cluster that this external IP attachment is deployed to. + // + // Set by the fulfillment-service controller when reconciling the attachment to a + // Kubernetes CR on the target hub cluster. + Hub string `protobuf:"bytes,4,opt,name=hub,proto3" json:"hub,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentStatus) Reset() { + *x = ExternalIPAttachmentStatus{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentStatus) ProtoMessage() {} + +func (x *ExternalIPAttachmentStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2] + 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 *ExternalIPAttachmentStatus) GetState() ExternalIPAttachmentState { + if x != nil { + return x.State + } + return ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED +} + +func (x *ExternalIPAttachmentStatus) GetExternalIpAddress() string { + if x != nil { + return x.ExternalIpAddress + } + return "" +} + +func (x *ExternalIPAttachmentStatus) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +func (x *ExternalIPAttachmentStatus) GetHub() string { + if x != nil { + return x.Hub + } + return "" +} + +func (x *ExternalIPAttachmentStatus) SetState(v ExternalIPAttachmentState) { + x.State = v +} + +func (x *ExternalIPAttachmentStatus) SetExternalIpAddress(v string) { + x.ExternalIpAddress = v +} + +func (x *ExternalIPAttachmentStatus) SetMessage(v string) { + x.Message = &v +} + +func (x *ExternalIPAttachmentStatus) SetHub(v string) { + x.Hub = v +} + +func (x *ExternalIPAttachmentStatus) HasMessage() bool { + if x == nil { + return false + } + return x.Message != nil +} + +func (x *ExternalIPAttachmentStatus) ClearMessage() { + x.Message = nil +} + +type ExternalIPAttachmentStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP attachment. + State ExternalIPAttachmentState + // Allocated IP address from the parent ExternalIP. + // + // Populated for convenience once the attachment reaches READY state. Mirrors the address + // field from the referenced ExternalIP's status. + ExternalIpAddress string + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information. For FAILED state, contains the + // error details. Typically empty for READY state. + Message *string + // Identifier of the hub cluster that this external IP attachment is deployed to. + // + // Set by the fulfillment-service controller when reconciling the attachment to a + // Kubernetes CR on the target hub cluster. + Hub string +} + +func (b0 ExternalIPAttachmentStatus_builder) Build() *ExternalIPAttachmentStatus { + m0 := &ExternalIPAttachmentStatus{} + b, x := &b0, m0 + _, _ = b, x + x.State = b.State + x.ExternalIpAddress = b.ExternalIpAddress + x.Message = b.Message + x.Hub = b.Hub + return m0 +} + +var File_osac_private_v1_external_ip_attachment_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_attachment_type_proto_rawDesc = string([]byte{ + 0x0a, 0x31, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe1, 0x01, 0x0a, 0x14, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x43, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa4, + 0x02, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0b, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x70, 0x12, 0x2b, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, + 0x12, 0x62, 0x61, 0x72, 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x62, 0x61, 0x72, + 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, + 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xdf, 0x01, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x45, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x13, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xa5, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x2b, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x45, 0x58, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x41, 0x50, 0x49, + 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, + 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, + 0xef, 0x01, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, + 0x28, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, + 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, + 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x27, 0x0a, + 0x23, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x29, 0x0a, 0x25, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, + 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, + 0x04, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 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_external_ip_attachment_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_external_ip_attachment_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_attachment_type_proto_goTypes = []any{ + (ExternalIPAttachmentEndpoint)(0), // 0: osac.private.v1.ExternalIPAttachmentEndpoint + (ExternalIPAttachmentState)(0), // 1: osac.private.v1.ExternalIPAttachmentState + (*ExternalIPAttachment)(nil), // 2: osac.private.v1.ExternalIPAttachment + (*ExternalIPAttachmentSpec)(nil), // 3: osac.private.v1.ExternalIPAttachmentSpec + (*ExternalIPAttachmentStatus)(nil), // 4: osac.private.v1.ExternalIPAttachmentStatus + (*Metadata)(nil), // 5: osac.private.v1.Metadata +} +var file_osac_private_v1_external_ip_attachment_type_proto_depIdxs = []int32{ + 5, // 0: osac.private.v1.ExternalIPAttachment.metadata:type_name -> osac.private.v1.Metadata + 3, // 1: osac.private.v1.ExternalIPAttachment.spec:type_name -> osac.private.v1.ExternalIPAttachmentSpec + 4, // 2: osac.private.v1.ExternalIPAttachment.status:type_name -> osac.private.v1.ExternalIPAttachmentStatus + 0, // 3: osac.private.v1.ExternalIPAttachmentSpec.target_endpoint:type_name -> osac.private.v1.ExternalIPAttachmentEndpoint + 1, // 4: osac.private.v1.ExternalIPAttachmentStatus.state:type_name -> osac.private.v1.ExternalIPAttachmentState + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_attachment_type_proto_init() } +func file_osac_private_v1_external_ip_attachment_type_proto_init() { + if File_osac_private_v1_external_ip_attachment_type_proto != nil { + return + } + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1].OneofWrappers = []any{ + (*ExternalIPAttachmentSpec_ComputeInstance)(nil), + (*ExternalIPAttachmentSpec_Cluster)(nil), + (*ExternalIPAttachmentSpec_BaremetalInstance)(nil), + } + file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2].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_external_ip_attachment_type_proto_rawDesc), len(file_osac_private_v1_external_ip_attachment_type_proto_rawDesc)), + NumEnums: 2, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_attachment_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_attachment_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_attachment_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_attachment_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_attachment_type_proto = out.File + file_osac_private_v1_external_ip_attachment_type_proto_goTypes = nil + file_osac_private_v1_external_ip_attachment_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_attachment_type_protoopaque.pb.go b/internal/api/osac/private/v1/external_ip_attachment_type_protoopaque.pb.go new file mode 100644 index 00000000..1893c273 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_attachment_type_protoopaque.pb.go @@ -0,0 +1,900 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_attachment_type.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Endpoint type for cluster-targeted ExternalIPAttachments. +// +// When attaching an external IP to a cluster, this enum specifies which cluster endpoint +// receives the DNAT rule. +type ExternalIPAttachmentEndpoint int32 + +const ( + // Endpoint is unknown or has not been specified. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED ExternalIPAttachmentEndpoint = 0 + // The cluster's API server endpoint. + // + // The external IP will be routed to the cluster's Kubernetes API server VIP, making the + // cluster API reachable from outside the VirtualNetwork. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_API ExternalIPAttachmentEndpoint = 1 + // The cluster's ingress endpoint. + // + // The external IP will be routed to the cluster's ingress controller VIP, making + // applications hosted on the cluster reachable from outside the VirtualNetwork. + ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS ExternalIPAttachmentEndpoint = 2 +) + +// Enum value maps for ExternalIPAttachmentEndpoint. +var ( + ExternalIPAttachmentEndpoint_name = map[int32]string{ + 0: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED", + 1: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_API", + 2: "EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS", + } + ExternalIPAttachmentEndpoint_value = map[string]int32{ + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED": 0, + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_API": 1, + "EXTERNAL_IP_ATTACHMENT_ENDPOINT_INGRESS": 2, + } +) + +func (x ExternalIPAttachmentEndpoint) Enum() *ExternalIPAttachmentEndpoint { + p := new(ExternalIPAttachmentEndpoint) + *p = x + return p +} + +func (x ExternalIPAttachmentEndpoint) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPAttachmentEndpoint) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPAttachmentEndpoint) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[0] +} + +func (x ExternalIPAttachmentEndpoint) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Lifecycle states for ExternalIPAttachment resources. +// +// State transitions: UNSPECIFIED -> PENDING -> READY. On deletion: any state -> DELETING. +// FAILED can occur from PENDING and retries automatically via the provisioning lifecycle. +type ExternalIPAttachmentState int32 + +const ( + // State is unknown or has not been determined yet. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED ExternalIPAttachmentState = 0 + // The attachment is being provisioned (attach workflow in progress). + // + // The system is binding the ExternalIP's allocated address to the target resource. This + // involves creating DNAT rules or MetalLB LoadBalancer Services depending on the target type. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING ExternalIPAttachmentState = 1 + // The attachment is active and the target is reachable via the external IP address. + // + // The ExternalIP's allocated address is bound to the target resource and actively routing + // traffic. The parent ExternalIP's status.attached is set to true. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY ExternalIPAttachmentState = 2 + // The attachment failed. Check status.message for error details. + // + // The provisioning lifecycle retries automatically with exponential backoff. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED ExternalIPAttachmentState = 3 + // The attachment is being deprovisioned (detach workflow in progress). + // + // Triggered by deletion of the ExternalIPAttachment resource. The system unbinds the + // address from the target and cleans up DNAT rules or MetalLB Services. + // On completion, the parent ExternalIP's status.attached is set to false. + ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_DELETING ExternalIPAttachmentState = 4 +) + +// Enum value maps for ExternalIPAttachmentState. +var ( + ExternalIPAttachmentState_name = map[int32]string{ + 0: "EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_ATTACHMENT_STATE_PENDING", + 2: "EXTERNAL_IP_ATTACHMENT_STATE_READY", + 3: "EXTERNAL_IP_ATTACHMENT_STATE_FAILED", + 4: "EXTERNAL_IP_ATTACHMENT_STATE_DELETING", + } + ExternalIPAttachmentState_value = map[string]int32{ + "EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_ATTACHMENT_STATE_PENDING": 1, + "EXTERNAL_IP_ATTACHMENT_STATE_READY": 2, + "EXTERNAL_IP_ATTACHMENT_STATE_FAILED": 3, + "EXTERNAL_IP_ATTACHMENT_STATE_DELETING": 4, + } +) + +func (x ExternalIPAttachmentState) Enum() *ExternalIPAttachmentState { + p := new(ExternalIPAttachmentState) + *p = x + return p +} + +func (x ExternalIPAttachmentState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPAttachmentState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[1].Descriptor() +} + +func (ExternalIPAttachmentState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_attachment_type_proto_enumTypes[1] +} + +func (x ExternalIPAttachmentState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents a binding between an ExternalIP and a target resource. +// +// An ExternalIPAttachment is a first-class resource that manages the attach/detach lifecycle +// independently from the ExternalIP allocation lifecycle. Creating an ExternalIPAttachment triggers +// the attach workflow; deleting it triggers the detach workflow. +// +// The binding is immutable: to change the target, delete the attachment and create a new one. +// The oneof target field supports ComputeInstance, Cluster, and BareMetalInstance targets. +// +// For cluster targets, the target_endpoint field specifies which cluster endpoint receives the +// external IP (API server or ingress). An ExternalIPAttachment can be created before the cluster +// is ready and will activate automatically once the cluster's VIP is available. +// +// Lifecycle: PENDING (attach in progress) -> READY (attached and routing traffic) -> DELETING +// (detach in progress). FAILED is a terminal error state that retries via the standard +// provisioning lifecycle with exponential backoff. +type ExternalIPAttachment struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + xxx_hidden_Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3"` + xxx_hidden_Spec *ExternalIPAttachmentSpec `protobuf:"bytes,3,opt,name=spec,proto3"` + xxx_hidden_Status *ExternalIPAttachmentStatus `protobuf:"bytes,4,opt,name=status,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachment) Reset() { + *x = ExternalIPAttachment{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachment) ProtoMessage() {} + +func (x *ExternalIPAttachment) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[0] + 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 *ExternalIPAttachment) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPAttachment) GetMetadata() *Metadata { + if x != nil { + return x.xxx_hidden_Metadata + } + return nil +} + +func (x *ExternalIPAttachment) GetSpec() *ExternalIPAttachmentSpec { + if x != nil { + return x.xxx_hidden_Spec + } + return nil +} + +func (x *ExternalIPAttachment) GetStatus() *ExternalIPAttachmentStatus { + if x != nil { + return x.xxx_hidden_Status + } + return nil +} + +func (x *ExternalIPAttachment) SetId(v string) { + x.xxx_hidden_Id = v +} + +func (x *ExternalIPAttachment) SetMetadata(v *Metadata) { + x.xxx_hidden_Metadata = v +} + +func (x *ExternalIPAttachment) SetSpec(v *ExternalIPAttachmentSpec) { + x.xxx_hidden_Spec = v +} + +func (x *ExternalIPAttachment) SetStatus(v *ExternalIPAttachmentStatus) { + x.xxx_hidden_Status = v +} + +func (x *ExternalIPAttachment) HasMetadata() bool { + if x == nil { + return false + } + return x.xxx_hidden_Metadata != nil +} + +func (x *ExternalIPAttachment) HasSpec() bool { + if x == nil { + return false + } + return x.xxx_hidden_Spec != nil +} + +func (x *ExternalIPAttachment) HasStatus() bool { + if x == nil { + return false + } + return x.xxx_hidden_Status != nil +} + +func (x *ExternalIPAttachment) ClearMetadata() { + x.xxx_hidden_Metadata = nil +} + +func (x *ExternalIPAttachment) ClearSpec() { + x.xxx_hidden_Spec = nil +} + +func (x *ExternalIPAttachment) ClearStatus() { + x.xxx_hidden_Status = nil +} + +type ExternalIPAttachment_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP attachment. + Id string + // Metadata of the external IP attachment, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP attachment (user-specified). + Spec *ExternalIPAttachmentSpec + // Current state of the external IP attachment (system-provided, read-only). + Status *ExternalIPAttachmentStatus +} + +func (b0 ExternalIPAttachment_builder) Build() *ExternalIPAttachment { + m0 := &ExternalIPAttachment{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + x.xxx_hidden_Metadata = b.Metadata + x.xxx_hidden_Spec = b.Spec + x.xxx_hidden_Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIPAttachment. +// +// All fields are required and immutable after creation. The external_ip must reference an +// existing ExternalIP in ALLOCATED state. The target must reference a valid resource that +// supports external IP attachment. +type ExternalIPAttachmentSpec struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_ExternalIp string `protobuf:"bytes,1,opt,name=external_ip,json=externalIp,proto3"` + xxx_hidden_Target isExternalIPAttachmentSpec_Target `protobuf_oneof:"target"` + xxx_hidden_TargetEndpoint ExternalIPAttachmentEndpoint `protobuf:"varint,5,opt,name=target_endpoint,json=targetEndpoint,proto3,enum=osac.private.v1.ExternalIPAttachmentEndpoint"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentSpec) Reset() { + *x = ExternalIPAttachmentSpec{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentSpec) ProtoMessage() {} + +func (x *ExternalIPAttachmentSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1] + 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 *ExternalIPAttachmentSpec) GetExternalIp() string { + if x != nil { + return x.xxx_hidden_ExternalIp + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetComputeInstance() string { + if x != nil { + if x, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_ComputeInstance); ok { + return x.ComputeInstance + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetCluster() string { + if x != nil { + if x, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_Cluster); ok { + return x.Cluster + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetBaremetalInstance() string { + if x != nil { + if x, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_BaremetalInstance); ok { + return x.BaremetalInstance + } + } + return "" +} + +func (x *ExternalIPAttachmentSpec) GetTargetEndpoint() ExternalIPAttachmentEndpoint { + if x != nil { + return x.xxx_hidden_TargetEndpoint + } + return ExternalIPAttachmentEndpoint_EXTERNAL_IP_ATTACHMENT_ENDPOINT_UNSPECIFIED +} + +func (x *ExternalIPAttachmentSpec) SetExternalIp(v string) { + x.xxx_hidden_ExternalIp = v +} + +func (x *ExternalIPAttachmentSpec) SetComputeInstance(v string) { + x.xxx_hidden_Target = &externalIPAttachmentSpec_ComputeInstance{v} +} + +func (x *ExternalIPAttachmentSpec) SetCluster(v string) { + x.xxx_hidden_Target = &externalIPAttachmentSpec_Cluster{v} +} + +func (x *ExternalIPAttachmentSpec) SetBaremetalInstance(v string) { + x.xxx_hidden_Target = &externalIPAttachmentSpec_BaremetalInstance{v} +} + +func (x *ExternalIPAttachmentSpec) SetTargetEndpoint(v ExternalIPAttachmentEndpoint) { + x.xxx_hidden_TargetEndpoint = v +} + +func (x *ExternalIPAttachmentSpec) HasTarget() bool { + if x == nil { + return false + } + return x.xxx_hidden_Target != nil +} + +func (x *ExternalIPAttachmentSpec) HasComputeInstance() bool { + if x == nil { + return false + } + _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_ComputeInstance) + return ok +} + +func (x *ExternalIPAttachmentSpec) HasCluster() bool { + if x == nil { + return false + } + _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_Cluster) + return ok +} + +func (x *ExternalIPAttachmentSpec) HasBaremetalInstance() bool { + if x == nil { + return false + } + _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_BaremetalInstance) + return ok +} + +func (x *ExternalIPAttachmentSpec) ClearTarget() { + x.xxx_hidden_Target = nil +} + +func (x *ExternalIPAttachmentSpec) ClearComputeInstance() { + if _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_ComputeInstance); ok { + x.xxx_hidden_Target = nil + } +} + +func (x *ExternalIPAttachmentSpec) ClearCluster() { + if _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_Cluster); ok { + x.xxx_hidden_Target = nil + } +} + +func (x *ExternalIPAttachmentSpec) ClearBaremetalInstance() { + if _, ok := x.xxx_hidden_Target.(*externalIPAttachmentSpec_BaremetalInstance); ok { + x.xxx_hidden_Target = nil + } +} + +const ExternalIPAttachmentSpec_Target_not_set_case case_ExternalIPAttachmentSpec_Target = 0 +const ExternalIPAttachmentSpec_ComputeInstance_case case_ExternalIPAttachmentSpec_Target = 2 +const ExternalIPAttachmentSpec_Cluster_case case_ExternalIPAttachmentSpec_Target = 3 +const ExternalIPAttachmentSpec_BaremetalInstance_case case_ExternalIPAttachmentSpec_Target = 4 + +func (x *ExternalIPAttachmentSpec) WhichTarget() case_ExternalIPAttachmentSpec_Target { + if x == nil { + return ExternalIPAttachmentSpec_Target_not_set_case + } + switch x.xxx_hidden_Target.(type) { + case *externalIPAttachmentSpec_ComputeInstance: + return ExternalIPAttachmentSpec_ComputeInstance_case + case *externalIPAttachmentSpec_Cluster: + return ExternalIPAttachmentSpec_Cluster_case + case *externalIPAttachmentSpec_BaremetalInstance: + return ExternalIPAttachmentSpec_BaremetalInstance_case + default: + return ExternalIPAttachmentSpec_Target_not_set_case + } +} + +type ExternalIPAttachmentSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // ExternalIP ID to attach. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIP in ALLOCATED state that is not already + // attached (status.attached == false). Only one ExternalIPAttachment may exist per ExternalIP. + // + // Example: "019728a4-3f5c-7def-8abc-1234567890ab" + ExternalIp string + // Target resource to attach the external IP to. Exactly one target field must be set. + // Required and immutable after creation. + + // Fields of oneof xxx_hidden_Target: + // ComputeInstance ID to attach this external IP to. + // + // Must reference the ID of an existing ComputeInstance in RUNNING state. Only one + // ExternalIPAttachment may exist per ComputeInstance. + // + // Example: "01972f1b-a4e9-7c82-9def-abcdef123456" + ComputeInstance *string + // Cluster ID to attach this external IP to. + // + // Must reference the ID of an existing Cluster. The target_endpoint field is required + // when targeting a cluster to specify which endpoint (API or ingress) receives the + // external IP. The attachment can be created before the cluster is ready and will + // activate once the cluster's VIP is available. + // + // Example: "01973a2c-b5f0-7d93-8abc-def012345678" + Cluster *string + // BareMetalInstance ID to attach this external IP to. + // + // Must reference the ID of an existing BareMetalInstance. DNAT rules will be configured + // to forward traffic from the external IP to the bare-metal instance's internal IP. + // + // Example: "01973b3d-c6e1-7ea4-9bcd-ef0123456789" + BaremetalInstance *string + // -- end of xxx_hidden_Target + // Cluster endpoint to attach the external IP to. Required when target is cluster. + // + // Specifies whether the external IP should be routed to the cluster's API server endpoint + // or its ingress endpoint. Ignored for non-cluster targets. Immutable after creation. + TargetEndpoint ExternalIPAttachmentEndpoint +} + +func (b0 ExternalIPAttachmentSpec_builder) Build() *ExternalIPAttachmentSpec { + m0 := &ExternalIPAttachmentSpec{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_ExternalIp = b.ExternalIp + if b.ComputeInstance != nil { + x.xxx_hidden_Target = &externalIPAttachmentSpec_ComputeInstance{*b.ComputeInstance} + } + if b.Cluster != nil { + x.xxx_hidden_Target = &externalIPAttachmentSpec_Cluster{*b.Cluster} + } + if b.BaremetalInstance != nil { + x.xxx_hidden_Target = &externalIPAttachmentSpec_BaremetalInstance{*b.BaremetalInstance} + } + x.xxx_hidden_TargetEndpoint = b.TargetEndpoint + return m0 +} + +type case_ExternalIPAttachmentSpec_Target protoreflect.FieldNumber + +func (x case_ExternalIPAttachmentSpec_Target) String() string { + md := file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1].Descriptor() + if x == 0 { + return "not set" + } + return protoimpl.X.MessageFieldStringOf(md, protoreflect.FieldNumber(x)) +} + +type isExternalIPAttachmentSpec_Target interface { + isExternalIPAttachmentSpec_Target() +} + +type externalIPAttachmentSpec_ComputeInstance struct { + // ComputeInstance ID to attach this external IP to. + // + // Must reference the ID of an existing ComputeInstance in RUNNING state. Only one + // ExternalIPAttachment may exist per ComputeInstance. + // + // Example: "01972f1b-a4e9-7c82-9def-abcdef123456" + ComputeInstance string `protobuf:"bytes,2,opt,name=compute_instance,json=computeInstance,proto3,oneof"` +} + +type externalIPAttachmentSpec_Cluster struct { + // Cluster ID to attach this external IP to. + // + // Must reference the ID of an existing Cluster. The target_endpoint field is required + // when targeting a cluster to specify which endpoint (API or ingress) receives the + // external IP. The attachment can be created before the cluster is ready and will + // activate once the cluster's VIP is available. + // + // Example: "01973a2c-b5f0-7d93-8abc-def012345678" + Cluster string `protobuf:"bytes,3,opt,name=cluster,proto3,oneof"` +} + +type externalIPAttachmentSpec_BaremetalInstance struct { + // BareMetalInstance ID to attach this external IP to. + // + // Must reference the ID of an existing BareMetalInstance. DNAT rules will be configured + // to forward traffic from the external IP to the bare-metal instance's internal IP. + // + // Example: "01973b3d-c6e1-7ea4-9bcd-ef0123456789" + BaremetalInstance string `protobuf:"bytes,4,opt,name=baremetal_instance,json=baremetalInstance,proto3,oneof"` +} + +func (*externalIPAttachmentSpec_ComputeInstance) isExternalIPAttachmentSpec_Target() {} + +func (*externalIPAttachmentSpec_Cluster) isExternalIPAttachmentSpec_Target() {} + +func (*externalIPAttachmentSpec_BaremetalInstance) isExternalIPAttachmentSpec_Target() {} + +// Represents the current operational state of an ExternalIPAttachment. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the +// system updates them based on reconciliation of the spec and feedback from the cluster +// controller. +type ExternalIPAttachmentStatus struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_State ExternalIPAttachmentState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPAttachmentState"` + xxx_hidden_ExternalIpAddress string `protobuf:"bytes,2,opt,name=external_ip_address,json=externalIpAddress,proto3"` + xxx_hidden_Message *string `protobuf:"bytes,3,opt,name=message,proto3,oneof"` + xxx_hidden_Hub string `protobuf:"bytes,4,opt,name=hub,proto3"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentStatus) Reset() { + *x = ExternalIPAttachmentStatus{} + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentStatus) ProtoMessage() {} + +func (x *ExternalIPAttachmentStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2] + 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 *ExternalIPAttachmentStatus) GetState() ExternalIPAttachmentState { + if x != nil { + return x.xxx_hidden_State + } + return ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED +} + +func (x *ExternalIPAttachmentStatus) GetExternalIpAddress() string { + if x != nil { + return x.xxx_hidden_ExternalIpAddress + } + return "" +} + +func (x *ExternalIPAttachmentStatus) GetMessage() string { + if x != nil { + if x.xxx_hidden_Message != nil { + return *x.xxx_hidden_Message + } + return "" + } + return "" +} + +func (x *ExternalIPAttachmentStatus) GetHub() string { + if x != nil { + return x.xxx_hidden_Hub + } + return "" +} + +func (x *ExternalIPAttachmentStatus) SetState(v ExternalIPAttachmentState) { + x.xxx_hidden_State = v +} + +func (x *ExternalIPAttachmentStatus) SetExternalIpAddress(v string) { + x.xxx_hidden_ExternalIpAddress = v +} + +func (x *ExternalIPAttachmentStatus) SetMessage(v string) { + x.xxx_hidden_Message = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 4) +} + +func (x *ExternalIPAttachmentStatus) SetHub(v string) { + x.xxx_hidden_Hub = v +} + +func (x *ExternalIPAttachmentStatus) HasMessage() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 2) +} + +func (x *ExternalIPAttachmentStatus) ClearMessage() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2) + x.xxx_hidden_Message = nil +} + +type ExternalIPAttachmentStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP attachment. + State ExternalIPAttachmentState + // Allocated IP address from the parent ExternalIP. + // + // Populated for convenience once the attachment reaches READY state. Mirrors the address + // field from the referenced ExternalIP's status. + ExternalIpAddress string + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information. For FAILED state, contains the + // error details. Typically empty for READY state. + Message *string + // Identifier of the hub cluster that this external IP attachment is deployed to. + // + // Set by the fulfillment-service controller when reconciling the attachment to a + // Kubernetes CR on the target hub cluster. + Hub string +} + +func (b0 ExternalIPAttachmentStatus_builder) Build() *ExternalIPAttachmentStatus { + m0 := &ExternalIPAttachmentStatus{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_State = b.State + x.xxx_hidden_ExternalIpAddress = b.ExternalIpAddress + if b.Message != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 4) + x.xxx_hidden_Message = b.Message + } + x.xxx_hidden_Hub = b.Hub + return m0 +} + +var File_osac_private_v1_external_ip_attachment_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_attachment_type_proto_rawDesc = string([]byte{ + 0x0a, 0x31, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe1, 0x01, 0x0a, 0x14, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x43, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xa4, + 0x02, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0b, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x70, 0x12, 0x2b, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, + 0x12, 0x62, 0x61, 0x72, 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x62, 0x61, 0x72, + 0x65, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x5b, + 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xdf, 0x01, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x45, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x13, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x11, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x42, 0x0a, 0x0a, 0x08, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xa5, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x2b, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x45, 0x58, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x41, 0x50, 0x49, + 0x10, 0x01, 0x12, 0x2b, 0x0a, 0x27, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, + 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x4e, 0x44, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x5f, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, + 0xef, 0x01, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, + 0x28, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, + 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, + 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x27, 0x0a, + 0x23, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x29, 0x0a, 0x25, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, + 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x48, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, + 0x04, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 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_external_ip_attachment_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_external_ip_attachment_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_attachment_type_proto_goTypes = []any{ + (ExternalIPAttachmentEndpoint)(0), // 0: osac.private.v1.ExternalIPAttachmentEndpoint + (ExternalIPAttachmentState)(0), // 1: osac.private.v1.ExternalIPAttachmentState + (*ExternalIPAttachment)(nil), // 2: osac.private.v1.ExternalIPAttachment + (*ExternalIPAttachmentSpec)(nil), // 3: osac.private.v1.ExternalIPAttachmentSpec + (*ExternalIPAttachmentStatus)(nil), // 4: osac.private.v1.ExternalIPAttachmentStatus + (*Metadata)(nil), // 5: osac.private.v1.Metadata +} +var file_osac_private_v1_external_ip_attachment_type_proto_depIdxs = []int32{ + 5, // 0: osac.private.v1.ExternalIPAttachment.metadata:type_name -> osac.private.v1.Metadata + 3, // 1: osac.private.v1.ExternalIPAttachment.spec:type_name -> osac.private.v1.ExternalIPAttachmentSpec + 4, // 2: osac.private.v1.ExternalIPAttachment.status:type_name -> osac.private.v1.ExternalIPAttachmentStatus + 0, // 3: osac.private.v1.ExternalIPAttachmentSpec.target_endpoint:type_name -> osac.private.v1.ExternalIPAttachmentEndpoint + 1, // 4: osac.private.v1.ExternalIPAttachmentStatus.state:type_name -> osac.private.v1.ExternalIPAttachmentState + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_attachment_type_proto_init() } +func file_osac_private_v1_external_ip_attachment_type_proto_init() { + if File_osac_private_v1_external_ip_attachment_type_proto != nil { + return + } + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[1].OneofWrappers = []any{ + (*externalIPAttachmentSpec_ComputeInstance)(nil), + (*externalIPAttachmentSpec_Cluster)(nil), + (*externalIPAttachmentSpec_BaremetalInstance)(nil), + } + file_osac_private_v1_external_ip_attachment_type_proto_msgTypes[2].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_external_ip_attachment_type_proto_rawDesc), len(file_osac_private_v1_external_ip_attachment_type_proto_rawDesc)), + NumEnums: 2, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_attachment_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_attachment_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_attachment_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_attachment_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_attachment_type_proto = out.File + file_osac_private_v1_external_ip_attachment_type_proto_goTypes = nil + file_osac_private_v1_external_ip_attachment_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_attachments_service.pb.go b/internal/api/osac/private/v1/external_ip_attachments_service.pb.go new file mode 100644 index 00000000..d5a3b88a --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_attachments_service.pb.go @@ -0,0 +1,1201 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_attachments_service.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPAttachmentsListRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Index of the first result. If not specified the default value will be zero. + Offset *int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all attachments + // in READY state: + // + // this.status.state == EXTERNAL_IP_ATTACHMENT_STATE_READY + // + // If this isn't provided, or if the value is empty, then all the external IP attachments that the user has permission + // to see will be returned. + Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP attachment instead of the names of the columns of a table. For example, + // in order to sort the attachments descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof" json:"order,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsListRequest) Reset() { + *x = ExternalIPAttachmentsListRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsListRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0] + 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 *ExternalIPAttachmentsListRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +func (x *ExternalIPAttachmentsListRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ExternalIPAttachmentsListRequest) GetFilter() string { + if x != nil && x.Filter != nil { + return *x.Filter + } + return "" +} + +func (x *ExternalIPAttachmentsListRequest) GetOrder() string { + if x != nil && x.Order != nil { + return *x.Order + } + return "" +} + +func (x *ExternalIPAttachmentsListRequest) SetOffset(v int32) { + x.Offset = &v +} + +func (x *ExternalIPAttachmentsListRequest) SetLimit(v int32) { + x.Limit = &v +} + +func (x *ExternalIPAttachmentsListRequest) SetFilter(v string) { + x.Filter = &v +} + +func (x *ExternalIPAttachmentsListRequest) SetOrder(v string) { + x.Order = &v +} + +func (x *ExternalIPAttachmentsListRequest) HasOffset() bool { + if x == nil { + return false + } + return x.Offset != nil +} + +func (x *ExternalIPAttachmentsListRequest) HasLimit() bool { + if x == nil { + return false + } + return x.Limit != nil +} + +func (x *ExternalIPAttachmentsListRequest) HasFilter() bool { + if x == nil { + return false + } + return x.Filter != nil +} + +func (x *ExternalIPAttachmentsListRequest) HasOrder() bool { + if x == nil { + return false + } + return x.Order != nil +} + +func (x *ExternalIPAttachmentsListRequest) ClearOffset() { + x.Offset = nil +} + +func (x *ExternalIPAttachmentsListRequest) ClearLimit() { + x.Limit = nil +} + +func (x *ExternalIPAttachmentsListRequest) ClearFilter() { + x.Filter = nil +} + +func (x *ExternalIPAttachmentsListRequest) ClearOrder() { + x.Order = nil +} + +type ExternalIPAttachmentsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all attachments + // in READY state: + // + // this.status.state == EXTERNAL_IP_ATTACHMENT_STATE_READY + // + // If this isn't provided, or if the value is empty, then all the external IP attachments that the user has permission + // to see will be returned. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP attachment instead of the names of the columns of a table. For example, + // in order to sort the attachments descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPAttachmentsListRequest_builder) Build() *ExternalIPAttachmentsListRequest { + m0 := &ExternalIPAttachmentsListRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Offset = b.Offset + x.Limit = b.Limit + x.Filter = b.Filter + x.Order = b.Order + return m0 +} + +type ExternalIPAttachmentsListResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Actual number of items returned. + Size int32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` + // Total number of items of the collection that match the search criteria. + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + // List of results. + Items []*ExternalIPAttachment `protobuf:"bytes,3,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsListResponse) Reset() { + *x = ExternalIPAttachmentsListResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsListResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[1] + 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 *ExternalIPAttachmentsListResponse) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ExternalIPAttachmentsListResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ExternalIPAttachmentsListResponse) GetItems() []*ExternalIPAttachment { + if x != nil { + return x.Items + } + return nil +} + +func (x *ExternalIPAttachmentsListResponse) SetSize(v int32) { + x.Size = v +} + +func (x *ExternalIPAttachmentsListResponse) SetTotal(v int32) { + x.Total = v +} + +func (x *ExternalIPAttachmentsListResponse) SetItems(v []*ExternalIPAttachment) { + x.Items = v +} + +type ExternalIPAttachmentsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. + Size int32 + // Total number of items of the collection that match the search criteria. + Total int32 + // List of results. + Items []*ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsListResponse_builder) Build() *ExternalIPAttachmentsListResponse { + m0 := &ExternalIPAttachmentsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Size = b.Size + x.Total = b.Total + x.Items = b.Items + return m0 +} + +type ExternalIPAttachmentsGetRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsGetRequest) Reset() { + *x = ExternalIPAttachmentsGetRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsGetRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[2] + 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 *ExternalIPAttachmentsGetRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPAttachmentsGetRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPAttachmentsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsGetRequest_builder) Build() *ExternalIPAttachmentsGetRequest { + m0 := &ExternalIPAttachmentsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPAttachmentsGetResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsGetResponse) Reset() { + *x = ExternalIPAttachmentsGetResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsGetResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[3] + 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 *ExternalIPAttachmentsGetResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPAttachmentsGetResponse) SetObject(v *ExternalIPAttachment) { + x.Object = v +} + +func (x *ExternalIPAttachmentsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPAttachmentsGetResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPAttachmentsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsGetResponse_builder) Build() *ExternalIPAttachmentsGetResponse { + m0 := &ExternalIPAttachmentsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPAttachmentsCreateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsCreateRequest) Reset() { + *x = ExternalIPAttachmentsCreateRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[4] + 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 *ExternalIPAttachmentsCreateRequest) GetObject() *ExternalIPAttachment { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPAttachmentsCreateRequest) SetObject(v *ExternalIPAttachment) { + x.Object = v +} + +func (x *ExternalIPAttachmentsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPAttachmentsCreateRequest) ClearObject() { + x.Object = nil +} + +type ExternalIPAttachmentsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsCreateRequest_builder) Build() *ExternalIPAttachmentsCreateRequest { + m0 := &ExternalIPAttachmentsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPAttachmentsCreateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsCreateResponse) Reset() { + *x = ExternalIPAttachmentsCreateResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_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 *ExternalIPAttachmentsCreateResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPAttachmentsCreateResponse) SetObject(v *ExternalIPAttachment) { + x.Object = v +} + +func (x *ExternalIPAttachmentsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPAttachmentsCreateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPAttachmentsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsCreateResponse_builder) Build() *ExternalIPAttachmentsCreateResponse { + m0 := &ExternalIPAttachmentsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPAttachmentsUpdateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool `protobuf:"varint,3,opt,name=lock,proto3" json:"lock,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsUpdateRequest) Reset() { + *x = ExternalIPAttachmentsUpdateRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_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 *ExternalIPAttachmentsUpdateRequest) GetObject() *ExternalIPAttachment { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) GetLock() bool { + if x != nil { + return x.Lock + } + return false +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetObject(v *ExternalIPAttachment) { + x.Object = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.UpdateMask = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetLock(v bool) { + x.Lock = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.UpdateMask != nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) ClearObject() { + x.Object = nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) ClearUpdateMask() { + x.UpdateMask = nil +} + +type ExternalIPAttachmentsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPAttachmentsUpdateRequest_builder) Build() *ExternalIPAttachmentsUpdateRequest { + m0 := &ExternalIPAttachmentsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + x.UpdateMask = b.UpdateMask + x.Lock = b.Lock + return m0 +} + +type ExternalIPAttachmentsUpdateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsUpdateResponse) Reset() { + *x = ExternalIPAttachmentsUpdateResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[7] + 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 *ExternalIPAttachmentsUpdateResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateResponse) SetObject(v *ExternalIPAttachment) { + x.Object = v +} + +func (x *ExternalIPAttachmentsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPAttachmentsUpdateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPAttachmentsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsUpdateResponse_builder) Build() *ExternalIPAttachmentsUpdateResponse { + m0 := &ExternalIPAttachmentsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPAttachmentsDeleteRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsDeleteRequest) Reset() { + *x = ExternalIPAttachmentsDeleteRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[8] + 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 *ExternalIPAttachmentsDeleteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPAttachmentsDeleteRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPAttachmentsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsDeleteRequest_builder) Build() *ExternalIPAttachmentsDeleteRequest { + m0 := &ExternalIPAttachmentsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPAttachmentsDeleteResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsDeleteResponse) Reset() { + *x = ExternalIPAttachmentsDeleteResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPAttachmentsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPAttachmentsDeleteResponse_builder) Build() *ExternalIPAttachmentsDeleteResponse { + m0 := &ExternalIPAttachmentsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPAttachmentsSignalRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsSignalRequest) Reset() { + *x = ExternalIPAttachmentsSignalRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[10] + 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 *ExternalIPAttachmentsSignalRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPAttachmentsSignalRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPAttachmentsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsSignalRequest_builder) Build() *ExternalIPAttachmentsSignalRequest { + m0 := &ExternalIPAttachmentsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPAttachmentsSignalResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsSignalResponse) Reset() { + *x = ExternalIPAttachmentsSignalResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPAttachmentsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPAttachmentsSignalResponse_builder) Build() *ExternalIPAttachmentsSignalResponse { + m0 := &ExternalIPAttachmentsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ip_attachments_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_attachments_service_proto_rawDesc = string([]byte{ + 0x0a, 0x35, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x01, 0x0a, 0x20, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x21, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x31, 0x0a, 0x1f, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x61, 0x0a, 0x20, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x63, 0x0a, + 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x64, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xb4, 0x01, 0x0a, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x64, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x34, 0x0a, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x23, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x34, 0x0a, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, + 0x80, 0x08, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x04, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x31, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x29, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x03, 0x47, + 0x65, 0x74, 0x12, 0x30, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x62, + 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x39, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, + 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xc0, 0x01, 0x0a, + 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x33, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, + 0xa9, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x06, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0xe6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x21, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_attachments_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ip_attachments_service_proto_goTypes = []any{ + (*ExternalIPAttachmentsListRequest)(nil), // 0: osac.private.v1.ExternalIPAttachmentsListRequest + (*ExternalIPAttachmentsListResponse)(nil), // 1: osac.private.v1.ExternalIPAttachmentsListResponse + (*ExternalIPAttachmentsGetRequest)(nil), // 2: osac.private.v1.ExternalIPAttachmentsGetRequest + (*ExternalIPAttachmentsGetResponse)(nil), // 3: osac.private.v1.ExternalIPAttachmentsGetResponse + (*ExternalIPAttachmentsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPAttachmentsCreateRequest + (*ExternalIPAttachmentsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPAttachmentsCreateResponse + (*ExternalIPAttachmentsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPAttachmentsUpdateRequest + (*ExternalIPAttachmentsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPAttachmentsUpdateResponse + (*ExternalIPAttachmentsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPAttachmentsDeleteRequest + (*ExternalIPAttachmentsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPAttachmentsDeleteResponse + (*ExternalIPAttachmentsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPAttachmentsSignalRequest + (*ExternalIPAttachmentsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPAttachmentsSignalResponse + (*ExternalIPAttachment)(nil), // 12: osac.private.v1.ExternalIPAttachment + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ip_attachments_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPAttachmentsListResponse.items:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 1: osac.private.v1.ExternalIPAttachmentsGetResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 2: osac.private.v1.ExternalIPAttachmentsCreateRequest.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 3: osac.private.v1.ExternalIPAttachmentsCreateResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 4: osac.private.v1.ExternalIPAttachmentsUpdateRequest.object:type_name -> osac.private.v1.ExternalIPAttachment + 13, // 5: osac.private.v1.ExternalIPAttachmentsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPAttachmentsUpdateResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 0, // 7: osac.private.v1.ExternalIPAttachments.List:input_type -> osac.private.v1.ExternalIPAttachmentsListRequest + 2, // 8: osac.private.v1.ExternalIPAttachments.Get:input_type -> osac.private.v1.ExternalIPAttachmentsGetRequest + 4, // 9: osac.private.v1.ExternalIPAttachments.Create:input_type -> osac.private.v1.ExternalIPAttachmentsCreateRequest + 6, // 10: osac.private.v1.ExternalIPAttachments.Update:input_type -> osac.private.v1.ExternalIPAttachmentsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPAttachments.Delete:input_type -> osac.private.v1.ExternalIPAttachmentsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPAttachments.Signal:input_type -> osac.private.v1.ExternalIPAttachmentsSignalRequest + 1, // 13: osac.private.v1.ExternalIPAttachments.List:output_type -> osac.private.v1.ExternalIPAttachmentsListResponse + 3, // 14: osac.private.v1.ExternalIPAttachments.Get:output_type -> osac.private.v1.ExternalIPAttachmentsGetResponse + 5, // 15: osac.private.v1.ExternalIPAttachments.Create:output_type -> osac.private.v1.ExternalIPAttachmentsCreateResponse + 7, // 16: osac.private.v1.ExternalIPAttachments.Update:output_type -> osac.private.v1.ExternalIPAttachmentsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPAttachments.Delete:output_type -> osac.private.v1.ExternalIPAttachmentsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPAttachments.Signal:output_type -> osac.private.v1.ExternalIPAttachmentsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_attachments_service_proto_init() } +func file_osac_private_v1_external_ip_attachments_service_proto_init() { + if File_osac_private_v1_external_ip_attachments_service_proto != nil { + return + } + file_osac_private_v1_external_ip_attachment_type_proto_init() + file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0].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_external_ip_attachments_service_proto_rawDesc), len(file_osac_private_v1_external_ip_attachments_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ip_attachments_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_attachments_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ip_attachments_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_attachments_service_proto = out.File + file_osac_private_v1_external_ip_attachments_service_proto_goTypes = nil + file_osac_private_v1_external_ip_attachments_service_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_attachments_service_grpc.pb.go b/internal/api/osac/private/v1/external_ip_attachments_service_grpc.pb.go new file mode 100644 index 00000000..3ffea2e3 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_attachments_service_grpc.pb.go @@ -0,0 +1,336 @@ +// +// 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. +// + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: osac/private/v1/external_ip_attachments_service.proto + +package privatev1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ExternalIPAttachments_List_FullMethodName = "/osac.private.v1.ExternalIPAttachments/List" + ExternalIPAttachments_Get_FullMethodName = "/osac.private.v1.ExternalIPAttachments/Get" + ExternalIPAttachments_Create_FullMethodName = "/osac.private.v1.ExternalIPAttachments/Create" + ExternalIPAttachments_Update_FullMethodName = "/osac.private.v1.ExternalIPAttachments/Update" + ExternalIPAttachments_Delete_FullMethodName = "/osac.private.v1.ExternalIPAttachments/Delete" + ExternalIPAttachments_Signal_FullMethodName = "/osac.private.v1.ExternalIPAttachments/Signal" +) + +// ExternalIPAttachmentsClient is the client API for ExternalIPAttachments service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ExternalIPAttachmentsClient interface { + // Retrieves the list of external IP attachments. + List(ctx context.Context, in *ExternalIPAttachmentsListRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsListResponse, error) + // Retrieves the details of one specific external IP attachment. + Get(ctx context.Context, in *ExternalIPAttachmentsGetRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsGetResponse, error) + // Creates a new external IP attachment. Binds an ExternalIP to a target resource. + Create(ctx context.Context, in *ExternalIPAttachmentsCreateRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsCreateResponse, error) + // Updates an existing external IP attachment. Only metadata (labels, annotations) can be changed. + Update(ctx context.Context, in *ExternalIPAttachmentsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsUpdateResponse, error) + // Deletes an external IP attachment. Triggers the detach workflow to unbind the ExternalIP from the target. + Delete(ctx context.Context, in *ExternalIPAttachmentsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(ctx context.Context, in *ExternalIPAttachmentsSignalRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsSignalResponse, error) +} + +type externalIPAttachmentsClient struct { + cc grpc.ClientConnInterface +} + +func NewExternalIPAttachmentsClient(cc grpc.ClientConnInterface) ExternalIPAttachmentsClient { + return &externalIPAttachmentsClient{cc} +} + +func (c *externalIPAttachmentsClient) List(ctx context.Context, in *ExternalIPAttachmentsListRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsListResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_List_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPAttachmentsClient) Get(ctx context.Context, in *ExternalIPAttachmentsGetRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsGetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsGetResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_Get_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPAttachmentsClient) Create(ctx context.Context, in *ExternalIPAttachmentsCreateRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsCreateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsCreateResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_Create_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPAttachmentsClient) Update(ctx context.Context, in *ExternalIPAttachmentsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsUpdateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsUpdateResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_Update_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPAttachmentsClient) Delete(ctx context.Context, in *ExternalIPAttachmentsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsDeleteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsDeleteResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_Delete_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPAttachmentsClient) Signal(ctx context.Context, in *ExternalIPAttachmentsSignalRequest, opts ...grpc.CallOption) (*ExternalIPAttachmentsSignalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPAttachmentsSignalResponse) + err := c.cc.Invoke(ctx, ExternalIPAttachments_Signal_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ExternalIPAttachmentsServer is the server API for ExternalIPAttachments service. +// All implementations must embed UnimplementedExternalIPAttachmentsServer +// for forward compatibility. +type ExternalIPAttachmentsServer interface { + // Retrieves the list of external IP attachments. + List(context.Context, *ExternalIPAttachmentsListRequest) (*ExternalIPAttachmentsListResponse, error) + // Retrieves the details of one specific external IP attachment. + Get(context.Context, *ExternalIPAttachmentsGetRequest) (*ExternalIPAttachmentsGetResponse, error) + // Creates a new external IP attachment. Binds an ExternalIP to a target resource. + Create(context.Context, *ExternalIPAttachmentsCreateRequest) (*ExternalIPAttachmentsCreateResponse, error) + // Updates an existing external IP attachment. Only metadata (labels, annotations) can be changed. + Update(context.Context, *ExternalIPAttachmentsUpdateRequest) (*ExternalIPAttachmentsUpdateResponse, error) + // Deletes an external IP attachment. Triggers the detach workflow to unbind the ExternalIP from the target. + Delete(context.Context, *ExternalIPAttachmentsDeleteRequest) (*ExternalIPAttachmentsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(context.Context, *ExternalIPAttachmentsSignalRequest) (*ExternalIPAttachmentsSignalResponse, error) + mustEmbedUnimplementedExternalIPAttachmentsServer() +} + +// UnimplementedExternalIPAttachmentsServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedExternalIPAttachmentsServer struct{} + +func (UnimplementedExternalIPAttachmentsServer) List(context.Context, *ExternalIPAttachmentsListRequest) (*ExternalIPAttachmentsListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) Get(context.Context, *ExternalIPAttachmentsGetRequest) (*ExternalIPAttachmentsGetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) Create(context.Context, *ExternalIPAttachmentsCreateRequest) (*ExternalIPAttachmentsCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) Update(context.Context, *ExternalIPAttachmentsUpdateRequest) (*ExternalIPAttachmentsUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) Delete(context.Context, *ExternalIPAttachmentsDeleteRequest) (*ExternalIPAttachmentsDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) Signal(context.Context, *ExternalIPAttachmentsSignalRequest) (*ExternalIPAttachmentsSignalResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Signal not implemented") +} +func (UnimplementedExternalIPAttachmentsServer) mustEmbedUnimplementedExternalIPAttachmentsServer() {} +func (UnimplementedExternalIPAttachmentsServer) testEmbeddedByValue() {} + +// UnsafeExternalIPAttachmentsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ExternalIPAttachmentsServer will +// result in compilation errors. +type UnsafeExternalIPAttachmentsServer interface { + mustEmbedUnimplementedExternalIPAttachmentsServer() +} + +func RegisterExternalIPAttachmentsServer(s grpc.ServiceRegistrar, srv ExternalIPAttachmentsServer) { + // If the following call pancis, it indicates UnimplementedExternalIPAttachmentsServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ExternalIPAttachments_ServiceDesc, srv) +} + +func _ExternalIPAttachments_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).List(ctx, req.(*ExternalIPAttachmentsListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPAttachments_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_Get_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).Get(ctx, req.(*ExternalIPAttachmentsGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPAttachments_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_Create_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).Create(ctx, req.(*ExternalIPAttachmentsCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPAttachments_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_Update_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).Update(ctx, req.(*ExternalIPAttachmentsUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPAttachments_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_Delete_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).Delete(ctx, req.(*ExternalIPAttachmentsDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPAttachments_Signal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPAttachmentsSignalRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPAttachmentsServer).Signal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPAttachments_Signal_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPAttachmentsServer).Signal(ctx, req.(*ExternalIPAttachmentsSignalRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ExternalIPAttachments_ServiceDesc is the grpc.ServiceDesc for ExternalIPAttachments service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ExternalIPAttachments_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "osac.private.v1.ExternalIPAttachments", + HandlerType: (*ExternalIPAttachmentsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "List", + Handler: _ExternalIPAttachments_List_Handler, + }, + { + MethodName: "Get", + Handler: _ExternalIPAttachments_Get_Handler, + }, + { + MethodName: "Create", + Handler: _ExternalIPAttachments_Create_Handler, + }, + { + MethodName: "Update", + Handler: _ExternalIPAttachments_Update_Handler, + }, + { + MethodName: "Delete", + Handler: _ExternalIPAttachments_Delete_Handler, + }, + { + MethodName: "Signal", + Handler: _ExternalIPAttachments_Signal_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osac/private/v1/external_ip_attachments_service.proto", +} diff --git a/internal/api/osac/private/v1/external_ip_attachments_service_protoopaque.pb.go b/internal/api/osac/private/v1/external_ip_attachments_service_protoopaque.pb.go new file mode 100644 index 00000000..90a912a2 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_attachments_service_protoopaque.pb.go @@ -0,0 +1,1201 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_attachments_service.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPAttachmentsListRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Offset int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof"` + xxx_hidden_Limit int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof"` + xxx_hidden_Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof"` + xxx_hidden_Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsListRequest) Reset() { + *x = ExternalIPAttachmentsListRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsListRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0] + 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 *ExternalIPAttachmentsListRequest) GetOffset() int32 { + if x != nil { + return x.xxx_hidden_Offset + } + return 0 +} + +func (x *ExternalIPAttachmentsListRequest) GetLimit() int32 { + if x != nil { + return x.xxx_hidden_Limit + } + return 0 +} + +func (x *ExternalIPAttachmentsListRequest) GetFilter() string { + if x != nil { + if x.xxx_hidden_Filter != nil { + return *x.xxx_hidden_Filter + } + return "" + } + return "" +} + +func (x *ExternalIPAttachmentsListRequest) GetOrder() string { + if x != nil { + if x.xxx_hidden_Order != nil { + return *x.xxx_hidden_Order + } + return "" + } + return "" +} + +func (x *ExternalIPAttachmentsListRequest) SetOffset(v int32) { + x.xxx_hidden_Offset = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 4) +} + +func (x *ExternalIPAttachmentsListRequest) SetLimit(v int32) { + x.xxx_hidden_Limit = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 4) +} + +func (x *ExternalIPAttachmentsListRequest) SetFilter(v string) { + x.xxx_hidden_Filter = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 4) +} + +func (x *ExternalIPAttachmentsListRequest) SetOrder(v string) { + x.xxx_hidden_Order = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 4) +} + +func (x *ExternalIPAttachmentsListRequest) HasOffset() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 0) +} + +func (x *ExternalIPAttachmentsListRequest) HasLimit() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *ExternalIPAttachmentsListRequest) HasFilter() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 2) +} + +func (x *ExternalIPAttachmentsListRequest) HasOrder() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 3) +} + +func (x *ExternalIPAttachmentsListRequest) ClearOffset() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0) + x.xxx_hidden_Offset = 0 +} + +func (x *ExternalIPAttachmentsListRequest) ClearLimit() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Limit = 0 +} + +func (x *ExternalIPAttachmentsListRequest) ClearFilter() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2) + x.xxx_hidden_Filter = nil +} + +func (x *ExternalIPAttachmentsListRequest) ClearOrder() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3) + x.xxx_hidden_Order = nil +} + +type ExternalIPAttachmentsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all attachments + // in READY state: + // + // this.status.state == EXTERNAL_IP_ATTACHMENT_STATE_READY + // + // If this isn't provided, or if the value is empty, then all the external IP attachments that the user has permission + // to see will be returned. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP attachment instead of the names of the columns of a table. For example, + // in order to sort the attachments descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPAttachmentsListRequest_builder) Build() *ExternalIPAttachmentsListRequest { + m0 := &ExternalIPAttachmentsListRequest{} + b, x := &b0, m0 + _, _ = b, x + if b.Offset != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 4) + x.xxx_hidden_Offset = *b.Offset + } + if b.Limit != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 4) + x.xxx_hidden_Limit = *b.Limit + } + if b.Filter != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 4) + x.xxx_hidden_Filter = b.Filter + } + if b.Order != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 4) + x.xxx_hidden_Order = b.Order + } + return m0 +} + +type ExternalIPAttachmentsListResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Size int32 `protobuf:"varint,1,opt,name=size,proto3"` + xxx_hidden_Total int32 `protobuf:"varint,2,opt,name=total,proto3"` + xxx_hidden_Items *[]*ExternalIPAttachment `protobuf:"bytes,3,rep,name=items,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsListResponse) Reset() { + *x = ExternalIPAttachmentsListResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsListResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[1] + 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 *ExternalIPAttachmentsListResponse) GetSize() int32 { + if x != nil { + return x.xxx_hidden_Size + } + return 0 +} + +func (x *ExternalIPAttachmentsListResponse) GetTotal() int32 { + if x != nil { + return x.xxx_hidden_Total + } + return 0 +} + +func (x *ExternalIPAttachmentsListResponse) GetItems() []*ExternalIPAttachment { + if x != nil { + if x.xxx_hidden_Items != nil { + return *x.xxx_hidden_Items + } + } + return nil +} + +func (x *ExternalIPAttachmentsListResponse) SetSize(v int32) { + x.xxx_hidden_Size = v +} + +func (x *ExternalIPAttachmentsListResponse) SetTotal(v int32) { + x.xxx_hidden_Total = v +} + +func (x *ExternalIPAttachmentsListResponse) SetItems(v []*ExternalIPAttachment) { + x.xxx_hidden_Items = &v +} + +type ExternalIPAttachmentsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. + Size int32 + // Total number of items of the collection that match the search criteria. + Total int32 + // List of results. + Items []*ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsListResponse_builder) Build() *ExternalIPAttachmentsListResponse { + m0 := &ExternalIPAttachmentsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Size = b.Size + x.xxx_hidden_Total = b.Total + x.xxx_hidden_Items = &b.Items + return m0 +} + +type ExternalIPAttachmentsGetRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsGetRequest) Reset() { + *x = ExternalIPAttachmentsGetRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsGetRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[2] + 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 *ExternalIPAttachmentsGetRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPAttachmentsGetRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPAttachmentsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsGetRequest_builder) Build() *ExternalIPAttachmentsGetRequest { + m0 := &ExternalIPAttachmentsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPAttachmentsGetResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsGetResponse) Reset() { + *x = ExternalIPAttachmentsGetResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsGetResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[3] + 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 *ExternalIPAttachmentsGetResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPAttachmentsGetResponse) SetObject(v *ExternalIPAttachment) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPAttachmentsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPAttachmentsGetResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPAttachmentsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsGetResponse_builder) Build() *ExternalIPAttachmentsGetResponse { + m0 := &ExternalIPAttachmentsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPAttachmentsCreateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsCreateRequest) Reset() { + *x = ExternalIPAttachmentsCreateRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[4] + 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 *ExternalIPAttachmentsCreateRequest) GetObject() *ExternalIPAttachment { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPAttachmentsCreateRequest) SetObject(v *ExternalIPAttachment) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPAttachmentsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPAttachmentsCreateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPAttachmentsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsCreateRequest_builder) Build() *ExternalIPAttachmentsCreateRequest { + m0 := &ExternalIPAttachmentsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPAttachmentsCreateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsCreateResponse) Reset() { + *x = ExternalIPAttachmentsCreateResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_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 *ExternalIPAttachmentsCreateResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPAttachmentsCreateResponse) SetObject(v *ExternalIPAttachment) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPAttachmentsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPAttachmentsCreateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPAttachmentsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsCreateResponse_builder) Build() *ExternalIPAttachmentsCreateResponse { + m0 := &ExternalIPAttachmentsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPAttachmentsUpdateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3"` + xxx_hidden_UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3"` + xxx_hidden_Lock bool `protobuf:"varint,3,opt,name=lock,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsUpdateRequest) Reset() { + *x = ExternalIPAttachmentsUpdateRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_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 *ExternalIPAttachmentsUpdateRequest) GetObject() *ExternalIPAttachment { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.xxx_hidden_UpdateMask + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) GetLock() bool { + if x != nil { + return x.xxx_hidden_Lock + } + return false +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetObject(v *ExternalIPAttachment) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.xxx_hidden_UpdateMask = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) SetLock(v bool) { + x.xxx_hidden_Lock = v +} + +func (x *ExternalIPAttachmentsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.xxx_hidden_UpdateMask != nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +func (x *ExternalIPAttachmentsUpdateRequest) ClearUpdateMask() { + x.xxx_hidden_UpdateMask = nil +} + +type ExternalIPAttachmentsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPAttachmentsUpdateRequest_builder) Build() *ExternalIPAttachmentsUpdateRequest { + m0 := &ExternalIPAttachmentsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + x.xxx_hidden_UpdateMask = b.UpdateMask + x.xxx_hidden_Lock = b.Lock + return m0 +} + +type ExternalIPAttachmentsUpdateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPAttachment `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsUpdateResponse) Reset() { + *x = ExternalIPAttachmentsUpdateResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[7] + 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 *ExternalIPAttachmentsUpdateResponse) GetObject() *ExternalIPAttachment { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPAttachmentsUpdateResponse) SetObject(v *ExternalIPAttachment) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPAttachmentsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPAttachmentsUpdateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPAttachmentsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPAttachment +} + +func (b0 ExternalIPAttachmentsUpdateResponse_builder) Build() *ExternalIPAttachmentsUpdateResponse { + m0 := &ExternalIPAttachmentsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPAttachmentsDeleteRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsDeleteRequest) Reset() { + *x = ExternalIPAttachmentsDeleteRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[8] + 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 *ExternalIPAttachmentsDeleteRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPAttachmentsDeleteRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPAttachmentsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsDeleteRequest_builder) Build() *ExternalIPAttachmentsDeleteRequest { + m0 := &ExternalIPAttachmentsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPAttachmentsDeleteResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsDeleteResponse) Reset() { + *x = ExternalIPAttachmentsDeleteResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPAttachmentsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPAttachmentsDeleteResponse_builder) Build() *ExternalIPAttachmentsDeleteResponse { + m0 := &ExternalIPAttachmentsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPAttachmentsSignalRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsSignalRequest) Reset() { + *x = ExternalIPAttachmentsSignalRequest{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPAttachmentsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[10] + 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 *ExternalIPAttachmentsSignalRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPAttachmentsSignalRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPAttachmentsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPAttachmentsSignalRequest_builder) Build() *ExternalIPAttachmentsSignalRequest { + m0 := &ExternalIPAttachmentsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPAttachmentsSignalResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPAttachmentsSignalResponse) Reset() { + *x = ExternalIPAttachmentsSignalResponse{} + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPAttachmentsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPAttachmentsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPAttachmentsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPAttachmentsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPAttachmentsSignalResponse_builder) Build() *ExternalIPAttachmentsSignalResponse { + m0 := &ExternalIPAttachmentsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ip_attachments_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_attachments_service_proto_rawDesc = string([]byte{ + 0x0a, 0x35, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x01, 0x0a, 0x20, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x21, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3b, 0x0a, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x31, 0x0a, 0x1f, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x61, 0x0a, 0x20, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, + 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x63, 0x0a, + 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x64, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xb4, 0x01, 0x0a, 0x22, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, + 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x22, + 0x64, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x34, 0x0a, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x23, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x34, 0x0a, 0x22, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x25, 0x0a, 0x23, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, + 0x80, 0x08, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x04, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x31, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x29, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xa8, 0x01, 0x0a, 0x03, 0x47, + 0x65, 0x74, 0x12, 0x30, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x62, + 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x39, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, + 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0xc0, 0x01, 0x0a, + 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x33, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, + 0xa9, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x2a, 0x2c, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x75, 0x0a, 0x06, 0x53, + 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x33, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0xe6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x21, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_attachments_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ip_attachments_service_proto_goTypes = []any{ + (*ExternalIPAttachmentsListRequest)(nil), // 0: osac.private.v1.ExternalIPAttachmentsListRequest + (*ExternalIPAttachmentsListResponse)(nil), // 1: osac.private.v1.ExternalIPAttachmentsListResponse + (*ExternalIPAttachmentsGetRequest)(nil), // 2: osac.private.v1.ExternalIPAttachmentsGetRequest + (*ExternalIPAttachmentsGetResponse)(nil), // 3: osac.private.v1.ExternalIPAttachmentsGetResponse + (*ExternalIPAttachmentsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPAttachmentsCreateRequest + (*ExternalIPAttachmentsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPAttachmentsCreateResponse + (*ExternalIPAttachmentsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPAttachmentsUpdateRequest + (*ExternalIPAttachmentsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPAttachmentsUpdateResponse + (*ExternalIPAttachmentsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPAttachmentsDeleteRequest + (*ExternalIPAttachmentsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPAttachmentsDeleteResponse + (*ExternalIPAttachmentsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPAttachmentsSignalRequest + (*ExternalIPAttachmentsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPAttachmentsSignalResponse + (*ExternalIPAttachment)(nil), // 12: osac.private.v1.ExternalIPAttachment + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ip_attachments_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPAttachmentsListResponse.items:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 1: osac.private.v1.ExternalIPAttachmentsGetResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 2: osac.private.v1.ExternalIPAttachmentsCreateRequest.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 3: osac.private.v1.ExternalIPAttachmentsCreateResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 12, // 4: osac.private.v1.ExternalIPAttachmentsUpdateRequest.object:type_name -> osac.private.v1.ExternalIPAttachment + 13, // 5: osac.private.v1.ExternalIPAttachmentsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPAttachmentsUpdateResponse.object:type_name -> osac.private.v1.ExternalIPAttachment + 0, // 7: osac.private.v1.ExternalIPAttachments.List:input_type -> osac.private.v1.ExternalIPAttachmentsListRequest + 2, // 8: osac.private.v1.ExternalIPAttachments.Get:input_type -> osac.private.v1.ExternalIPAttachmentsGetRequest + 4, // 9: osac.private.v1.ExternalIPAttachments.Create:input_type -> osac.private.v1.ExternalIPAttachmentsCreateRequest + 6, // 10: osac.private.v1.ExternalIPAttachments.Update:input_type -> osac.private.v1.ExternalIPAttachmentsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPAttachments.Delete:input_type -> osac.private.v1.ExternalIPAttachmentsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPAttachments.Signal:input_type -> osac.private.v1.ExternalIPAttachmentsSignalRequest + 1, // 13: osac.private.v1.ExternalIPAttachments.List:output_type -> osac.private.v1.ExternalIPAttachmentsListResponse + 3, // 14: osac.private.v1.ExternalIPAttachments.Get:output_type -> osac.private.v1.ExternalIPAttachmentsGetResponse + 5, // 15: osac.private.v1.ExternalIPAttachments.Create:output_type -> osac.private.v1.ExternalIPAttachmentsCreateResponse + 7, // 16: osac.private.v1.ExternalIPAttachments.Update:output_type -> osac.private.v1.ExternalIPAttachmentsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPAttachments.Delete:output_type -> osac.private.v1.ExternalIPAttachmentsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPAttachments.Signal:output_type -> osac.private.v1.ExternalIPAttachmentsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_attachments_service_proto_init() } +func file_osac_private_v1_external_ip_attachments_service_proto_init() { + if File_osac_private_v1_external_ip_attachments_service_proto != nil { + return + } + file_osac_private_v1_external_ip_attachment_type_proto_init() + file_osac_private_v1_external_ip_attachments_service_proto_msgTypes[0].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_external_ip_attachments_service_proto_rawDesc), len(file_osac_private_v1_external_ip_attachments_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ip_attachments_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_attachments_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ip_attachments_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_attachments_service_proto = out.File + file_osac_private_v1_external_ip_attachments_service_proto_goTypes = nil + file_osac_private_v1_external_ip_attachments_service_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_pool_type.pb.go b/internal/api/osac/private/v1/external_ip_pool_type.pb.go new file mode 100644 index 00000000..053c9953 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_pool_type.pb.go @@ -0,0 +1,711 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_pool_type.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Lifecycle states for ExternalIPPool resources. +// +// State transitions typically follow: UNSPECIFIED -> PENDING -> READY, with FAILED as a terminal +// error state that may require user intervention or resource recreation. +// +// The CRD phase "Progressing" maps to PENDING at the proto level. This is consistent with all +// networking resources in the fulfillment-service (VirtualNetwork, Subnet, SecurityGroup, +// NetworkClass, HostClass). PENDING describes user-facing readiness ("not usable yet"), while +// the CRD phase describes controller activity ("reconciliation in progress"). +type ExternalIPPoolState int32 + +const ( + // State is unknown or has not been determined yet. Default state before initialization. + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_UNSPECIFIED ExternalIPPoolState = 0 + // The pool is being provisioned and is not ready for IP allocation yet. + // + // During this state, the system is creating the MetalLB IPAddressPool on the target cluster + // and configuring L2 advertisement. Maps from CRD phase "Progressing". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING ExternalIPPoolState = 1 + // The pool is fully operational and ready for ExternalIP allocation. + // + // MetalLB IPAddressPool is configured and L2 advertisement is active. ExternalIPs can be + // allocated from this pool's CIDR ranges. Maps from CRD phase "Ready". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY ExternalIPPoolState = 2 + // The pool provisioning has failed. + // + // The status.message field contains error details. Common causes include MetalLB configuration + // errors or cluster connectivity issues. Maps from CRD phase "Failed". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_FAILED ExternalIPPoolState = 3 + // The pool is being deleted. + // + // During this state, the system is removing the MetalLB IPAddressPool and cleaning up + // cluster resources. Deletion is rejected if allocated ExternalIPs still reference this pool. + // Maps from CRD phase "Deleting". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING ExternalIPPoolState = 4 + // The pool deletion has failed. + // + // The deprovision operation encountered an error and could not complete. The status.message + // field contains error details. Manual intervention may be required before retrying deletion. + // No CRD phase equivalent (follows the Subnet pattern for proto-level tracking). + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETE_FAILED ExternalIPPoolState = 5 +) + +// Enum value maps for ExternalIPPoolState. +var ( + ExternalIPPoolState_name = map[int32]string{ + 0: "EXTERNAL_IP_POOL_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_POOL_STATE_PENDING", + 2: "EXTERNAL_IP_POOL_STATE_READY", + 3: "EXTERNAL_IP_POOL_STATE_FAILED", + 4: "EXTERNAL_IP_POOL_STATE_DELETING", + 5: "EXTERNAL_IP_POOL_STATE_DELETE_FAILED", + } + ExternalIPPoolState_value = map[string]int32{ + "EXTERNAL_IP_POOL_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_POOL_STATE_PENDING": 1, + "EXTERNAL_IP_POOL_STATE_READY": 2, + "EXTERNAL_IP_POOL_STATE_FAILED": 3, + "EXTERNAL_IP_POOL_STATE_DELETING": 4, + "EXTERNAL_IP_POOL_STATE_DELETE_FAILED": 5, + } +) + +func (x ExternalIPPoolState) Enum() *ExternalIPPoolState { + p := new(ExternalIPPoolState) + *p = x + return p +} + +func (x ExternalIPPoolState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPPoolState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_pool_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPPoolState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_pool_type_proto_enumTypes[0] +} + +func (x ExternalIPPoolState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents a pool of external IP addresses available for allocation. +// +// Each ExternalIPPool supports a single IP family (IPv4 or IPv6). The pool contains one or more CIDR +// ranges from which individual ExternalIP addresses are allocated. Pools are provider-managed +// resources created by administrators through the private API. +// +// "External" means external to the VirtualNetwork. The addresses may be internet-routable or +// data-center-routable depending on the deployment topology (e.g., air-gapped environments). +// +// The implementation_strategy field determines how IPs from this pool are advertised on the target +// cluster (e.g., MetalLB L2 mode). This field is set by the system and is not user-configurable. +// +// Capacity tracking fields in the status (total, allocated, available) reflect the current utilization +// of the pool across all its CIDR ranges. +type ExternalIPPool struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Unique identifier of the external IP pool. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Metadata of the external IP pool, including name, labels, and timestamps. + Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Desired configuration of the external IP pool (admin-specified). + Spec *ExternalIPPoolSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + // Current state of the external IP pool (system-provided, read-only). + Status *ExternalIPPoolStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPool) Reset() { + *x = ExternalIPPool{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPool) ProtoMessage() {} + +func (x *ExternalIPPool) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[0] + 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 *ExternalIPPool) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPPool) GetMetadata() *Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ExternalIPPool) GetSpec() *ExternalIPPoolSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *ExternalIPPool) GetStatus() *ExternalIPPoolStatus { + if x != nil { + return x.Status + } + return nil +} + +func (x *ExternalIPPool) SetId(v string) { + x.Id = v +} + +func (x *ExternalIPPool) SetMetadata(v *Metadata) { + x.Metadata = v +} + +func (x *ExternalIPPool) SetSpec(v *ExternalIPPoolSpec) { + x.Spec = v +} + +func (x *ExternalIPPool) SetStatus(v *ExternalIPPoolStatus) { + x.Status = v +} + +func (x *ExternalIPPool) HasMetadata() bool { + if x == nil { + return false + } + return x.Metadata != nil +} + +func (x *ExternalIPPool) HasSpec() bool { + if x == nil { + return false + } + return x.Spec != nil +} + +func (x *ExternalIPPool) HasStatus() bool { + if x == nil { + return false + } + return x.Status != nil +} + +func (x *ExternalIPPool) ClearMetadata() { + x.Metadata = nil +} + +func (x *ExternalIPPool) ClearSpec() { + x.Spec = nil +} + +func (x *ExternalIPPool) ClearStatus() { + x.Status = nil +} + +type ExternalIPPool_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP pool. + Id string + // Metadata of the external IP pool, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP pool (admin-specified). + Spec *ExternalIPPoolSpec + // Current state of the external IP pool (system-provided, read-only). + Status *ExternalIPPoolStatus +} + +func (b0 ExternalIPPool_builder) Build() *ExternalIPPool { + m0 := &ExternalIPPool{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + x.Metadata = b.Metadata + x.Spec = b.Spec + x.Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIPPool. +// +// All spec fields are immutable after creation. To change CIDRs, delete the pool and create a +// new one. The Update RPC only allows metadata changes (name, labels, annotations). +type ExternalIPPoolSpec struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // CIDR ranges for this pool. Required and immutable after creation. + // + // Each entry must be valid CIDR notation matching the declared ip_family. All CIDRs must be + // the same IP family. CIDRs must not overlap with CIDRs in other pools. + // + // Example (IPv4): ["192.168.1.0/24", "10.0.5.0/28"] + // Example (IPv6): ["2001:db8::/64"] + Cidrs []string `protobuf:"bytes,2,rep,name=cidrs,proto3" json:"cidrs,omitempty"` + // IP address family for this pool. Required and immutable after creation. + // + // Determines whether the CIDRs in this pool are IPv4 or IPv6. All CIDRs must match this + // family. A single pool cannot mix IPv4 and IPv6 ranges. + IpFamily IPFamily `protobuf:"varint,3,opt,name=ip_family,json=ipFamily,proto3,enum=osac.private.v1.IPFamily" json:"ip_family,omitempty"` + // Backend strategy used to advertise IPs from this pool on the target cluster. + // + // Set by the system based on cluster configuration. Not user-configurable. Currently the + // only supported strategy is "metallb-l2" (MetalLB Layer 2 advertisement mode). + ImplementationStrategy string `protobuf:"bytes,4,opt,name=implementation_strategy,json=implementationStrategy,proto3" json:"implementation_strategy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolSpec) Reset() { + *x = ExternalIPPoolSpec{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolSpec) ProtoMessage() {} + +func (x *ExternalIPPoolSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[1] + 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 *ExternalIPPoolSpec) GetCidrs() []string { + if x != nil { + return x.Cidrs + } + return nil +} + +func (x *ExternalIPPoolSpec) GetIpFamily() IPFamily { + if x != nil { + return x.IpFamily + } + return IPFamily_IP_FAMILY_UNSPECIFIED +} + +func (x *ExternalIPPoolSpec) GetImplementationStrategy() string { + if x != nil { + return x.ImplementationStrategy + } + return "" +} + +func (x *ExternalIPPoolSpec) SetCidrs(v []string) { + x.Cidrs = v +} + +func (x *ExternalIPPoolSpec) SetIpFamily(v IPFamily) { + x.IpFamily = v +} + +func (x *ExternalIPPoolSpec) SetImplementationStrategy(v string) { + x.ImplementationStrategy = v +} + +type ExternalIPPoolSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // CIDR ranges for this pool. Required and immutable after creation. + // + // Each entry must be valid CIDR notation matching the declared ip_family. All CIDRs must be + // the same IP family. CIDRs must not overlap with CIDRs in other pools. + // + // Example (IPv4): ["192.168.1.0/24", "10.0.5.0/28"] + // Example (IPv6): ["2001:db8::/64"] + Cidrs []string + // IP address family for this pool. Required and immutable after creation. + // + // Determines whether the CIDRs in this pool are IPv4 or IPv6. All CIDRs must match this + // family. A single pool cannot mix IPv4 and IPv6 ranges. + IpFamily IPFamily + // Backend strategy used to advertise IPs from this pool on the target cluster. + // + // Set by the system based on cluster configuration. Not user-configurable. Currently the + // only supported strategy is "metallb-l2" (MetalLB Layer 2 advertisement mode). + ImplementationStrategy string +} + +func (b0 ExternalIPPoolSpec_builder) Build() *ExternalIPPoolSpec { + m0 := &ExternalIPPoolSpec{} + b, x := &b0, m0 + _, _ = b, x + x.Cidrs = b.Cidrs + x.IpFamily = b.IpFamily + x.ImplementationStrategy = b.ImplementationStrategy + return m0 +} + +// Represents the current operational state of an ExternalIPPool. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the system +// updates them based on reconciliation of the spec and feedback from the cluster controller. +type ExternalIPPoolStatus struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Current lifecycle state of the external IP pool. + State ExternalIPPoolState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPPoolState" json:"state,omitempty"` + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for MetalLB configuration". + // For FAILED state, contains error details. For READY state, typically empty. + Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"` + // Identifier of the hub cluster that this pool is deployed to. + // + // Set by the fulfillment-service controller when reconciling the pool to a Kubernetes CR on + // the target hub cluster. Used for tracking which cluster the pool resources reside on. + Hub string `protobuf:"bytes,3,opt,name=hub,proto3" json:"hub,omitempty"` + // Total number of usable IP addresses across all CIDRs in this pool. + // + // Calculated from the CIDR ranges (e.g., a /24 IPv4 CIDR yields 254 usable addresses, + // excluding network and broadcast addresses). Uses int64 to accommodate large IPv6 CIDR + // ranges whose address counts exceed int32 capacity. + Total int64 `protobuf:"varint,4,opt,name=total,proto3" json:"total,omitempty"` + // Number of IP addresses currently allocated to ExternalIP resources from this pool. + Allocated int64 `protobuf:"varint,5,opt,name=allocated,proto3" json:"allocated,omitempty"` + // Number of IP addresses available for new allocations from this pool. + // + // Equal to total minus allocated. + Available int64 `protobuf:"varint,6,opt,name=available,proto3" json:"available,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolStatus) Reset() { + *x = ExternalIPPoolStatus{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolStatus) ProtoMessage() {} + +func (x *ExternalIPPoolStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2] + 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 *ExternalIPPoolStatus) GetState() ExternalIPPoolState { + if x != nil { + return x.State + } + return ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_UNSPECIFIED +} + +func (x *ExternalIPPoolStatus) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +func (x *ExternalIPPoolStatus) GetHub() string { + if x != nil { + return x.Hub + } + return "" +} + +func (x *ExternalIPPoolStatus) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ExternalIPPoolStatus) GetAllocated() int64 { + if x != nil { + return x.Allocated + } + return 0 +} + +func (x *ExternalIPPoolStatus) GetAvailable() int64 { + if x != nil { + return x.Available + } + return 0 +} + +func (x *ExternalIPPoolStatus) SetState(v ExternalIPPoolState) { + x.State = v +} + +func (x *ExternalIPPoolStatus) SetMessage(v string) { + x.Message = &v +} + +func (x *ExternalIPPoolStatus) SetHub(v string) { + x.Hub = v +} + +func (x *ExternalIPPoolStatus) SetTotal(v int64) { + x.Total = v +} + +func (x *ExternalIPPoolStatus) SetAllocated(v int64) { + x.Allocated = v +} + +func (x *ExternalIPPoolStatus) SetAvailable(v int64) { + x.Available = v +} + +func (x *ExternalIPPoolStatus) HasMessage() bool { + if x == nil { + return false + } + return x.Message != nil +} + +func (x *ExternalIPPoolStatus) ClearMessage() { + x.Message = nil +} + +type ExternalIPPoolStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP pool. + State ExternalIPPoolState + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for MetalLB configuration". + // For FAILED state, contains error details. For READY state, typically empty. + Message *string + // Identifier of the hub cluster that this pool is deployed to. + // + // Set by the fulfillment-service controller when reconciling the pool to a Kubernetes CR on + // the target hub cluster. Used for tracking which cluster the pool resources reside on. + Hub string + // Total number of usable IP addresses across all CIDRs in this pool. + // + // Calculated from the CIDR ranges (e.g., a /24 IPv4 CIDR yields 254 usable addresses, + // excluding network and broadcast addresses). Uses int64 to accommodate large IPv6 CIDR + // ranges whose address counts exceed int32 capacity. + Total int64 + // Number of IP addresses currently allocated to ExternalIP resources from this pool. + Allocated int64 + // Number of IP addresses available for new allocations from this pool. + // + // Equal to total minus allocated. + Available int64 +} + +func (b0 ExternalIPPoolStatus_builder) Build() *ExternalIPPoolStatus { + m0 := &ExternalIPPoolStatus{} + b, x := &b0, m0 + _, _ = b, x + x.State = b.State + x.Message = b.Message + x.Hub = b.Hub + x.Total = b.Total + x.Allocated = b.Allocated + x.Available = b.Available + return m0 +} + +var File_osac_private_v1_external_ip_pool_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_pool_type_proto_rawDesc = string([]byte{ + 0x0a, 0x2b, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x24, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x01, 0x0a, 0x0e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb3, 0x01, 0x0a, + 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, + 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, + 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x22, 0xff, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2a, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x22, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, + 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, + 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x58, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, + 0x1f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, + 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, + 0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0xdc, 0x01, 0x0a, + 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x42, 0x17, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, + 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_external_ip_pool_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_pool_type_proto_goTypes = []any{ + (ExternalIPPoolState)(0), // 0: osac.private.v1.ExternalIPPoolState + (*ExternalIPPool)(nil), // 1: osac.private.v1.ExternalIPPool + (*ExternalIPPoolSpec)(nil), // 2: osac.private.v1.ExternalIPPoolSpec + (*ExternalIPPoolStatus)(nil), // 3: osac.private.v1.ExternalIPPoolStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata + (IPFamily)(0), // 5: osac.private.v1.IPFamily +} +var file_osac_private_v1_external_ip_pool_type_proto_depIdxs = []int32{ + 4, // 0: osac.private.v1.ExternalIPPool.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.ExternalIPPool.spec:type_name -> osac.private.v1.ExternalIPPoolSpec + 3, // 2: osac.private.v1.ExternalIPPool.status:type_name -> osac.private.v1.ExternalIPPoolStatus + 5, // 3: osac.private.v1.ExternalIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily + 0, // 4: osac.private.v1.ExternalIPPoolStatus.state:type_name -> osac.private.v1.ExternalIPPoolState + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_pool_type_proto_init() } +func file_osac_private_v1_external_ip_pool_type_proto_init() { + if File_osac_private_v1_external_ip_pool_type_proto != nil { + return + } + file_osac_private_v1_ip_family_type_proto_init() + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2].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_external_ip_pool_type_proto_rawDesc), len(file_osac_private_v1_external_ip_pool_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_pool_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_pool_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_pool_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_pool_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_pool_type_proto = out.File + file_osac_private_v1_external_ip_pool_type_proto_goTypes = nil + file_osac_private_v1_external_ip_pool_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_pool_type_protoopaque.pb.go b/internal/api/osac/private/v1/external_ip_pool_type_protoopaque.pb.go new file mode 100644 index 00000000..e5cf1895 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_pool_type_protoopaque.pb.go @@ -0,0 +1,684 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_pool_type.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Lifecycle states for ExternalIPPool resources. +// +// State transitions typically follow: UNSPECIFIED -> PENDING -> READY, with FAILED as a terminal +// error state that may require user intervention or resource recreation. +// +// The CRD phase "Progressing" maps to PENDING at the proto level. This is consistent with all +// networking resources in the fulfillment-service (VirtualNetwork, Subnet, SecurityGroup, +// NetworkClass, HostClass). PENDING describes user-facing readiness ("not usable yet"), while +// the CRD phase describes controller activity ("reconciliation in progress"). +type ExternalIPPoolState int32 + +const ( + // State is unknown or has not been determined yet. Default state before initialization. + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_UNSPECIFIED ExternalIPPoolState = 0 + // The pool is being provisioned and is not ready for IP allocation yet. + // + // During this state, the system is creating the MetalLB IPAddressPool on the target cluster + // and configuring L2 advertisement. Maps from CRD phase "Progressing". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING ExternalIPPoolState = 1 + // The pool is fully operational and ready for ExternalIP allocation. + // + // MetalLB IPAddressPool is configured and L2 advertisement is active. ExternalIPs can be + // allocated from this pool's CIDR ranges. Maps from CRD phase "Ready". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY ExternalIPPoolState = 2 + // The pool provisioning has failed. + // + // The status.message field contains error details. Common causes include MetalLB configuration + // errors or cluster connectivity issues. Maps from CRD phase "Failed". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_FAILED ExternalIPPoolState = 3 + // The pool is being deleted. + // + // During this state, the system is removing the MetalLB IPAddressPool and cleaning up + // cluster resources. Deletion is rejected if allocated ExternalIPs still reference this pool. + // Maps from CRD phase "Deleting". + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING ExternalIPPoolState = 4 + // The pool deletion has failed. + // + // The deprovision operation encountered an error and could not complete. The status.message + // field contains error details. Manual intervention may be required before retrying deletion. + // No CRD phase equivalent (follows the Subnet pattern for proto-level tracking). + ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETE_FAILED ExternalIPPoolState = 5 +) + +// Enum value maps for ExternalIPPoolState. +var ( + ExternalIPPoolState_name = map[int32]string{ + 0: "EXTERNAL_IP_POOL_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_POOL_STATE_PENDING", + 2: "EXTERNAL_IP_POOL_STATE_READY", + 3: "EXTERNAL_IP_POOL_STATE_FAILED", + 4: "EXTERNAL_IP_POOL_STATE_DELETING", + 5: "EXTERNAL_IP_POOL_STATE_DELETE_FAILED", + } + ExternalIPPoolState_value = map[string]int32{ + "EXTERNAL_IP_POOL_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_POOL_STATE_PENDING": 1, + "EXTERNAL_IP_POOL_STATE_READY": 2, + "EXTERNAL_IP_POOL_STATE_FAILED": 3, + "EXTERNAL_IP_POOL_STATE_DELETING": 4, + "EXTERNAL_IP_POOL_STATE_DELETE_FAILED": 5, + } +) + +func (x ExternalIPPoolState) Enum() *ExternalIPPoolState { + p := new(ExternalIPPoolState) + *p = x + return p +} + +func (x ExternalIPPoolState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPPoolState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_pool_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPPoolState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_pool_type_proto_enumTypes[0] +} + +func (x ExternalIPPoolState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents a pool of external IP addresses available for allocation. +// +// Each ExternalIPPool supports a single IP family (IPv4 or IPv6). The pool contains one or more CIDR +// ranges from which individual ExternalIP addresses are allocated. Pools are provider-managed +// resources created by administrators through the private API. +// +// "External" means external to the VirtualNetwork. The addresses may be internet-routable or +// data-center-routable depending on the deployment topology (e.g., air-gapped environments). +// +// The implementation_strategy field determines how IPs from this pool are advertised on the target +// cluster (e.g., MetalLB L2 mode). This field is set by the system and is not user-configurable. +// +// Capacity tracking fields in the status (total, allocated, available) reflect the current utilization +// of the pool across all its CIDR ranges. +type ExternalIPPool struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + xxx_hidden_Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3"` + xxx_hidden_Spec *ExternalIPPoolSpec `protobuf:"bytes,3,opt,name=spec,proto3"` + xxx_hidden_Status *ExternalIPPoolStatus `protobuf:"bytes,4,opt,name=status,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPool) Reset() { + *x = ExternalIPPool{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPool) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPool) ProtoMessage() {} + +func (x *ExternalIPPool) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[0] + 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 *ExternalIPPool) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPPool) GetMetadata() *Metadata { + if x != nil { + return x.xxx_hidden_Metadata + } + return nil +} + +func (x *ExternalIPPool) GetSpec() *ExternalIPPoolSpec { + if x != nil { + return x.xxx_hidden_Spec + } + return nil +} + +func (x *ExternalIPPool) GetStatus() *ExternalIPPoolStatus { + if x != nil { + return x.xxx_hidden_Status + } + return nil +} + +func (x *ExternalIPPool) SetId(v string) { + x.xxx_hidden_Id = v +} + +func (x *ExternalIPPool) SetMetadata(v *Metadata) { + x.xxx_hidden_Metadata = v +} + +func (x *ExternalIPPool) SetSpec(v *ExternalIPPoolSpec) { + x.xxx_hidden_Spec = v +} + +func (x *ExternalIPPool) SetStatus(v *ExternalIPPoolStatus) { + x.xxx_hidden_Status = v +} + +func (x *ExternalIPPool) HasMetadata() bool { + if x == nil { + return false + } + return x.xxx_hidden_Metadata != nil +} + +func (x *ExternalIPPool) HasSpec() bool { + if x == nil { + return false + } + return x.xxx_hidden_Spec != nil +} + +func (x *ExternalIPPool) HasStatus() bool { + if x == nil { + return false + } + return x.xxx_hidden_Status != nil +} + +func (x *ExternalIPPool) ClearMetadata() { + x.xxx_hidden_Metadata = nil +} + +func (x *ExternalIPPool) ClearSpec() { + x.xxx_hidden_Spec = nil +} + +func (x *ExternalIPPool) ClearStatus() { + x.xxx_hidden_Status = nil +} + +type ExternalIPPool_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP pool. + Id string + // Metadata of the external IP pool, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP pool (admin-specified). + Spec *ExternalIPPoolSpec + // Current state of the external IP pool (system-provided, read-only). + Status *ExternalIPPoolStatus +} + +func (b0 ExternalIPPool_builder) Build() *ExternalIPPool { + m0 := &ExternalIPPool{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + x.xxx_hidden_Metadata = b.Metadata + x.xxx_hidden_Spec = b.Spec + x.xxx_hidden_Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIPPool. +// +// All spec fields are immutable after creation. To change CIDRs, delete the pool and create a +// new one. The Update RPC only allows metadata changes (name, labels, annotations). +type ExternalIPPoolSpec struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Cidrs []string `protobuf:"bytes,2,rep,name=cidrs,proto3"` + xxx_hidden_IpFamily IPFamily `protobuf:"varint,3,opt,name=ip_family,json=ipFamily,proto3,enum=osac.private.v1.IPFamily"` + xxx_hidden_ImplementationStrategy string `protobuf:"bytes,4,opt,name=implementation_strategy,json=implementationStrategy,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolSpec) Reset() { + *x = ExternalIPPoolSpec{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolSpec) ProtoMessage() {} + +func (x *ExternalIPPoolSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[1] + 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 *ExternalIPPoolSpec) GetCidrs() []string { + if x != nil { + return x.xxx_hidden_Cidrs + } + return nil +} + +func (x *ExternalIPPoolSpec) GetIpFamily() IPFamily { + if x != nil { + return x.xxx_hidden_IpFamily + } + return IPFamily_IP_FAMILY_UNSPECIFIED +} + +func (x *ExternalIPPoolSpec) GetImplementationStrategy() string { + if x != nil { + return x.xxx_hidden_ImplementationStrategy + } + return "" +} + +func (x *ExternalIPPoolSpec) SetCidrs(v []string) { + x.xxx_hidden_Cidrs = v +} + +func (x *ExternalIPPoolSpec) SetIpFamily(v IPFamily) { + x.xxx_hidden_IpFamily = v +} + +func (x *ExternalIPPoolSpec) SetImplementationStrategy(v string) { + x.xxx_hidden_ImplementationStrategy = v +} + +type ExternalIPPoolSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // CIDR ranges for this pool. Required and immutable after creation. + // + // Each entry must be valid CIDR notation matching the declared ip_family. All CIDRs must be + // the same IP family. CIDRs must not overlap with CIDRs in other pools. + // + // Example (IPv4): ["192.168.1.0/24", "10.0.5.0/28"] + // Example (IPv6): ["2001:db8::/64"] + Cidrs []string + // IP address family for this pool. Required and immutable after creation. + // + // Determines whether the CIDRs in this pool are IPv4 or IPv6. All CIDRs must match this + // family. A single pool cannot mix IPv4 and IPv6 ranges. + IpFamily IPFamily + // Backend strategy used to advertise IPs from this pool on the target cluster. + // + // Set by the system based on cluster configuration. Not user-configurable. Currently the + // only supported strategy is "metallb-l2" (MetalLB Layer 2 advertisement mode). + ImplementationStrategy string +} + +func (b0 ExternalIPPoolSpec_builder) Build() *ExternalIPPoolSpec { + m0 := &ExternalIPPoolSpec{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Cidrs = b.Cidrs + x.xxx_hidden_IpFamily = b.IpFamily + x.xxx_hidden_ImplementationStrategy = b.ImplementationStrategy + return m0 +} + +// Represents the current operational state of an ExternalIPPool. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the system +// updates them based on reconciliation of the spec and feedback from the cluster controller. +type ExternalIPPoolStatus struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_State ExternalIPPoolState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPPoolState"` + xxx_hidden_Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof"` + xxx_hidden_Hub string `protobuf:"bytes,3,opt,name=hub,proto3"` + xxx_hidden_Total int64 `protobuf:"varint,4,opt,name=total,proto3"` + xxx_hidden_Allocated int64 `protobuf:"varint,5,opt,name=allocated,proto3"` + xxx_hidden_Available int64 `protobuf:"varint,6,opt,name=available,proto3"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolStatus) Reset() { + *x = ExternalIPPoolStatus{} + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolStatus) ProtoMessage() {} + +func (x *ExternalIPPoolStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2] + 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 *ExternalIPPoolStatus) GetState() ExternalIPPoolState { + if x != nil { + return x.xxx_hidden_State + } + return ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_UNSPECIFIED +} + +func (x *ExternalIPPoolStatus) GetMessage() string { + if x != nil { + if x.xxx_hidden_Message != nil { + return *x.xxx_hidden_Message + } + return "" + } + return "" +} + +func (x *ExternalIPPoolStatus) GetHub() string { + if x != nil { + return x.xxx_hidden_Hub + } + return "" +} + +func (x *ExternalIPPoolStatus) GetTotal() int64 { + if x != nil { + return x.xxx_hidden_Total + } + return 0 +} + +func (x *ExternalIPPoolStatus) GetAllocated() int64 { + if x != nil { + return x.xxx_hidden_Allocated + } + return 0 +} + +func (x *ExternalIPPoolStatus) GetAvailable() int64 { + if x != nil { + return x.xxx_hidden_Available + } + return 0 +} + +func (x *ExternalIPPoolStatus) SetState(v ExternalIPPoolState) { + x.xxx_hidden_State = v +} + +func (x *ExternalIPPoolStatus) SetMessage(v string) { + x.xxx_hidden_Message = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 6) +} + +func (x *ExternalIPPoolStatus) SetHub(v string) { + x.xxx_hidden_Hub = v +} + +func (x *ExternalIPPoolStatus) SetTotal(v int64) { + x.xxx_hidden_Total = v +} + +func (x *ExternalIPPoolStatus) SetAllocated(v int64) { + x.xxx_hidden_Allocated = v +} + +func (x *ExternalIPPoolStatus) SetAvailable(v int64) { + x.xxx_hidden_Available = v +} + +func (x *ExternalIPPoolStatus) HasMessage() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *ExternalIPPoolStatus) ClearMessage() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Message = nil +} + +type ExternalIPPoolStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP pool. + State ExternalIPPoolState + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for MetalLB configuration". + // For FAILED state, contains error details. For READY state, typically empty. + Message *string + // Identifier of the hub cluster that this pool is deployed to. + // + // Set by the fulfillment-service controller when reconciling the pool to a Kubernetes CR on + // the target hub cluster. Used for tracking which cluster the pool resources reside on. + Hub string + // Total number of usable IP addresses across all CIDRs in this pool. + // + // Calculated from the CIDR ranges (e.g., a /24 IPv4 CIDR yields 254 usable addresses, + // excluding network and broadcast addresses). Uses int64 to accommodate large IPv6 CIDR + // ranges whose address counts exceed int32 capacity. + Total int64 + // Number of IP addresses currently allocated to ExternalIP resources from this pool. + Allocated int64 + // Number of IP addresses available for new allocations from this pool. + // + // Equal to total minus allocated. + Available int64 +} + +func (b0 ExternalIPPoolStatus_builder) Build() *ExternalIPPoolStatus { + m0 := &ExternalIPPoolStatus{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_State = b.State + if b.Message != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 6) + x.xxx_hidden_Message = b.Message + } + x.xxx_hidden_Hub = b.Hub + x.xxx_hidden_Total = b.Total + x.xxx_hidden_Allocated = b.Allocated + x.xxx_hidden_Available = b.Available + return m0 +} + +var File_osac_private_v1_external_ip_pool_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_pool_type_proto_rawDesc = string([]byte{ + 0x0a, 0x2b, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x24, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcf, 0x01, 0x0a, 0x0e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x37, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb3, 0x01, 0x0a, + 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, + 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, + 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, + 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, + 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x22, 0xff, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2a, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x22, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, + 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, + 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x45, 0x58, 0x54, 0x45, + 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x58, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x23, 0x0a, + 0x1f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, + 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, + 0x10, 0x04, 0x12, 0x28, 0x0a, 0x24, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, + 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0xdc, 0x01, 0x0a, + 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x42, 0x17, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, + 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, + 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_external_ip_pool_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_pool_type_proto_goTypes = []any{ + (ExternalIPPoolState)(0), // 0: osac.private.v1.ExternalIPPoolState + (*ExternalIPPool)(nil), // 1: osac.private.v1.ExternalIPPool + (*ExternalIPPoolSpec)(nil), // 2: osac.private.v1.ExternalIPPoolSpec + (*ExternalIPPoolStatus)(nil), // 3: osac.private.v1.ExternalIPPoolStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata + (IPFamily)(0), // 5: osac.private.v1.IPFamily +} +var file_osac_private_v1_external_ip_pool_type_proto_depIdxs = []int32{ + 4, // 0: osac.private.v1.ExternalIPPool.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.ExternalIPPool.spec:type_name -> osac.private.v1.ExternalIPPoolSpec + 3, // 2: osac.private.v1.ExternalIPPool.status:type_name -> osac.private.v1.ExternalIPPoolStatus + 5, // 3: osac.private.v1.ExternalIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily + 0, // 4: osac.private.v1.ExternalIPPoolStatus.state:type_name -> osac.private.v1.ExternalIPPoolState + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_pool_type_proto_init() } +func file_osac_private_v1_external_ip_pool_type_proto_init() { + if File_osac_private_v1_external_ip_pool_type_proto != nil { + return + } + file_osac_private_v1_ip_family_type_proto_init() + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_pool_type_proto_msgTypes[2].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_external_ip_pool_type_proto_rawDesc), len(file_osac_private_v1_external_ip_pool_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_pool_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_pool_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_pool_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_pool_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_pool_type_proto = out.File + file_osac_private_v1_external_ip_pool_type_proto_goTypes = nil + file_osac_private_v1_external_ip_pool_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_pools_service.pb.go b/internal/api/osac/private/v1/external_ip_pools_service.pb.go new file mode 100644 index 00000000..2260c330 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_pools_service.pb.go @@ -0,0 +1,1194 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_pools_service.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPPoolsListRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Index of the first result. If not specified the default value will be zero. + Offset *int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all IPv4 external + // IP pools: + // + // this.spec.ip_family == IP_FAMILY_IPV4 + // + // If this isn't provided, or if the value is empty, then all the external IP pools that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP pool instead of the names of the columns of a table. For example, in + // order to sort the pools descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof" json:"order,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsListRequest) Reset() { + *x = ExternalIPPoolsListRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsListRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0] + 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 *ExternalIPPoolsListRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +func (x *ExternalIPPoolsListRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ExternalIPPoolsListRequest) GetFilter() string { + if x != nil && x.Filter != nil { + return *x.Filter + } + return "" +} + +func (x *ExternalIPPoolsListRequest) GetOrder() string { + if x != nil && x.Order != nil { + return *x.Order + } + return "" +} + +func (x *ExternalIPPoolsListRequest) SetOffset(v int32) { + x.Offset = &v +} + +func (x *ExternalIPPoolsListRequest) SetLimit(v int32) { + x.Limit = &v +} + +func (x *ExternalIPPoolsListRequest) SetFilter(v string) { + x.Filter = &v +} + +func (x *ExternalIPPoolsListRequest) SetOrder(v string) { + x.Order = &v +} + +func (x *ExternalIPPoolsListRequest) HasOffset() bool { + if x == nil { + return false + } + return x.Offset != nil +} + +func (x *ExternalIPPoolsListRequest) HasLimit() bool { + if x == nil { + return false + } + return x.Limit != nil +} + +func (x *ExternalIPPoolsListRequest) HasFilter() bool { + if x == nil { + return false + } + return x.Filter != nil +} + +func (x *ExternalIPPoolsListRequest) HasOrder() bool { + if x == nil { + return false + } + return x.Order != nil +} + +func (x *ExternalIPPoolsListRequest) ClearOffset() { + x.Offset = nil +} + +func (x *ExternalIPPoolsListRequest) ClearLimit() { + x.Limit = nil +} + +func (x *ExternalIPPoolsListRequest) ClearFilter() { + x.Filter = nil +} + +func (x *ExternalIPPoolsListRequest) ClearOrder() { + x.Order = nil +} + +type ExternalIPPoolsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all IPv4 external + // IP pools: + // + // this.spec.ip_family == IP_FAMILY_IPV4 + // + // If this isn't provided, or if the value is empty, then all the external IP pools that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP pool instead of the names of the columns of a table. For example, in + // order to sort the pools descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPPoolsListRequest_builder) Build() *ExternalIPPoolsListRequest { + m0 := &ExternalIPPoolsListRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Offset = b.Offset + x.Limit = b.Limit + x.Filter = b.Filter + x.Order = b.Order + return m0 +} + +type ExternalIPPoolsListResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + // List of results. + Items []*ExternalIPPool `protobuf:"bytes,3,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsListResponse) Reset() { + *x = ExternalIPPoolsListResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsListResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[1] + 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 *ExternalIPPoolsListResponse) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ExternalIPPoolsListResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ExternalIPPoolsListResponse) GetItems() []*ExternalIPPool { + if x != nil { + return x.Items + } + return nil +} + +func (x *ExternalIPPoolsListResponse) SetSize(v int32) { + x.Size = v +} + +func (x *ExternalIPPoolsListResponse) SetTotal(v int32) { + x.Total = v +} + +func (x *ExternalIPPoolsListResponse) SetItems(v []*ExternalIPPool) { + x.Items = v +} + +type ExternalIPPoolsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 + // List of results. + Items []*ExternalIPPool +} + +func (b0 ExternalIPPoolsListResponse_builder) Build() *ExternalIPPoolsListResponse { + m0 := &ExternalIPPoolsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Size = b.Size + x.Total = b.Total + x.Items = b.Items + return m0 +} + +type ExternalIPPoolsGetRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsGetRequest) Reset() { + *x = ExternalIPPoolsGetRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsGetRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[2] + 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 *ExternalIPPoolsGetRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPPoolsGetRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPPoolsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsGetRequest_builder) Build() *ExternalIPPoolsGetRequest { + m0 := &ExternalIPPoolsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPPoolsGetResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsGetResponse) Reset() { + *x = ExternalIPPoolsGetResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsGetResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[3] + 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 *ExternalIPPoolsGetResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPPoolsGetResponse) SetObject(v *ExternalIPPool) { + x.Object = v +} + +func (x *ExternalIPPoolsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPPoolsGetResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPPoolsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsGetResponse_builder) Build() *ExternalIPPoolsGetResponse { + m0 := &ExternalIPPoolsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPPoolsCreateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsCreateRequest) Reset() { + *x = ExternalIPPoolsCreateRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[4] + 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 *ExternalIPPoolsCreateRequest) GetObject() *ExternalIPPool { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPPoolsCreateRequest) SetObject(v *ExternalIPPool) { + x.Object = v +} + +func (x *ExternalIPPoolsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPPoolsCreateRequest) ClearObject() { + x.Object = nil +} + +type ExternalIPPoolsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsCreateRequest_builder) Build() *ExternalIPPoolsCreateRequest { + m0 := &ExternalIPPoolsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPPoolsCreateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsCreateResponse) Reset() { + *x = ExternalIPPoolsCreateResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_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 *ExternalIPPoolsCreateResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPPoolsCreateResponse) SetObject(v *ExternalIPPool) { + x.Object = v +} + +func (x *ExternalIPPoolsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPPoolsCreateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPPoolsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsCreateResponse_builder) Build() *ExternalIPPoolsCreateResponse { + m0 := &ExternalIPPoolsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPPoolsUpdateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool `protobuf:"varint,3,opt,name=lock,proto3" json:"lock,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsUpdateRequest) Reset() { + *x = ExternalIPPoolsUpdateRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_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 *ExternalIPPoolsUpdateRequest) GetObject() *ExternalIPPool { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPPoolsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +func (x *ExternalIPPoolsUpdateRequest) GetLock() bool { + if x != nil { + return x.Lock + } + return false +} + +func (x *ExternalIPPoolsUpdateRequest) SetObject(v *ExternalIPPool) { + x.Object = v +} + +func (x *ExternalIPPoolsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.UpdateMask = v +} + +func (x *ExternalIPPoolsUpdateRequest) SetLock(v bool) { + x.Lock = v +} + +func (x *ExternalIPPoolsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPPoolsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.UpdateMask != nil +} + +func (x *ExternalIPPoolsUpdateRequest) ClearObject() { + x.Object = nil +} + +func (x *ExternalIPPoolsUpdateRequest) ClearUpdateMask() { + x.UpdateMask = nil +} + +type ExternalIPPoolsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPPoolsUpdateRequest_builder) Build() *ExternalIPPoolsUpdateRequest { + m0 := &ExternalIPPoolsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + x.UpdateMask = b.UpdateMask + x.Lock = b.Lock + return m0 +} + +type ExternalIPPoolsUpdateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsUpdateResponse) Reset() { + *x = ExternalIPPoolsUpdateResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[7] + 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 *ExternalIPPoolsUpdateResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPPoolsUpdateResponse) SetObject(v *ExternalIPPool) { + x.Object = v +} + +func (x *ExternalIPPoolsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPPoolsUpdateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPPoolsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsUpdateResponse_builder) Build() *ExternalIPPoolsUpdateResponse { + m0 := &ExternalIPPoolsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPPoolsDeleteRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsDeleteRequest) Reset() { + *x = ExternalIPPoolsDeleteRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[8] + 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 *ExternalIPPoolsDeleteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPPoolsDeleteRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPPoolsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsDeleteRequest_builder) Build() *ExternalIPPoolsDeleteRequest { + m0 := &ExternalIPPoolsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPPoolsDeleteResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsDeleteResponse) Reset() { + *x = ExternalIPPoolsDeleteResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPPoolsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPPoolsDeleteResponse_builder) Build() *ExternalIPPoolsDeleteResponse { + m0 := &ExternalIPPoolsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPPoolsSignalRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsSignalRequest) Reset() { + *x = ExternalIPPoolsSignalRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[10] + 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 *ExternalIPPoolsSignalRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPPoolsSignalRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPPoolsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsSignalRequest_builder) Build() *ExternalIPPoolsSignalRequest { + m0 := &ExternalIPPoolsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPPoolsSignalResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsSignalResponse) Reset() { + *x = ExternalIPPoolsSignalResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPPoolsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPPoolsSignalResponse_builder) Build() *ExternalIPPoolsSignalResponse { + m0 := &ExternalIPPoolsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ip_pools_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_pools_service_proto_rawDesc = string([]byte{ + 0x0a, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2b, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xb6, 0x01, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x1b, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x35, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2b, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x57, 0x0a, 0x1c, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0xa8, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x58, 0x0a, 0x1d, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2e, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x94, 0x07, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x03, 0x47, 0x65, + 0x74, 0x12, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x30, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, + 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0x69, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x2d, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xe0, 0x01, + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_pools_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ip_pools_service_proto_goTypes = []any{ + (*ExternalIPPoolsListRequest)(nil), // 0: osac.private.v1.ExternalIPPoolsListRequest + (*ExternalIPPoolsListResponse)(nil), // 1: osac.private.v1.ExternalIPPoolsListResponse + (*ExternalIPPoolsGetRequest)(nil), // 2: osac.private.v1.ExternalIPPoolsGetRequest + (*ExternalIPPoolsGetResponse)(nil), // 3: osac.private.v1.ExternalIPPoolsGetResponse + (*ExternalIPPoolsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPPoolsCreateRequest + (*ExternalIPPoolsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPPoolsCreateResponse + (*ExternalIPPoolsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPPoolsUpdateRequest + (*ExternalIPPoolsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPPoolsUpdateResponse + (*ExternalIPPoolsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPPoolsDeleteRequest + (*ExternalIPPoolsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPPoolsDeleteResponse + (*ExternalIPPoolsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPPoolsSignalRequest + (*ExternalIPPoolsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPPoolsSignalResponse + (*ExternalIPPool)(nil), // 12: osac.private.v1.ExternalIPPool + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ip_pools_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPPoolsListResponse.items:type_name -> osac.private.v1.ExternalIPPool + 12, // 1: osac.private.v1.ExternalIPPoolsGetResponse.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 2: osac.private.v1.ExternalIPPoolsCreateRequest.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 3: osac.private.v1.ExternalIPPoolsCreateResponse.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 4: osac.private.v1.ExternalIPPoolsUpdateRequest.object:type_name -> osac.private.v1.ExternalIPPool + 13, // 5: osac.private.v1.ExternalIPPoolsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPPoolsUpdateResponse.object:type_name -> osac.private.v1.ExternalIPPool + 0, // 7: osac.private.v1.ExternalIPPools.List:input_type -> osac.private.v1.ExternalIPPoolsListRequest + 2, // 8: osac.private.v1.ExternalIPPools.Get:input_type -> osac.private.v1.ExternalIPPoolsGetRequest + 4, // 9: osac.private.v1.ExternalIPPools.Create:input_type -> osac.private.v1.ExternalIPPoolsCreateRequest + 6, // 10: osac.private.v1.ExternalIPPools.Update:input_type -> osac.private.v1.ExternalIPPoolsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPPools.Delete:input_type -> osac.private.v1.ExternalIPPoolsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPPools.Signal:input_type -> osac.private.v1.ExternalIPPoolsSignalRequest + 1, // 13: osac.private.v1.ExternalIPPools.List:output_type -> osac.private.v1.ExternalIPPoolsListResponse + 3, // 14: osac.private.v1.ExternalIPPools.Get:output_type -> osac.private.v1.ExternalIPPoolsGetResponse + 5, // 15: osac.private.v1.ExternalIPPools.Create:output_type -> osac.private.v1.ExternalIPPoolsCreateResponse + 7, // 16: osac.private.v1.ExternalIPPools.Update:output_type -> osac.private.v1.ExternalIPPoolsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPPools.Delete:output_type -> osac.private.v1.ExternalIPPoolsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPPools.Signal:output_type -> osac.private.v1.ExternalIPPoolsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_pools_service_proto_init() } +func file_osac_private_v1_external_ip_pools_service_proto_init() { + if File_osac_private_v1_external_ip_pools_service_proto != nil { + return + } + file_osac_private_v1_external_ip_pool_type_proto_init() + file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0].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_external_ip_pools_service_proto_rawDesc), len(file_osac_private_v1_external_ip_pools_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ip_pools_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_pools_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ip_pools_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_pools_service_proto = out.File + file_osac_private_v1_external_ip_pools_service_proto_goTypes = nil + file_osac_private_v1_external_ip_pools_service_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_pools_service_grpc.pb.go b/internal/api/osac/private/v1/external_ip_pools_service_grpc.pb.go new file mode 100644 index 00000000..f7f99b06 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_pools_service_grpc.pb.go @@ -0,0 +1,338 @@ +// +// 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. +// + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: osac/private/v1/external_ip_pools_service.proto + +package privatev1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ExternalIPPools_List_FullMethodName = "/osac.private.v1.ExternalIPPools/List" + ExternalIPPools_Get_FullMethodName = "/osac.private.v1.ExternalIPPools/Get" + ExternalIPPools_Create_FullMethodName = "/osac.private.v1.ExternalIPPools/Create" + ExternalIPPools_Update_FullMethodName = "/osac.private.v1.ExternalIPPools/Update" + ExternalIPPools_Delete_FullMethodName = "/osac.private.v1.ExternalIPPools/Delete" + ExternalIPPools_Signal_FullMethodName = "/osac.private.v1.ExternalIPPools/Signal" +) + +// ExternalIPPoolsClient is the client API for ExternalIPPools service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ExternalIPPoolsClient interface { + // Retrieves the list of external IP pools. + List(ctx context.Context, in *ExternalIPPoolsListRequest, opts ...grpc.CallOption) (*ExternalIPPoolsListResponse, error) + // Retrieves the details of one specific external IP pool. + Get(ctx context.Context, in *ExternalIPPoolsGetRequest, opts ...grpc.CallOption) (*ExternalIPPoolsGetResponse, error) + // Creates a new external IP pool. + Create(ctx context.Context, in *ExternalIPPoolsCreateRequest, opts ...grpc.CallOption) (*ExternalIPPoolsCreateResponse, error) + // Updates an existing external IP pool. Only metadata fields (name, labels, annotations) are mutable. + // All spec fields (cidrs, ip_family, implementation_strategy) are immutable after creation. + Update(ctx context.Context, in *ExternalIPPoolsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPPoolsUpdateResponse, error) + // Deletes an external IP pool. Rejected if allocated ExternalIPs still reference this pool. + Delete(ctx context.Context, in *ExternalIPPoolsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPPoolsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(ctx context.Context, in *ExternalIPPoolsSignalRequest, opts ...grpc.CallOption) (*ExternalIPPoolsSignalResponse, error) +} + +type externalIPPoolsClient struct { + cc grpc.ClientConnInterface +} + +func NewExternalIPPoolsClient(cc grpc.ClientConnInterface) ExternalIPPoolsClient { + return &externalIPPoolsClient{cc} +} + +func (c *externalIPPoolsClient) List(ctx context.Context, in *ExternalIPPoolsListRequest, opts ...grpc.CallOption) (*ExternalIPPoolsListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsListResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_List_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPPoolsClient) Get(ctx context.Context, in *ExternalIPPoolsGetRequest, opts ...grpc.CallOption) (*ExternalIPPoolsGetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsGetResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_Get_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPPoolsClient) Create(ctx context.Context, in *ExternalIPPoolsCreateRequest, opts ...grpc.CallOption) (*ExternalIPPoolsCreateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsCreateResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_Create_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPPoolsClient) Update(ctx context.Context, in *ExternalIPPoolsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPPoolsUpdateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsUpdateResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_Update_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPPoolsClient) Delete(ctx context.Context, in *ExternalIPPoolsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPPoolsDeleteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsDeleteResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_Delete_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPPoolsClient) Signal(ctx context.Context, in *ExternalIPPoolsSignalRequest, opts ...grpc.CallOption) (*ExternalIPPoolsSignalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPPoolsSignalResponse) + err := c.cc.Invoke(ctx, ExternalIPPools_Signal_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ExternalIPPoolsServer is the server API for ExternalIPPools service. +// All implementations must embed UnimplementedExternalIPPoolsServer +// for forward compatibility. +type ExternalIPPoolsServer interface { + // Retrieves the list of external IP pools. + List(context.Context, *ExternalIPPoolsListRequest) (*ExternalIPPoolsListResponse, error) + // Retrieves the details of one specific external IP pool. + Get(context.Context, *ExternalIPPoolsGetRequest) (*ExternalIPPoolsGetResponse, error) + // Creates a new external IP pool. + Create(context.Context, *ExternalIPPoolsCreateRequest) (*ExternalIPPoolsCreateResponse, error) + // Updates an existing external IP pool. Only metadata fields (name, labels, annotations) are mutable. + // All spec fields (cidrs, ip_family, implementation_strategy) are immutable after creation. + Update(context.Context, *ExternalIPPoolsUpdateRequest) (*ExternalIPPoolsUpdateResponse, error) + // Deletes an external IP pool. Rejected if allocated ExternalIPs still reference this pool. + Delete(context.Context, *ExternalIPPoolsDeleteRequest) (*ExternalIPPoolsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(context.Context, *ExternalIPPoolsSignalRequest) (*ExternalIPPoolsSignalResponse, error) + mustEmbedUnimplementedExternalIPPoolsServer() +} + +// UnimplementedExternalIPPoolsServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedExternalIPPoolsServer struct{} + +func (UnimplementedExternalIPPoolsServer) List(context.Context, *ExternalIPPoolsListRequest) (*ExternalIPPoolsListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} +func (UnimplementedExternalIPPoolsServer) Get(context.Context, *ExternalIPPoolsGetRequest) (*ExternalIPPoolsGetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedExternalIPPoolsServer) Create(context.Context, *ExternalIPPoolsCreateRequest) (*ExternalIPPoolsCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedExternalIPPoolsServer) Update(context.Context, *ExternalIPPoolsUpdateRequest) (*ExternalIPPoolsUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedExternalIPPoolsServer) Delete(context.Context, *ExternalIPPoolsDeleteRequest) (*ExternalIPPoolsDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedExternalIPPoolsServer) Signal(context.Context, *ExternalIPPoolsSignalRequest) (*ExternalIPPoolsSignalResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Signal not implemented") +} +func (UnimplementedExternalIPPoolsServer) mustEmbedUnimplementedExternalIPPoolsServer() {} +func (UnimplementedExternalIPPoolsServer) testEmbeddedByValue() {} + +// UnsafeExternalIPPoolsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ExternalIPPoolsServer will +// result in compilation errors. +type UnsafeExternalIPPoolsServer interface { + mustEmbedUnimplementedExternalIPPoolsServer() +} + +func RegisterExternalIPPoolsServer(s grpc.ServiceRegistrar, srv ExternalIPPoolsServer) { + // If the following call pancis, it indicates UnimplementedExternalIPPoolsServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ExternalIPPools_ServiceDesc, srv) +} + +func _ExternalIPPools_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).List(ctx, req.(*ExternalIPPoolsListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPPools_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_Get_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).Get(ctx, req.(*ExternalIPPoolsGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPPools_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_Create_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).Create(ctx, req.(*ExternalIPPoolsCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPPools_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_Update_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).Update(ctx, req.(*ExternalIPPoolsUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPPools_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_Delete_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).Delete(ctx, req.(*ExternalIPPoolsDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPPools_Signal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPPoolsSignalRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPPoolsServer).Signal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPPools_Signal_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPPoolsServer).Signal(ctx, req.(*ExternalIPPoolsSignalRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ExternalIPPools_ServiceDesc is the grpc.ServiceDesc for ExternalIPPools service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ExternalIPPools_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "osac.private.v1.ExternalIPPools", + HandlerType: (*ExternalIPPoolsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "List", + Handler: _ExternalIPPools_List_Handler, + }, + { + MethodName: "Get", + Handler: _ExternalIPPools_Get_Handler, + }, + { + MethodName: "Create", + Handler: _ExternalIPPools_Create_Handler, + }, + { + MethodName: "Update", + Handler: _ExternalIPPools_Update_Handler, + }, + { + MethodName: "Delete", + Handler: _ExternalIPPools_Delete_Handler, + }, + { + MethodName: "Signal", + Handler: _ExternalIPPools_Signal_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osac/private/v1/external_ip_pools_service.proto", +} diff --git a/internal/api/osac/private/v1/external_ip_pools_service_protoopaque.pb.go b/internal/api/osac/private/v1/external_ip_pools_service_protoopaque.pb.go new file mode 100644 index 00000000..6d519638 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_pools_service_protoopaque.pb.go @@ -0,0 +1,1190 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_pools_service.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPPoolsListRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Offset int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof"` + xxx_hidden_Limit int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof"` + xxx_hidden_Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof"` + xxx_hidden_Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsListRequest) Reset() { + *x = ExternalIPPoolsListRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsListRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0] + 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 *ExternalIPPoolsListRequest) GetOffset() int32 { + if x != nil { + return x.xxx_hidden_Offset + } + return 0 +} + +func (x *ExternalIPPoolsListRequest) GetLimit() int32 { + if x != nil { + return x.xxx_hidden_Limit + } + return 0 +} + +func (x *ExternalIPPoolsListRequest) GetFilter() string { + if x != nil { + if x.xxx_hidden_Filter != nil { + return *x.xxx_hidden_Filter + } + return "" + } + return "" +} + +func (x *ExternalIPPoolsListRequest) GetOrder() string { + if x != nil { + if x.xxx_hidden_Order != nil { + return *x.xxx_hidden_Order + } + return "" + } + return "" +} + +func (x *ExternalIPPoolsListRequest) SetOffset(v int32) { + x.xxx_hidden_Offset = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 4) +} + +func (x *ExternalIPPoolsListRequest) SetLimit(v int32) { + x.xxx_hidden_Limit = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 4) +} + +func (x *ExternalIPPoolsListRequest) SetFilter(v string) { + x.xxx_hidden_Filter = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 4) +} + +func (x *ExternalIPPoolsListRequest) SetOrder(v string) { + x.xxx_hidden_Order = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 4) +} + +func (x *ExternalIPPoolsListRequest) HasOffset() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 0) +} + +func (x *ExternalIPPoolsListRequest) HasLimit() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *ExternalIPPoolsListRequest) HasFilter() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 2) +} + +func (x *ExternalIPPoolsListRequest) HasOrder() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 3) +} + +func (x *ExternalIPPoolsListRequest) ClearOffset() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0) + x.xxx_hidden_Offset = 0 +} + +func (x *ExternalIPPoolsListRequest) ClearLimit() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Limit = 0 +} + +func (x *ExternalIPPoolsListRequest) ClearFilter() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2) + x.xxx_hidden_Filter = nil +} + +func (x *ExternalIPPoolsListRequest) ClearOrder() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3) + x.xxx_hidden_Order = nil +} + +type ExternalIPPoolsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all IPv4 external + // IP pools: + // + // this.spec.ip_family == IP_FAMILY_IPV4 + // + // If this isn't provided, or if the value is empty, then all the external IP pools that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP pool instead of the names of the columns of a table. For example, in + // order to sort the pools descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPPoolsListRequest_builder) Build() *ExternalIPPoolsListRequest { + m0 := &ExternalIPPoolsListRequest{} + b, x := &b0, m0 + _, _ = b, x + if b.Offset != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 4) + x.xxx_hidden_Offset = *b.Offset + } + if b.Limit != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 4) + x.xxx_hidden_Limit = *b.Limit + } + if b.Filter != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 4) + x.xxx_hidden_Filter = b.Filter + } + if b.Order != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 4) + x.xxx_hidden_Order = b.Order + } + return m0 +} + +type ExternalIPPoolsListResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Size int32 `protobuf:"varint,1,opt,name=size,proto3"` + xxx_hidden_Total int32 `protobuf:"varint,2,opt,name=total,proto3"` + xxx_hidden_Items *[]*ExternalIPPool `protobuf:"bytes,3,rep,name=items,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsListResponse) Reset() { + *x = ExternalIPPoolsListResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsListResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[1] + 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 *ExternalIPPoolsListResponse) GetSize() int32 { + if x != nil { + return x.xxx_hidden_Size + } + return 0 +} + +func (x *ExternalIPPoolsListResponse) GetTotal() int32 { + if x != nil { + return x.xxx_hidden_Total + } + return 0 +} + +func (x *ExternalIPPoolsListResponse) GetItems() []*ExternalIPPool { + if x != nil { + if x.xxx_hidden_Items != nil { + return *x.xxx_hidden_Items + } + } + return nil +} + +func (x *ExternalIPPoolsListResponse) SetSize(v int32) { + x.xxx_hidden_Size = v +} + +func (x *ExternalIPPoolsListResponse) SetTotal(v int32) { + x.xxx_hidden_Total = v +} + +func (x *ExternalIPPoolsListResponse) SetItems(v []*ExternalIPPool) { + x.xxx_hidden_Items = &v +} + +type ExternalIPPoolsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 + // List of results. + Items []*ExternalIPPool +} + +func (b0 ExternalIPPoolsListResponse_builder) Build() *ExternalIPPoolsListResponse { + m0 := &ExternalIPPoolsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Size = b.Size + x.xxx_hidden_Total = b.Total + x.xxx_hidden_Items = &b.Items + return m0 +} + +type ExternalIPPoolsGetRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsGetRequest) Reset() { + *x = ExternalIPPoolsGetRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsGetRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[2] + 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 *ExternalIPPoolsGetRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPPoolsGetRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPPoolsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsGetRequest_builder) Build() *ExternalIPPoolsGetRequest { + m0 := &ExternalIPPoolsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPPoolsGetResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsGetResponse) Reset() { + *x = ExternalIPPoolsGetResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsGetResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[3] + 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 *ExternalIPPoolsGetResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPPoolsGetResponse) SetObject(v *ExternalIPPool) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPPoolsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPPoolsGetResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPPoolsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsGetResponse_builder) Build() *ExternalIPPoolsGetResponse { + m0 := &ExternalIPPoolsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPPoolsCreateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsCreateRequest) Reset() { + *x = ExternalIPPoolsCreateRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[4] + 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 *ExternalIPPoolsCreateRequest) GetObject() *ExternalIPPool { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPPoolsCreateRequest) SetObject(v *ExternalIPPool) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPPoolsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPPoolsCreateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPPoolsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsCreateRequest_builder) Build() *ExternalIPPoolsCreateRequest { + m0 := &ExternalIPPoolsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPPoolsCreateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsCreateResponse) Reset() { + *x = ExternalIPPoolsCreateResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_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 *ExternalIPPoolsCreateResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPPoolsCreateResponse) SetObject(v *ExternalIPPool) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPPoolsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPPoolsCreateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPPoolsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsCreateResponse_builder) Build() *ExternalIPPoolsCreateResponse { + m0 := &ExternalIPPoolsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPPoolsUpdateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3"` + xxx_hidden_UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3"` + xxx_hidden_Lock bool `protobuf:"varint,3,opt,name=lock,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsUpdateRequest) Reset() { + *x = ExternalIPPoolsUpdateRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_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 *ExternalIPPoolsUpdateRequest) GetObject() *ExternalIPPool { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPPoolsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.xxx_hidden_UpdateMask + } + return nil +} + +func (x *ExternalIPPoolsUpdateRequest) GetLock() bool { + if x != nil { + return x.xxx_hidden_Lock + } + return false +} + +func (x *ExternalIPPoolsUpdateRequest) SetObject(v *ExternalIPPool) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPPoolsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.xxx_hidden_UpdateMask = v +} + +func (x *ExternalIPPoolsUpdateRequest) SetLock(v bool) { + x.xxx_hidden_Lock = v +} + +func (x *ExternalIPPoolsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPPoolsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.xxx_hidden_UpdateMask != nil +} + +func (x *ExternalIPPoolsUpdateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +func (x *ExternalIPPoolsUpdateRequest) ClearUpdateMask() { + x.xxx_hidden_UpdateMask = nil +} + +type ExternalIPPoolsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPPoolsUpdateRequest_builder) Build() *ExternalIPPoolsUpdateRequest { + m0 := &ExternalIPPoolsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + x.xxx_hidden_UpdateMask = b.UpdateMask + x.xxx_hidden_Lock = b.Lock + return m0 +} + +type ExternalIPPoolsUpdateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIPPool `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsUpdateResponse) Reset() { + *x = ExternalIPPoolsUpdateResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[7] + 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 *ExternalIPPoolsUpdateResponse) GetObject() *ExternalIPPool { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPPoolsUpdateResponse) SetObject(v *ExternalIPPool) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPPoolsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPPoolsUpdateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPPoolsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIPPool +} + +func (b0 ExternalIPPoolsUpdateResponse_builder) Build() *ExternalIPPoolsUpdateResponse { + m0 := &ExternalIPPoolsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPPoolsDeleteRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsDeleteRequest) Reset() { + *x = ExternalIPPoolsDeleteRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[8] + 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 *ExternalIPPoolsDeleteRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPPoolsDeleteRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPPoolsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsDeleteRequest_builder) Build() *ExternalIPPoolsDeleteRequest { + m0 := &ExternalIPPoolsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPPoolsDeleteResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsDeleteResponse) Reset() { + *x = ExternalIPPoolsDeleteResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPPoolsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPPoolsDeleteResponse_builder) Build() *ExternalIPPoolsDeleteResponse { + m0 := &ExternalIPPoolsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPPoolsSignalRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsSignalRequest) Reset() { + *x = ExternalIPPoolsSignalRequest{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPPoolsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[10] + 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 *ExternalIPPoolsSignalRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPPoolsSignalRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPPoolsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPPoolsSignalRequest_builder) Build() *ExternalIPPoolsSignalRequest { + m0 := &ExternalIPPoolsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPPoolsSignalResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPPoolsSignalResponse) Reset() { + *x = ExternalIPPoolsSignalResponse{} + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPPoolsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPPoolsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPPoolsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_pools_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPPoolsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPPoolsSignalResponse_builder) Build() *ExternalIPPoolsSignalResponse { + m0 := &ExternalIPPoolsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ip_pools_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_pools_service_proto_rawDesc = string([]byte{ + 0x0a, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, + 0x6f, 0x6c, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2b, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, + 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xb6, 0x01, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x1b, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x12, 0x35, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2b, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x55, 0x0a, 0x1a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x57, 0x0a, 0x1c, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0xa8, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x37, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x58, 0x0a, 0x1d, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x2e, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2e, 0x0a, 0x1c, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x1d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x94, 0x07, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x8c, 0x01, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x2b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2c, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, + 0x6c, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x29, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x12, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x96, 0x01, 0x0a, 0x03, 0x47, 0x65, + 0x74, 0x12, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x30, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x26, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0xa2, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, + 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0xae, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, + 0x6f, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x2d, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x97, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, + 0x6f, 0x6f, 0x6c, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x2a, 0x26, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x2f, 0x7b, 0x69, + 0x64, 0x7d, 0x12, 0x69, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x2d, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xe0, 0x01, + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ip_pools_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ip_pools_service_proto_goTypes = []any{ + (*ExternalIPPoolsListRequest)(nil), // 0: osac.private.v1.ExternalIPPoolsListRequest + (*ExternalIPPoolsListResponse)(nil), // 1: osac.private.v1.ExternalIPPoolsListResponse + (*ExternalIPPoolsGetRequest)(nil), // 2: osac.private.v1.ExternalIPPoolsGetRequest + (*ExternalIPPoolsGetResponse)(nil), // 3: osac.private.v1.ExternalIPPoolsGetResponse + (*ExternalIPPoolsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPPoolsCreateRequest + (*ExternalIPPoolsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPPoolsCreateResponse + (*ExternalIPPoolsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPPoolsUpdateRequest + (*ExternalIPPoolsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPPoolsUpdateResponse + (*ExternalIPPoolsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPPoolsDeleteRequest + (*ExternalIPPoolsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPPoolsDeleteResponse + (*ExternalIPPoolsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPPoolsSignalRequest + (*ExternalIPPoolsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPPoolsSignalResponse + (*ExternalIPPool)(nil), // 12: osac.private.v1.ExternalIPPool + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ip_pools_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPPoolsListResponse.items:type_name -> osac.private.v1.ExternalIPPool + 12, // 1: osac.private.v1.ExternalIPPoolsGetResponse.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 2: osac.private.v1.ExternalIPPoolsCreateRequest.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 3: osac.private.v1.ExternalIPPoolsCreateResponse.object:type_name -> osac.private.v1.ExternalIPPool + 12, // 4: osac.private.v1.ExternalIPPoolsUpdateRequest.object:type_name -> osac.private.v1.ExternalIPPool + 13, // 5: osac.private.v1.ExternalIPPoolsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPPoolsUpdateResponse.object:type_name -> osac.private.v1.ExternalIPPool + 0, // 7: osac.private.v1.ExternalIPPools.List:input_type -> osac.private.v1.ExternalIPPoolsListRequest + 2, // 8: osac.private.v1.ExternalIPPools.Get:input_type -> osac.private.v1.ExternalIPPoolsGetRequest + 4, // 9: osac.private.v1.ExternalIPPools.Create:input_type -> osac.private.v1.ExternalIPPoolsCreateRequest + 6, // 10: osac.private.v1.ExternalIPPools.Update:input_type -> osac.private.v1.ExternalIPPoolsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPPools.Delete:input_type -> osac.private.v1.ExternalIPPoolsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPPools.Signal:input_type -> osac.private.v1.ExternalIPPoolsSignalRequest + 1, // 13: osac.private.v1.ExternalIPPools.List:output_type -> osac.private.v1.ExternalIPPoolsListResponse + 3, // 14: osac.private.v1.ExternalIPPools.Get:output_type -> osac.private.v1.ExternalIPPoolsGetResponse + 5, // 15: osac.private.v1.ExternalIPPools.Create:output_type -> osac.private.v1.ExternalIPPoolsCreateResponse + 7, // 16: osac.private.v1.ExternalIPPools.Update:output_type -> osac.private.v1.ExternalIPPoolsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPPools.Delete:output_type -> osac.private.v1.ExternalIPPoolsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPPools.Signal:output_type -> osac.private.v1.ExternalIPPoolsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_pools_service_proto_init() } +func file_osac_private_v1_external_ip_pools_service_proto_init() { + if File_osac_private_v1_external_ip_pools_service_proto != nil { + return + } + file_osac_private_v1_external_ip_pool_type_proto_init() + file_osac_private_v1_external_ip_pools_service_proto_msgTypes[0].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_external_ip_pools_service_proto_rawDesc), len(file_osac_private_v1_external_ip_pools_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ip_pools_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_pools_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ip_pools_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_pools_service_proto = out.File + file_osac_private_v1_external_ip_pools_service_proto_goTypes = nil + file_osac_private_v1_external_ip_pools_service_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_type.pb.go b/internal/api/osac/private/v1/external_ip_type.pb.go new file mode 100644 index 00000000..4769e1f4 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_type.pb.go @@ -0,0 +1,637 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_type.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Lifecycle states for ExternalIP resources. +// +// State transitions: UNSPECIFIED -> PENDING -> ALLOCATED. On deletion: ALLOCATED -> DELETING. +// FAILED is a terminal error state for provisioning failures. +type ExternalIPState int32 + +const ( + // State is unknown or has not been determined yet. Default state before initialization. + ExternalIPState_EXTERNAL_IP_STATE_UNSPECIFIED ExternalIPState = 0 + // The external IP is being provisioned and an address has not been assigned yet. + // + // During this state, the system is creating the MetalLB LoadBalancer Service on the target + // cluster and waiting for an IP address to be allocated from the parent pool's CIDR range. + ExternalIPState_EXTERNAL_IP_STATE_PENDING ExternalIPState = 1 + // The external IP has been assigned an address. + // + // The address is allocated and reserved. The IP can be attached to a target resource by + // creating an ExternalIPAttachment. The status.attached boolean indicates whether an + // attachment currently exists. + ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED ExternalIPState = 2 + // Provisioning failed. Check status.message for error details. + // + // This is a terminal error state. The ExternalIP may require manual intervention + // (e.g., deleting and recreating) or a Signal RPC to retry the operation. + ExternalIPState_EXTERNAL_IP_STATE_FAILED ExternalIPState = 3 + // The external IP is being deprovisioned and will be removed. + // + // On deletion of an ExternalIP, the system removes the MetalLB LoadBalancer Service and + // returns the address to the pool. An ExternalIP cannot be deleted while attached + // (status.attached = true). + ExternalIPState_EXTERNAL_IP_STATE_DELETING ExternalIPState = 4 +) + +// Enum value maps for ExternalIPState. +var ( + ExternalIPState_name = map[int32]string{ + 0: "EXTERNAL_IP_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_STATE_PENDING", + 2: "EXTERNAL_IP_STATE_ALLOCATED", + 3: "EXTERNAL_IP_STATE_FAILED", + 4: "EXTERNAL_IP_STATE_DELETING", + } + ExternalIPState_value = map[string]int32{ + "EXTERNAL_IP_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_STATE_PENDING": 1, + "EXTERNAL_IP_STATE_ALLOCATED": 2, + "EXTERNAL_IP_STATE_FAILED": 3, + "EXTERNAL_IP_STATE_DELETING": 4, + } +) + +func (x ExternalIPState) Enum() *ExternalIPState { + p := new(ExternalIPState) + *p = x + return p +} + +func (x ExternalIPState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_type_proto_enumTypes[0] +} + +func (x ExternalIPState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents an external IP address allocated from an ExternalIPPool. +// +// An ExternalIP is a floating IP address allocated from a parent ExternalIPPool's CIDR ranges. +// "External" means external to the VirtualNetwork — the address may be internet-routable or +// data-center-routable depending on the deployment topology. The pool assignment is immutable +// after creation. +// +// Attachment to a target resource (e.g., ComputeInstance, Cluster, BareMetalInstance) is managed +// by a separate ExternalIPAttachment resource. The status.attached boolean indicates whether an +// ExternalIPAttachment currently exists for this ExternalIP. +// +// The lifecycle follows: PENDING (awaiting allocation) -> ALLOCATED (IP assigned). +// FAILED is a terminal error state. DELETING is set during deprovisioning. +type ExternalIP struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Unique identifier of the external IP. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Metadata of the external IP, including name, labels, and timestamps. + Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` + // Desired configuration of the external IP (user-specified). + Spec *ExternalIPSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + // Current state of the external IP (system-provided, read-only). + Status *ExternalIPStatus `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIP) Reset() { + *x = ExternalIP{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIP) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIP) ProtoMessage() {} + +func (x *ExternalIP) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[0] + 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 *ExternalIP) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIP) GetMetadata() *Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ExternalIP) GetSpec() *ExternalIPSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *ExternalIP) GetStatus() *ExternalIPStatus { + if x != nil { + return x.Status + } + return nil +} + +func (x *ExternalIP) SetId(v string) { + x.Id = v +} + +func (x *ExternalIP) SetMetadata(v *Metadata) { + x.Metadata = v +} + +func (x *ExternalIP) SetSpec(v *ExternalIPSpec) { + x.Spec = v +} + +func (x *ExternalIP) SetStatus(v *ExternalIPStatus) { + x.Status = v +} + +func (x *ExternalIP) HasMetadata() bool { + if x == nil { + return false + } + return x.Metadata != nil +} + +func (x *ExternalIP) HasSpec() bool { + if x == nil { + return false + } + return x.Spec != nil +} + +func (x *ExternalIP) HasStatus() bool { + if x == nil { + return false + } + return x.Status != nil +} + +func (x *ExternalIP) ClearMetadata() { + x.Metadata = nil +} + +func (x *ExternalIP) ClearSpec() { + x.Spec = nil +} + +func (x *ExternalIP) ClearStatus() { + x.Status = nil +} + +type ExternalIP_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP. + Id string + // Metadata of the external IP, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP (user-specified). + Spec *ExternalIPSpec + // Current state of the external IP (system-provided, read-only). + Status *ExternalIPStatus +} + +func (b0 ExternalIP_builder) Build() *ExternalIP { + m0 := &ExternalIP{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + x.Metadata = b.Metadata + x.Spec = b.Spec + x.Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIP. +// +// The pool field is required and immutable: once an ExternalIP is allocated from a pool, it cannot +// be moved to a different pool. +type ExternalIPSpec struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Parent ExternalIPPool ID. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIPPool in READY state. The system allocates an + // available IP address from this pool's CIDR ranges during provisioning. + // + // Example: "pool-abc123" + Pool string `protobuf:"bytes,1,opt,name=pool,proto3" json:"pool,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPSpec) Reset() { + *x = ExternalIPSpec{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPSpec) ProtoMessage() {} + +func (x *ExternalIPSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[1] + 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 *ExternalIPSpec) GetPool() string { + if x != nil { + return x.Pool + } + return "" +} + +func (x *ExternalIPSpec) SetPool(v string) { + x.Pool = v +} + +type ExternalIPSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Parent ExternalIPPool ID. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIPPool in READY state. The system allocates an + // available IP address from this pool's CIDR ranges during provisioning. + // + // Example: "pool-abc123" + Pool string +} + +func (b0 ExternalIPSpec_builder) Build() *ExternalIPSpec { + m0 := &ExternalIPSpec{} + b, x := &b0, m0 + _, _ = b, x + x.Pool = b.Pool + return m0 +} + +// Represents the current operational state of an ExternalIP. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the system +// updates them based on reconciliation of the spec and feedback from the cluster controller. +type ExternalIPStatus struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Current lifecycle state of the external IP. + State ExternalIPState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPState" json:"state,omitempty"` + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for IP allocation". + // Typically empty for ALLOCATED state. + Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"` + // Identifier of the hub cluster that this external IP is deployed to. + // + // Set by the fulfillment-service controller when reconciling the external IP to a Kubernetes CR + // on the target hub cluster. Used for tracking which cluster the IP resources reside on. + Hub string `protobuf:"bytes,3,opt,name=hub,proto3" json:"hub,omitempty"` + // Allocated IP address from the parent pool's CIDR range. + // + // Populated once the IP transitions to ALLOCATED state. Remains stable for the lifetime of + // the ExternalIP. Cleared only when the IP is deallocated. + Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` + // Parent ExternalIPPool ID that this IP was allocated from. + // + // Mirrors spec.pool for convenience in status queries. Populated when the IP is allocated. + Pool string `protobuf:"bytes,5,opt,name=pool,proto3" json:"pool,omitempty"` + // Whether this ExternalIP is currently attached to a target resource via an ExternalIPAttachment. + // + // Set to true when an ExternalIPAttachment referencing this ExternalIP reaches READY state. + // Set to false when the ExternalIPAttachment is deleted. An ExternalIP with attached = true + // cannot be deleted; the ExternalIPAttachment must be deleted first. + Attached bool `protobuf:"varint,6,opt,name=attached,proto3" json:"attached,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPStatus) Reset() { + *x = ExternalIPStatus{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPStatus) ProtoMessage() {} + +func (x *ExternalIPStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[2] + 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 *ExternalIPStatus) GetState() ExternalIPState { + if x != nil { + return x.State + } + return ExternalIPState_EXTERNAL_IP_STATE_UNSPECIFIED +} + +func (x *ExternalIPStatus) GetMessage() string { + if x != nil && x.Message != nil { + return *x.Message + } + return "" +} + +func (x *ExternalIPStatus) GetHub() string { + if x != nil { + return x.Hub + } + return "" +} + +func (x *ExternalIPStatus) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *ExternalIPStatus) GetPool() string { + if x != nil { + return x.Pool + } + return "" +} + +func (x *ExternalIPStatus) GetAttached() bool { + if x != nil { + return x.Attached + } + return false +} + +func (x *ExternalIPStatus) SetState(v ExternalIPState) { + x.State = v +} + +func (x *ExternalIPStatus) SetMessage(v string) { + x.Message = &v +} + +func (x *ExternalIPStatus) SetHub(v string) { + x.Hub = v +} + +func (x *ExternalIPStatus) SetAddress(v string) { + x.Address = v +} + +func (x *ExternalIPStatus) SetPool(v string) { + x.Pool = v +} + +func (x *ExternalIPStatus) SetAttached(v bool) { + x.Attached = v +} + +func (x *ExternalIPStatus) HasMessage() bool { + if x == nil { + return false + } + return x.Message != nil +} + +func (x *ExternalIPStatus) ClearMessage() { + x.Message = nil +} + +type ExternalIPStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP. + State ExternalIPState + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for IP allocation". + // Typically empty for ALLOCATED state. + Message *string + // Identifier of the hub cluster that this external IP is deployed to. + // + // Set by the fulfillment-service controller when reconciling the external IP to a Kubernetes CR + // on the target hub cluster. Used for tracking which cluster the IP resources reside on. + Hub string + // Allocated IP address from the parent pool's CIDR range. + // + // Populated once the IP transitions to ALLOCATED state. Remains stable for the lifetime of + // the ExternalIP. Cleared only when the IP is deallocated. + Address string + // Parent ExternalIPPool ID that this IP was allocated from. + // + // Mirrors spec.pool for convenience in status queries. Populated when the IP is allocated. + Pool string + // Whether this ExternalIP is currently attached to a target resource via an ExternalIPAttachment. + // + // Set to true when an ExternalIPAttachment referencing this ExternalIP reaches READY state. + // Set to false when the ExternalIPAttachment is deleted. An ExternalIP with attached = true + // cannot be deleted; the ExternalIPAttachment must be deleted first. + Attached bool +} + +func (b0 ExternalIPStatus_builder) Build() *ExternalIPStatus { + m0 := &ExternalIPStatus{} + b, x := &b0, m0 + _, _ = b, x + x.State = b.State + x.Message = b.Message + x.Hub = b.Hub + x.Address = b.Address + x.Pool = b.Pool + x.Attached = b.Attached + return m0 +} + +var File_osac_private_v1_external_ip_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_type_proto_rawDesc = string([]byte{ + 0x0a, 0x26, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xc3, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x70, + 0x6f, 0x6f, 0x6c, 0x22, 0xef, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, + 0x12, 0x1d, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x08, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xb2, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x58, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x58, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x42, 0xd8, 0x01, 0x0a, 0x13, 0x63, + 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 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_external_ip_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_external_ip_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_type_proto_goTypes = []any{ + (ExternalIPState)(0), // 0: osac.private.v1.ExternalIPState + (*ExternalIP)(nil), // 1: osac.private.v1.ExternalIP + (*ExternalIPSpec)(nil), // 2: osac.private.v1.ExternalIPSpec + (*ExternalIPStatus)(nil), // 3: osac.private.v1.ExternalIPStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata +} +var file_osac_private_v1_external_ip_type_proto_depIdxs = []int32{ + 4, // 0: osac.private.v1.ExternalIP.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.ExternalIP.spec:type_name -> osac.private.v1.ExternalIPSpec + 3, // 2: osac.private.v1.ExternalIP.status:type_name -> osac.private.v1.ExternalIPStatus + 0, // 3: osac.private.v1.ExternalIPStatus.state:type_name -> osac.private.v1.ExternalIPState + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_type_proto_init() } +func file_osac_private_v1_external_ip_type_proto_init() { + if File_osac_private_v1_external_ip_type_proto != nil { + return + } + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_type_proto_msgTypes[2].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_external_ip_type_proto_rawDesc), len(file_osac_private_v1_external_ip_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_type_proto = out.File + file_osac_private_v1_external_ip_type_proto_goTypes = nil + file_osac_private_v1_external_ip_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ip_type_protoopaque.pb.go b/internal/api/osac/private/v1/external_ip_type_protoopaque.pb.go new file mode 100644 index 00000000..63d38823 --- /dev/null +++ b/internal/api/osac/private/v1/external_ip_type_protoopaque.pb.go @@ -0,0 +1,616 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ip_type.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Lifecycle states for ExternalIP resources. +// +// State transitions: UNSPECIFIED -> PENDING -> ALLOCATED. On deletion: ALLOCATED -> DELETING. +// FAILED is a terminal error state for provisioning failures. +type ExternalIPState int32 + +const ( + // State is unknown or has not been determined yet. Default state before initialization. + ExternalIPState_EXTERNAL_IP_STATE_UNSPECIFIED ExternalIPState = 0 + // The external IP is being provisioned and an address has not been assigned yet. + // + // During this state, the system is creating the MetalLB LoadBalancer Service on the target + // cluster and waiting for an IP address to be allocated from the parent pool's CIDR range. + ExternalIPState_EXTERNAL_IP_STATE_PENDING ExternalIPState = 1 + // The external IP has been assigned an address. + // + // The address is allocated and reserved. The IP can be attached to a target resource by + // creating an ExternalIPAttachment. The status.attached boolean indicates whether an + // attachment currently exists. + ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED ExternalIPState = 2 + // Provisioning failed. Check status.message for error details. + // + // This is a terminal error state. The ExternalIP may require manual intervention + // (e.g., deleting and recreating) or a Signal RPC to retry the operation. + ExternalIPState_EXTERNAL_IP_STATE_FAILED ExternalIPState = 3 + // The external IP is being deprovisioned and will be removed. + // + // On deletion of an ExternalIP, the system removes the MetalLB LoadBalancer Service and + // returns the address to the pool. An ExternalIP cannot be deleted while attached + // (status.attached = true). + ExternalIPState_EXTERNAL_IP_STATE_DELETING ExternalIPState = 4 +) + +// Enum value maps for ExternalIPState. +var ( + ExternalIPState_name = map[int32]string{ + 0: "EXTERNAL_IP_STATE_UNSPECIFIED", + 1: "EXTERNAL_IP_STATE_PENDING", + 2: "EXTERNAL_IP_STATE_ALLOCATED", + 3: "EXTERNAL_IP_STATE_FAILED", + 4: "EXTERNAL_IP_STATE_DELETING", + } + ExternalIPState_value = map[string]int32{ + "EXTERNAL_IP_STATE_UNSPECIFIED": 0, + "EXTERNAL_IP_STATE_PENDING": 1, + "EXTERNAL_IP_STATE_ALLOCATED": 2, + "EXTERNAL_IP_STATE_FAILED": 3, + "EXTERNAL_IP_STATE_DELETING": 4, + } +) + +func (x ExternalIPState) Enum() *ExternalIPState { + p := new(ExternalIPState) + *p = x + return p +} + +func (x ExternalIPState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExternalIPState) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_external_ip_type_proto_enumTypes[0].Descriptor() +} + +func (ExternalIPState) Type() protoreflect.EnumType { + return &file_osac_private_v1_external_ip_type_proto_enumTypes[0] +} + +func (x ExternalIPState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Represents an external IP address allocated from an ExternalIPPool. +// +// An ExternalIP is a floating IP address allocated from a parent ExternalIPPool's CIDR ranges. +// "External" means external to the VirtualNetwork — the address may be internet-routable or +// data-center-routable depending on the deployment topology. The pool assignment is immutable +// after creation. +// +// Attachment to a target resource (e.g., ComputeInstance, Cluster, BareMetalInstance) is managed +// by a separate ExternalIPAttachment resource. The status.attached boolean indicates whether an +// ExternalIPAttachment currently exists for this ExternalIP. +// +// The lifecycle follows: PENDING (awaiting allocation) -> ALLOCATED (IP assigned). +// FAILED is a terminal error state. DELETING is set during deprovisioning. +type ExternalIP struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + xxx_hidden_Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3"` + xxx_hidden_Spec *ExternalIPSpec `protobuf:"bytes,3,opt,name=spec,proto3"` + xxx_hidden_Status *ExternalIPStatus `protobuf:"bytes,4,opt,name=status,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIP) Reset() { + *x = ExternalIP{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIP) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIP) ProtoMessage() {} + +func (x *ExternalIP) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[0] + 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 *ExternalIP) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIP) GetMetadata() *Metadata { + if x != nil { + return x.xxx_hidden_Metadata + } + return nil +} + +func (x *ExternalIP) GetSpec() *ExternalIPSpec { + if x != nil { + return x.xxx_hidden_Spec + } + return nil +} + +func (x *ExternalIP) GetStatus() *ExternalIPStatus { + if x != nil { + return x.xxx_hidden_Status + } + return nil +} + +func (x *ExternalIP) SetId(v string) { + x.xxx_hidden_Id = v +} + +func (x *ExternalIP) SetMetadata(v *Metadata) { + x.xxx_hidden_Metadata = v +} + +func (x *ExternalIP) SetSpec(v *ExternalIPSpec) { + x.xxx_hidden_Spec = v +} + +func (x *ExternalIP) SetStatus(v *ExternalIPStatus) { + x.xxx_hidden_Status = v +} + +func (x *ExternalIP) HasMetadata() bool { + if x == nil { + return false + } + return x.xxx_hidden_Metadata != nil +} + +func (x *ExternalIP) HasSpec() bool { + if x == nil { + return false + } + return x.xxx_hidden_Spec != nil +} + +func (x *ExternalIP) HasStatus() bool { + if x == nil { + return false + } + return x.xxx_hidden_Status != nil +} + +func (x *ExternalIP) ClearMetadata() { + x.xxx_hidden_Metadata = nil +} + +func (x *ExternalIP) ClearSpec() { + x.xxx_hidden_Spec = nil +} + +func (x *ExternalIP) ClearStatus() { + x.xxx_hidden_Status = nil +} + +type ExternalIP_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Unique identifier of the external IP. + Id string + // Metadata of the external IP, including name, labels, and timestamps. + Metadata *Metadata + // Desired configuration of the external IP (user-specified). + Spec *ExternalIPSpec + // Current state of the external IP (system-provided, read-only). + Status *ExternalIPStatus +} + +func (b0 ExternalIP_builder) Build() *ExternalIP { + m0 := &ExternalIP{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + x.xxx_hidden_Metadata = b.Metadata + x.xxx_hidden_Spec = b.Spec + x.xxx_hidden_Status = b.Status + return m0 +} + +// Defines the desired configuration for an ExternalIP. +// +// The pool field is required and immutable: once an ExternalIP is allocated from a pool, it cannot +// be moved to a different pool. +type ExternalIPSpec struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Pool string `protobuf:"bytes,1,opt,name=pool,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPSpec) Reset() { + *x = ExternalIPSpec{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPSpec) ProtoMessage() {} + +func (x *ExternalIPSpec) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[1] + 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 *ExternalIPSpec) GetPool() string { + if x != nil { + return x.xxx_hidden_Pool + } + return "" +} + +func (x *ExternalIPSpec) SetPool(v string) { + x.xxx_hidden_Pool = v +} + +type ExternalIPSpec_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Parent ExternalIPPool ID. Required and immutable after creation. + // + // Must reference the ID of an existing ExternalIPPool in READY state. The system allocates an + // available IP address from this pool's CIDR ranges during provisioning. + // + // Example: "pool-abc123" + Pool string +} + +func (b0 ExternalIPSpec_builder) Build() *ExternalIPSpec { + m0 := &ExternalIPSpec{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Pool = b.Pool + return m0 +} + +// Represents the current operational state of an ExternalIP. +// +// Status is system-provided and read-only. Users cannot modify status fields directly; the system +// updates them based on reconciliation of the spec and feedback from the cluster controller. +type ExternalIPStatus struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_State ExternalIPState `protobuf:"varint,1,opt,name=state,proto3,enum=osac.private.v1.ExternalIPState"` + xxx_hidden_Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof"` + xxx_hidden_Hub string `protobuf:"bytes,3,opt,name=hub,proto3"` + xxx_hidden_Address string `protobuf:"bytes,4,opt,name=address,proto3"` + xxx_hidden_Pool string `protobuf:"bytes,5,opt,name=pool,proto3"` + xxx_hidden_Attached bool `protobuf:"varint,6,opt,name=attached,proto3"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPStatus) Reset() { + *x = ExternalIPStatus{} + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPStatus) ProtoMessage() {} + +func (x *ExternalIPStatus) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ip_type_proto_msgTypes[2] + 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 *ExternalIPStatus) GetState() ExternalIPState { + if x != nil { + return x.xxx_hidden_State + } + return ExternalIPState_EXTERNAL_IP_STATE_UNSPECIFIED +} + +func (x *ExternalIPStatus) GetMessage() string { + if x != nil { + if x.xxx_hidden_Message != nil { + return *x.xxx_hidden_Message + } + return "" + } + return "" +} + +func (x *ExternalIPStatus) GetHub() string { + if x != nil { + return x.xxx_hidden_Hub + } + return "" +} + +func (x *ExternalIPStatus) GetAddress() string { + if x != nil { + return x.xxx_hidden_Address + } + return "" +} + +func (x *ExternalIPStatus) GetPool() string { + if x != nil { + return x.xxx_hidden_Pool + } + return "" +} + +func (x *ExternalIPStatus) GetAttached() bool { + if x != nil { + return x.xxx_hidden_Attached + } + return false +} + +func (x *ExternalIPStatus) SetState(v ExternalIPState) { + x.xxx_hidden_State = v +} + +func (x *ExternalIPStatus) SetMessage(v string) { + x.xxx_hidden_Message = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 6) +} + +func (x *ExternalIPStatus) SetHub(v string) { + x.xxx_hidden_Hub = v +} + +func (x *ExternalIPStatus) SetAddress(v string) { + x.xxx_hidden_Address = v +} + +func (x *ExternalIPStatus) SetPool(v string) { + x.xxx_hidden_Pool = v +} + +func (x *ExternalIPStatus) SetAttached(v bool) { + x.xxx_hidden_Attached = v +} + +func (x *ExternalIPStatus) HasMessage() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *ExternalIPStatus) ClearMessage() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Message = nil +} + +type ExternalIPStatus_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Current lifecycle state of the external IP. + State ExternalIPState + // Human-readable message providing additional details about the current state. + // + // For PENDING state, may contain progress information like "Waiting for IP allocation". + // Typically empty for ALLOCATED state. + Message *string + // Identifier of the hub cluster that this external IP is deployed to. + // + // Set by the fulfillment-service controller when reconciling the external IP to a Kubernetes CR + // on the target hub cluster. Used for tracking which cluster the IP resources reside on. + Hub string + // Allocated IP address from the parent pool's CIDR range. + // + // Populated once the IP transitions to ALLOCATED state. Remains stable for the lifetime of + // the ExternalIP. Cleared only when the IP is deallocated. + Address string + // Parent ExternalIPPool ID that this IP was allocated from. + // + // Mirrors spec.pool for convenience in status queries. Populated when the IP is allocated. + Pool string + // Whether this ExternalIP is currently attached to a target resource via an ExternalIPAttachment. + // + // Set to true when an ExternalIPAttachment referencing this ExternalIP reaches READY state. + // Set to false when the ExternalIPAttachment is deleted. An ExternalIP with attached = true + // cannot be deleted; the ExternalIPAttachment must be deleted first. + Attached bool +} + +func (b0 ExternalIPStatus_builder) Build() *ExternalIPStatus { + m0 := &ExternalIPStatus{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_State = b.State + if b.Message != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 6) + x.xxx_hidden_Message = b.Message + } + x.xxx_hidden_Hub = b.Hub + x.xxx_hidden_Address = b.Address + x.xxx_hidden_Pool = b.Pool + x.xxx_hidden_Attached = b.Attached + return m0 +} + +var File_osac_private_v1_external_ip_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ip_type_proto_rawDesc = string([]byte{ + 0x0a, 0x26, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, + 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, + 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0xc3, 0x01, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x39, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x04, 0x70, + 0x6f, 0x6f, 0x6c, 0x22, 0xef, 0x01, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, + 0x12, 0x1d, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, + 0x41, 0x03, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x08, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xb2, 0x01, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x45, 0x58, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, + 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x58, + 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x49, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x42, 0xd8, 0x01, 0x0a, 0x13, 0x63, + 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x42, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x70, 0x54, 0x79, + 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 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_external_ip_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_external_ip_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_osac_private_v1_external_ip_type_proto_goTypes = []any{ + (ExternalIPState)(0), // 0: osac.private.v1.ExternalIPState + (*ExternalIP)(nil), // 1: osac.private.v1.ExternalIP + (*ExternalIPSpec)(nil), // 2: osac.private.v1.ExternalIPSpec + (*ExternalIPStatus)(nil), // 3: osac.private.v1.ExternalIPStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata +} +var file_osac_private_v1_external_ip_type_proto_depIdxs = []int32{ + 4, // 0: osac.private.v1.ExternalIP.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.ExternalIP.spec:type_name -> osac.private.v1.ExternalIPSpec + 3, // 2: osac.private.v1.ExternalIP.status:type_name -> osac.private.v1.ExternalIPStatus + 0, // 3: osac.private.v1.ExternalIPStatus.state:type_name -> osac.private.v1.ExternalIPState + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ip_type_proto_init() } +func file_osac_private_v1_external_ip_type_proto_init() { + if File_osac_private_v1_external_ip_type_proto != nil { + return + } + file_osac_private_v1_metadata_type_proto_init() + file_osac_private_v1_external_ip_type_proto_msgTypes[2].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_external_ip_type_proto_rawDesc), len(file_osac_private_v1_external_ip_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_external_ip_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ip_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_external_ip_type_proto_enumTypes, + MessageInfos: file_osac_private_v1_external_ip_type_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ip_type_proto = out.File + file_osac_private_v1_external_ip_type_proto_goTypes = nil + file_osac_private_v1_external_ip_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ips_service.pb.go b/internal/api/osac/private/v1/external_ips_service.pb.go new file mode 100644 index 00000000..7ffa418e --- /dev/null +++ b/internal/api/osac/private/v1/external_ips_service.pb.go @@ -0,0 +1,1184 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ips_service.proto + +//go:build !protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPsListRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Index of the first result. If not specified the default value will be zero. + Offset *int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof" json:"offset,omitempty"` + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof" json:"limit,omitempty"` + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all external IPs + // in ALLOCATED state: + // + // this.status.state == EXTERNAL_IP_STATE_ALLOCATED + // + // If this isn't provided, or if the value is empty, then all the external IPs that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof" json:"filter,omitempty"` + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP instead of the names of the columns of a table. For example, in order + // to sort the external IPs descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof" json:"order,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsListRequest) Reset() { + *x = ExternalIPsListRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsListRequest) ProtoMessage() {} + +func (x *ExternalIPsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[0] + 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 *ExternalIPsListRequest) GetOffset() int32 { + if x != nil && x.Offset != nil { + return *x.Offset + } + return 0 +} + +func (x *ExternalIPsListRequest) GetLimit() int32 { + if x != nil && x.Limit != nil { + return *x.Limit + } + return 0 +} + +func (x *ExternalIPsListRequest) GetFilter() string { + if x != nil && x.Filter != nil { + return *x.Filter + } + return "" +} + +func (x *ExternalIPsListRequest) GetOrder() string { + if x != nil && x.Order != nil { + return *x.Order + } + return "" +} + +func (x *ExternalIPsListRequest) SetOffset(v int32) { + x.Offset = &v +} + +func (x *ExternalIPsListRequest) SetLimit(v int32) { + x.Limit = &v +} + +func (x *ExternalIPsListRequest) SetFilter(v string) { + x.Filter = &v +} + +func (x *ExternalIPsListRequest) SetOrder(v string) { + x.Order = &v +} + +func (x *ExternalIPsListRequest) HasOffset() bool { + if x == nil { + return false + } + return x.Offset != nil +} + +func (x *ExternalIPsListRequest) HasLimit() bool { + if x == nil { + return false + } + return x.Limit != nil +} + +func (x *ExternalIPsListRequest) HasFilter() bool { + if x == nil { + return false + } + return x.Filter != nil +} + +func (x *ExternalIPsListRequest) HasOrder() bool { + if x == nil { + return false + } + return x.Order != nil +} + +func (x *ExternalIPsListRequest) ClearOffset() { + x.Offset = nil +} + +func (x *ExternalIPsListRequest) ClearLimit() { + x.Limit = nil +} + +func (x *ExternalIPsListRequest) ClearFilter() { + x.Filter = nil +} + +func (x *ExternalIPsListRequest) ClearOrder() { + x.Order = nil +} + +type ExternalIPsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all external IPs + // in ALLOCATED state: + // + // this.status.state == EXTERNAL_IP_STATE_ALLOCATED + // + // If this isn't provided, or if the value is empty, then all the external IPs that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP instead of the names of the columns of a table. For example, in order + // to sort the external IPs descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPsListRequest_builder) Build() *ExternalIPsListRequest { + m0 := &ExternalIPsListRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Offset = b.Offset + x.Limit = b.Limit + x.Filter = b.Filter + x.Order = b.Order + return m0 +} + +type ExternalIPsListResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 `protobuf:"varint,1,opt,name=size,proto3" json:"size,omitempty"` + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + // List of results. + Items []*ExternalIP `protobuf:"bytes,3,rep,name=items,proto3" json:"items,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsListResponse) Reset() { + *x = ExternalIPsListResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsListResponse) ProtoMessage() {} + +func (x *ExternalIPsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[1] + 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 *ExternalIPsListResponse) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ExternalIPsListResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ExternalIPsListResponse) GetItems() []*ExternalIP { + if x != nil { + return x.Items + } + return nil +} + +func (x *ExternalIPsListResponse) SetSize(v int32) { + x.Size = v +} + +func (x *ExternalIPsListResponse) SetTotal(v int32) { + x.Total = v +} + +func (x *ExternalIPsListResponse) SetItems(v []*ExternalIP) { + x.Items = v +} + +type ExternalIPsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 + // List of results. + Items []*ExternalIP +} + +func (b0 ExternalIPsListResponse_builder) Build() *ExternalIPsListResponse { + m0 := &ExternalIPsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Size = b.Size + x.Total = b.Total + x.Items = b.Items + return m0 +} + +type ExternalIPsGetRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsGetRequest) Reset() { + *x = ExternalIPsGetRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsGetRequest) ProtoMessage() {} + +func (x *ExternalIPsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[2] + 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 *ExternalIPsGetRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPsGetRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsGetRequest_builder) Build() *ExternalIPsGetRequest { + m0 := &ExternalIPsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPsGetResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsGetResponse) Reset() { + *x = ExternalIPsGetResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsGetResponse) ProtoMessage() {} + +func (x *ExternalIPsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[3] + 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 *ExternalIPsGetResponse) GetObject() *ExternalIP { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPsGetResponse) SetObject(v *ExternalIP) { + x.Object = v +} + +func (x *ExternalIPsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPsGetResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsGetResponse_builder) Build() *ExternalIPsGetResponse { + m0 := &ExternalIPsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPsCreateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsCreateRequest) Reset() { + *x = ExternalIPsCreateRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[4] + 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 *ExternalIPsCreateRequest) GetObject() *ExternalIP { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPsCreateRequest) SetObject(v *ExternalIP) { + x.Object = v +} + +func (x *ExternalIPsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPsCreateRequest) ClearObject() { + x.Object = nil +} + +type ExternalIPsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsCreateRequest_builder) Build() *ExternalIPsCreateRequest { + m0 := &ExternalIPsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPsCreateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsCreateResponse) Reset() { + *x = ExternalIPsCreateResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_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 *ExternalIPsCreateResponse) GetObject() *ExternalIP { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPsCreateResponse) SetObject(v *ExternalIP) { + x.Object = v +} + +func (x *ExternalIPsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPsCreateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsCreateResponse_builder) Build() *ExternalIPsCreateResponse { + m0 := &ExternalIPsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPsUpdateRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool `protobuf:"varint,3,opt,name=lock,proto3" json:"lock,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsUpdateRequest) Reset() { + *x = ExternalIPsUpdateRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_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 *ExternalIPsUpdateRequest) GetObject() *ExternalIP { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.UpdateMask + } + return nil +} + +func (x *ExternalIPsUpdateRequest) GetLock() bool { + if x != nil { + return x.Lock + } + return false +} + +func (x *ExternalIPsUpdateRequest) SetObject(v *ExternalIP) { + x.Object = v +} + +func (x *ExternalIPsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.UpdateMask = v +} + +func (x *ExternalIPsUpdateRequest) SetLock(v bool) { + x.Lock = v +} + +func (x *ExternalIPsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.UpdateMask != nil +} + +func (x *ExternalIPsUpdateRequest) ClearObject() { + x.Object = nil +} + +func (x *ExternalIPsUpdateRequest) ClearUpdateMask() { + x.UpdateMask = nil +} + +type ExternalIPsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPsUpdateRequest_builder) Build() *ExternalIPsUpdateRequest { + m0 := &ExternalIPsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + x.UpdateMask = b.UpdateMask + x.Lock = b.Lock + return m0 +} + +type ExternalIPsUpdateResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsUpdateResponse) Reset() { + *x = ExternalIPsUpdateResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[7] + 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 *ExternalIPsUpdateResponse) GetObject() *ExternalIP { + if x != nil { + return x.Object + } + return nil +} + +func (x *ExternalIPsUpdateResponse) SetObject(v *ExternalIP) { + x.Object = v +} + +func (x *ExternalIPsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.Object != nil +} + +func (x *ExternalIPsUpdateResponse) ClearObject() { + x.Object = nil +} + +type ExternalIPsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsUpdateResponse_builder) Build() *ExternalIPsUpdateResponse { + m0 := &ExternalIPsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Object = b.Object + return m0 +} + +type ExternalIPsDeleteRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsDeleteRequest) Reset() { + *x = ExternalIPsDeleteRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[8] + 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 *ExternalIPsDeleteRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPsDeleteRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsDeleteRequest_builder) Build() *ExternalIPsDeleteRequest { + m0 := &ExternalIPsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPsDeleteResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsDeleteResponse) Reset() { + *x = ExternalIPsDeleteResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPsDeleteResponse_builder) Build() *ExternalIPsDeleteResponse { + m0 := &ExternalIPsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPsSignalRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsSignalRequest) Reset() { + *x = ExternalIPsSignalRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[10] + 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 *ExternalIPsSignalRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ExternalIPsSignalRequest) SetId(v string) { + x.Id = v +} + +type ExternalIPsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsSignalRequest_builder) Build() *ExternalIPsSignalRequest { + m0 := &ExternalIPsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +type ExternalIPsSignalResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsSignalResponse) Reset() { + *x = ExternalIPsSignalResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPsSignalResponse_builder) Build() *ExternalIPsSignalResponse { + m0 := &ExternalIPsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ips_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ips_service_proto_rawDesc = string([]byte{ + 0x0a, 0x2a, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x6f, + 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x76, 0x0a, 0x17, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x31, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x4f, 0x0a, 0x18, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x50, 0x0a, 0x19, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa0, 0x01, + 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x50, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, + 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2a, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1b, + 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x18, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc6, 0x06, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x73, 0x12, 0x7f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x12, 0x95, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x1c, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x06, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3a, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x32, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, + 0x73, 0x2f, 0x7b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x8a, 0x01, + 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x61, 0x0a, 0x06, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xdc, 0x01, + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x17, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x70, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, + 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ips_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ips_service_proto_goTypes = []any{ + (*ExternalIPsListRequest)(nil), // 0: osac.private.v1.ExternalIPsListRequest + (*ExternalIPsListResponse)(nil), // 1: osac.private.v1.ExternalIPsListResponse + (*ExternalIPsGetRequest)(nil), // 2: osac.private.v1.ExternalIPsGetRequest + (*ExternalIPsGetResponse)(nil), // 3: osac.private.v1.ExternalIPsGetResponse + (*ExternalIPsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPsCreateRequest + (*ExternalIPsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPsCreateResponse + (*ExternalIPsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPsUpdateRequest + (*ExternalIPsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPsUpdateResponse + (*ExternalIPsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPsDeleteRequest + (*ExternalIPsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPsDeleteResponse + (*ExternalIPsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPsSignalRequest + (*ExternalIPsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPsSignalResponse + (*ExternalIP)(nil), // 12: osac.private.v1.ExternalIP + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ips_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPsListResponse.items:type_name -> osac.private.v1.ExternalIP + 12, // 1: osac.private.v1.ExternalIPsGetResponse.object:type_name -> osac.private.v1.ExternalIP + 12, // 2: osac.private.v1.ExternalIPsCreateRequest.object:type_name -> osac.private.v1.ExternalIP + 12, // 3: osac.private.v1.ExternalIPsCreateResponse.object:type_name -> osac.private.v1.ExternalIP + 12, // 4: osac.private.v1.ExternalIPsUpdateRequest.object:type_name -> osac.private.v1.ExternalIP + 13, // 5: osac.private.v1.ExternalIPsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPsUpdateResponse.object:type_name -> osac.private.v1.ExternalIP + 0, // 7: osac.private.v1.ExternalIPs.List:input_type -> osac.private.v1.ExternalIPsListRequest + 2, // 8: osac.private.v1.ExternalIPs.Get:input_type -> osac.private.v1.ExternalIPsGetRequest + 4, // 9: osac.private.v1.ExternalIPs.Create:input_type -> osac.private.v1.ExternalIPsCreateRequest + 6, // 10: osac.private.v1.ExternalIPs.Update:input_type -> osac.private.v1.ExternalIPsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPs.Delete:input_type -> osac.private.v1.ExternalIPsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPs.Signal:input_type -> osac.private.v1.ExternalIPsSignalRequest + 1, // 13: osac.private.v1.ExternalIPs.List:output_type -> osac.private.v1.ExternalIPsListResponse + 3, // 14: osac.private.v1.ExternalIPs.Get:output_type -> osac.private.v1.ExternalIPsGetResponse + 5, // 15: osac.private.v1.ExternalIPs.Create:output_type -> osac.private.v1.ExternalIPsCreateResponse + 7, // 16: osac.private.v1.ExternalIPs.Update:output_type -> osac.private.v1.ExternalIPsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPs.Delete:output_type -> osac.private.v1.ExternalIPsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPs.Signal:output_type -> osac.private.v1.ExternalIPsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ips_service_proto_init() } +func file_osac_private_v1_external_ips_service_proto_init() { + if File_osac_private_v1_external_ips_service_proto != nil { + return + } + file_osac_private_v1_external_ip_type_proto_init() + file_osac_private_v1_external_ips_service_proto_msgTypes[0].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_external_ips_service_proto_rawDesc), len(file_osac_private_v1_external_ips_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ips_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ips_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ips_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ips_service_proto = out.File + file_osac_private_v1_external_ips_service_proto_goTypes = nil + file_osac_private_v1_external_ips_service_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/external_ips_service_grpc.pb.go b/internal/api/osac/private/v1/external_ips_service_grpc.pb.go new file mode 100644 index 00000000..657c7461 --- /dev/null +++ b/internal/api/osac/private/v1/external_ips_service_grpc.pb.go @@ -0,0 +1,336 @@ +// +// 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. +// + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: osac/private/v1/external_ips_service.proto + +package privatev1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + ExternalIPs_List_FullMethodName = "/osac.private.v1.ExternalIPs/List" + ExternalIPs_Get_FullMethodName = "/osac.private.v1.ExternalIPs/Get" + ExternalIPs_Create_FullMethodName = "/osac.private.v1.ExternalIPs/Create" + ExternalIPs_Update_FullMethodName = "/osac.private.v1.ExternalIPs/Update" + ExternalIPs_Delete_FullMethodName = "/osac.private.v1.ExternalIPs/Delete" + ExternalIPs_Signal_FullMethodName = "/osac.private.v1.ExternalIPs/Signal" +) + +// ExternalIPsClient is the client API for ExternalIPs service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ExternalIPsClient interface { + // Retrieves the list of external IPs. + List(ctx context.Context, in *ExternalIPsListRequest, opts ...grpc.CallOption) (*ExternalIPsListResponse, error) + // Retrieves the details of one specific external IP. + Get(ctx context.Context, in *ExternalIPsGetRequest, opts ...grpc.CallOption) (*ExternalIPsGetResponse, error) + // Creates a new external IP. The spec.pool field determines which ExternalIPPool the address is allocated from. + Create(ctx context.Context, in *ExternalIPsCreateRequest, opts ...grpc.CallOption) (*ExternalIPsCreateResponse, error) + // Updates an existing external IP. The spec.pool field is immutable; only metadata can be changed. + Update(ctx context.Context, in *ExternalIPsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPsUpdateResponse, error) + // Deletes an external IP. The allocated address is returned to the parent pool's available capacity. + Delete(ctx context.Context, in *ExternalIPsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(ctx context.Context, in *ExternalIPsSignalRequest, opts ...grpc.CallOption) (*ExternalIPsSignalResponse, error) +} + +type externalIPsClient struct { + cc grpc.ClientConnInterface +} + +func NewExternalIPsClient(cc grpc.ClientConnInterface) ExternalIPsClient { + return &externalIPsClient{cc} +} + +func (c *externalIPsClient) List(ctx context.Context, in *ExternalIPsListRequest, opts ...grpc.CallOption) (*ExternalIPsListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsListResponse) + err := c.cc.Invoke(ctx, ExternalIPs_List_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPsClient) Get(ctx context.Context, in *ExternalIPsGetRequest, opts ...grpc.CallOption) (*ExternalIPsGetResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsGetResponse) + err := c.cc.Invoke(ctx, ExternalIPs_Get_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPsClient) Create(ctx context.Context, in *ExternalIPsCreateRequest, opts ...grpc.CallOption) (*ExternalIPsCreateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsCreateResponse) + err := c.cc.Invoke(ctx, ExternalIPs_Create_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPsClient) Update(ctx context.Context, in *ExternalIPsUpdateRequest, opts ...grpc.CallOption) (*ExternalIPsUpdateResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsUpdateResponse) + err := c.cc.Invoke(ctx, ExternalIPs_Update_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPsClient) Delete(ctx context.Context, in *ExternalIPsDeleteRequest, opts ...grpc.CallOption) (*ExternalIPsDeleteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsDeleteResponse) + err := c.cc.Invoke(ctx, ExternalIPs_Delete_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *externalIPsClient) Signal(ctx context.Context, in *ExternalIPsSignalRequest, opts ...grpc.CallOption) (*ExternalIPsSignalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExternalIPsSignalResponse) + err := c.cc.Invoke(ctx, ExternalIPs_Signal_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ExternalIPsServer is the server API for ExternalIPs service. +// All implementations must embed UnimplementedExternalIPsServer +// for forward compatibility. +type ExternalIPsServer interface { + // Retrieves the list of external IPs. + List(context.Context, *ExternalIPsListRequest) (*ExternalIPsListResponse, error) + // Retrieves the details of one specific external IP. + Get(context.Context, *ExternalIPsGetRequest) (*ExternalIPsGetResponse, error) + // Creates a new external IP. The spec.pool field determines which ExternalIPPool the address is allocated from. + Create(context.Context, *ExternalIPsCreateRequest) (*ExternalIPsCreateResponse, error) + // Updates an existing external IP. The spec.pool field is immutable; only metadata can be changed. + Update(context.Context, *ExternalIPsUpdateRequest) (*ExternalIPsUpdateResponse, error) + // Deletes an external IP. The allocated address is returned to the parent pool's available capacity. + Delete(context.Context, *ExternalIPsDeleteRequest) (*ExternalIPsDeleteResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(context.Context, *ExternalIPsSignalRequest) (*ExternalIPsSignalResponse, error) + mustEmbedUnimplementedExternalIPsServer() +} + +// UnimplementedExternalIPsServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedExternalIPsServer struct{} + +func (UnimplementedExternalIPsServer) List(context.Context, *ExternalIPsListRequest) (*ExternalIPsListResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method List not implemented") +} +func (UnimplementedExternalIPsServer) Get(context.Context, *ExternalIPsGetRequest) (*ExternalIPsGetResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} +func (UnimplementedExternalIPsServer) Create(context.Context, *ExternalIPsCreateRequest) (*ExternalIPsCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedExternalIPsServer) Update(context.Context, *ExternalIPsUpdateRequest) (*ExternalIPsUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedExternalIPsServer) Delete(context.Context, *ExternalIPsDeleteRequest) (*ExternalIPsDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") +} +func (UnimplementedExternalIPsServer) Signal(context.Context, *ExternalIPsSignalRequest) (*ExternalIPsSignalResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Signal not implemented") +} +func (UnimplementedExternalIPsServer) mustEmbedUnimplementedExternalIPsServer() {} +func (UnimplementedExternalIPsServer) testEmbeddedByValue() {} + +// UnsafeExternalIPsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ExternalIPsServer will +// result in compilation errors. +type UnsafeExternalIPsServer interface { + mustEmbedUnimplementedExternalIPsServer() +} + +func RegisterExternalIPsServer(s grpc.ServiceRegistrar, srv ExternalIPsServer) { + // If the following call pancis, it indicates UnimplementedExternalIPsServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&ExternalIPs_ServiceDesc, srv) +} + +func _ExternalIPs_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsListRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).List(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_List_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).List(ctx, req.(*ExternalIPsListRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPs_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_Get_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).Get(ctx, req.(*ExternalIPsGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPs_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_Create_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).Create(ctx, req.(*ExternalIPsCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPs_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_Update_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).Update(ctx, req.(*ExternalIPsUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPs_Delete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).Delete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_Delete_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).Delete(ctx, req.(*ExternalIPsDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ExternalIPs_Signal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExternalIPsSignalRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ExternalIPsServer).Signal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ExternalIPs_Signal_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ExternalIPsServer).Signal(ctx, req.(*ExternalIPsSignalRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ExternalIPs_ServiceDesc is the grpc.ServiceDesc for ExternalIPs service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ExternalIPs_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "osac.private.v1.ExternalIPs", + HandlerType: (*ExternalIPsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "List", + Handler: _ExternalIPs_List_Handler, + }, + { + MethodName: "Get", + Handler: _ExternalIPs_Get_Handler, + }, + { + MethodName: "Create", + Handler: _ExternalIPs_Create_Handler, + }, + { + MethodName: "Update", + Handler: _ExternalIPs_Update_Handler, + }, + { + MethodName: "Delete", + Handler: _ExternalIPs_Delete_Handler, + }, + { + MethodName: "Signal", + Handler: _ExternalIPs_Signal_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "osac/private/v1/external_ips_service.proto", +} diff --git a/internal/api/osac/private/v1/external_ips_service_protoopaque.pb.go b/internal/api/osac/private/v1/external_ips_service_protoopaque.pb.go new file mode 100644 index 00000000..165b79c5 --- /dev/null +++ b/internal/api/osac/private/v1/external_ips_service_protoopaque.pb.go @@ -0,0 +1,1180 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/external_ips_service.proto + +//go:build protoopaque + +package privatev1 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type ExternalIPsListRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Offset int32 `protobuf:"varint,1,opt,name=offset,proto3,oneof"` + xxx_hidden_Limit int32 `protobuf:"varint,2,opt,name=limit,proto3,oneof"` + xxx_hidden_Filter *string `protobuf:"bytes,3,opt,name=filter,proto3,oneof"` + xxx_hidden_Order *string `protobuf:"bytes,4,opt,name=order,proto3,oneof"` + XXX_raceDetectHookData protoimpl.RaceDetectHookData + XXX_presence [1]uint32 + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsListRequest) Reset() { + *x = ExternalIPsListRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsListRequest) ProtoMessage() {} + +func (x *ExternalIPsListRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[0] + 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 *ExternalIPsListRequest) GetOffset() int32 { + if x != nil { + return x.xxx_hidden_Offset + } + return 0 +} + +func (x *ExternalIPsListRequest) GetLimit() int32 { + if x != nil { + return x.xxx_hidden_Limit + } + return 0 +} + +func (x *ExternalIPsListRequest) GetFilter() string { + if x != nil { + if x.xxx_hidden_Filter != nil { + return *x.xxx_hidden_Filter + } + return "" + } + return "" +} + +func (x *ExternalIPsListRequest) GetOrder() string { + if x != nil { + if x.xxx_hidden_Order != nil { + return *x.xxx_hidden_Order + } + return "" + } + return "" +} + +func (x *ExternalIPsListRequest) SetOffset(v int32) { + x.xxx_hidden_Offset = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 0, 4) +} + +func (x *ExternalIPsListRequest) SetLimit(v int32) { + x.xxx_hidden_Limit = v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 1, 4) +} + +func (x *ExternalIPsListRequest) SetFilter(v string) { + x.xxx_hidden_Filter = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 2, 4) +} + +func (x *ExternalIPsListRequest) SetOrder(v string) { + x.xxx_hidden_Order = &v + protoimpl.X.SetPresent(&(x.XXX_presence[0]), 3, 4) +} + +func (x *ExternalIPsListRequest) HasOffset() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 0) +} + +func (x *ExternalIPsListRequest) HasLimit() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 1) +} + +func (x *ExternalIPsListRequest) HasFilter() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 2) +} + +func (x *ExternalIPsListRequest) HasOrder() bool { + if x == nil { + return false + } + return protoimpl.X.Present(&(x.XXX_presence[0]), 3) +} + +func (x *ExternalIPsListRequest) ClearOffset() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 0) + x.xxx_hidden_Offset = 0 +} + +func (x *ExternalIPsListRequest) ClearLimit() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 1) + x.xxx_hidden_Limit = 0 +} + +func (x *ExternalIPsListRequest) ClearFilter() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 2) + x.xxx_hidden_Filter = nil +} + +func (x *ExternalIPsListRequest) ClearOrder() { + protoimpl.X.ClearPresent(&(x.XXX_presence[0]), 3) + x.xxx_hidden_Order = nil +} + +type ExternalIPsListRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Index of the first result. If not specified the default value will be zero. + Offset *int32 + // Maximum number of results to be returned by the server. When not specified all the results will be returned. Note + // that there may not be enough results to return, and that the server may decide, for performance reasons, to return + // less results than requested. + Limit *int32 + // Filter criteria. + // + // The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The + // built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the + // expression evaluates to `true` the object is included in the results. For example, to retrieve all external IPs + // in ALLOCATED state: + // + // this.status.state == EXTERNAL_IP_STATE_ALLOCATED + // + // If this isn't provided, or if the value is empty, then all the external IPs that the user has permission to see + // will be returned. Not all CEL constructs are currently supported for implementation reasons; see the filter + // documentation (docs/FILTER.md) for the full details. + Filter *string + // Order criteria. + // + // The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the + // names of the attributes of the external IP instead of the names of the columns of a table. For example, in order + // to sort the external IPs descending by creation time the value should be: + // + // metadata.created_at desc + // + // If the parameter isn't provided, or if the value is empty, then the order of the results is undefined. + Order *string +} + +func (b0 ExternalIPsListRequest_builder) Build() *ExternalIPsListRequest { + m0 := &ExternalIPsListRequest{} + b, x := &b0, m0 + _, _ = b, x + if b.Offset != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 0, 4) + x.xxx_hidden_Offset = *b.Offset + } + if b.Limit != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 1, 4) + x.xxx_hidden_Limit = *b.Limit + } + if b.Filter != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 2, 4) + x.xxx_hidden_Filter = b.Filter + } + if b.Order != nil { + protoimpl.X.SetPresentNonAtomic(&(x.XXX_presence[0]), 3, 4) + x.xxx_hidden_Order = b.Order + } + return m0 +} + +type ExternalIPsListResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Size int32 `protobuf:"varint,1,opt,name=size,proto3"` + xxx_hidden_Total int32 `protobuf:"varint,2,opt,name=total,proto3"` + xxx_hidden_Items *[]*ExternalIP `protobuf:"bytes,3,rep,name=items,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsListResponse) Reset() { + *x = ExternalIPsListResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsListResponse) ProtoMessage() {} + +func (x *ExternalIPsListResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[1] + 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 *ExternalIPsListResponse) GetSize() int32 { + if x != nil { + return x.xxx_hidden_Size + } + return 0 +} + +func (x *ExternalIPsListResponse) GetTotal() int32 { + if x != nil { + return x.xxx_hidden_Total + } + return 0 +} + +func (x *ExternalIPsListResponse) GetItems() []*ExternalIP { + if x != nil { + if x.xxx_hidden_Items != nil { + return *x.xxx_hidden_Items + } + } + return nil +} + +func (x *ExternalIPsListResponse) SetSize(v int32) { + x.xxx_hidden_Size = v +} + +func (x *ExternalIPsListResponse) SetTotal(v int32) { + x.xxx_hidden_Total = v +} + +func (x *ExternalIPsListResponse) SetItems(v []*ExternalIP) { + x.xxx_hidden_Items = &v +} + +type ExternalIPsListResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + // Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter + // of the request if there are not enough items, or if the system decides that returning that number of items isn't + // feasible or convenient for performance reasons. + Size int32 + // Total number of items of the collection that match the search criteria, regardless of the number of results + // requested with the `limit` parameter. + Total int32 + // List of results. + Items []*ExternalIP +} + +func (b0 ExternalIPsListResponse_builder) Build() *ExternalIPsListResponse { + m0 := &ExternalIPsListResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Size = b.Size + x.xxx_hidden_Total = b.Total + x.xxx_hidden_Items = &b.Items + return m0 +} + +type ExternalIPsGetRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsGetRequest) Reset() { + *x = ExternalIPsGetRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsGetRequest) ProtoMessage() {} + +func (x *ExternalIPsGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[2] + 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 *ExternalIPsGetRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPsGetRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPsGetRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsGetRequest_builder) Build() *ExternalIPsGetRequest { + m0 := &ExternalIPsGetRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPsGetResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsGetResponse) Reset() { + *x = ExternalIPsGetResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsGetResponse) ProtoMessage() {} + +func (x *ExternalIPsGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[3] + 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 *ExternalIPsGetResponse) GetObject() *ExternalIP { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPsGetResponse) SetObject(v *ExternalIP) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPsGetResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPsGetResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPsGetResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsGetResponse_builder) Build() *ExternalIPsGetResponse { + m0 := &ExternalIPsGetResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPsCreateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsCreateRequest) Reset() { + *x = ExternalIPsCreateRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsCreateRequest) ProtoMessage() {} + +func (x *ExternalIPsCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[4] + 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 *ExternalIPsCreateRequest) GetObject() *ExternalIP { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPsCreateRequest) SetObject(v *ExternalIP) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPsCreateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPsCreateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPsCreateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsCreateRequest_builder) Build() *ExternalIPsCreateRequest { + m0 := &ExternalIPsCreateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPsCreateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsCreateResponse) Reset() { + *x = ExternalIPsCreateResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsCreateResponse) ProtoMessage() {} + +func (x *ExternalIPsCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_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 *ExternalIPsCreateResponse) GetObject() *ExternalIP { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPsCreateResponse) SetObject(v *ExternalIP) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPsCreateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPsCreateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPsCreateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsCreateResponse_builder) Build() *ExternalIPsCreateResponse { + m0 := &ExternalIPsCreateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPsUpdateRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3"` + xxx_hidden_UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3"` + xxx_hidden_Lock bool `protobuf:"varint,3,opt,name=lock,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsUpdateRequest) Reset() { + *x = ExternalIPsUpdateRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsUpdateRequest) ProtoMessage() {} + +func (x *ExternalIPsUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_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 *ExternalIPsUpdateRequest) GetObject() *ExternalIP { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPsUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { + if x != nil { + return x.xxx_hidden_UpdateMask + } + return nil +} + +func (x *ExternalIPsUpdateRequest) GetLock() bool { + if x != nil { + return x.xxx_hidden_Lock + } + return false +} + +func (x *ExternalIPsUpdateRequest) SetObject(v *ExternalIP) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPsUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.xxx_hidden_UpdateMask = v +} + +func (x *ExternalIPsUpdateRequest) SetLock(v bool) { + x.xxx_hidden_Lock = v +} + +func (x *ExternalIPsUpdateRequest) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPsUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.xxx_hidden_UpdateMask != nil +} + +func (x *ExternalIPsUpdateRequest) ClearObject() { + x.xxx_hidden_Object = nil +} + +func (x *ExternalIPsUpdateRequest) ClearUpdateMask() { + x.xxx_hidden_UpdateMask = nil +} + +type ExternalIPsUpdateRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently. + Lock bool +} + +func (b0 ExternalIPsUpdateRequest_builder) Build() *ExternalIPsUpdateRequest { + m0 := &ExternalIPsUpdateRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + x.xxx_hidden_UpdateMask = b.UpdateMask + x.xxx_hidden_Lock = b.Lock + return m0 +} + +type ExternalIPsUpdateResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *ExternalIP `protobuf:"bytes,1,opt,name=object,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsUpdateResponse) Reset() { + *x = ExternalIPsUpdateResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsUpdateResponse) ProtoMessage() {} + +func (x *ExternalIPsUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[7] + 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 *ExternalIPsUpdateResponse) GetObject() *ExternalIP { + if x != nil { + return x.xxx_hidden_Object + } + return nil +} + +func (x *ExternalIPsUpdateResponse) SetObject(v *ExternalIP) { + x.xxx_hidden_Object = v +} + +func (x *ExternalIPsUpdateResponse) HasObject() bool { + if x == nil { + return false + } + return x.xxx_hidden_Object != nil +} + +func (x *ExternalIPsUpdateResponse) ClearObject() { + x.xxx_hidden_Object = nil +} + +type ExternalIPsUpdateResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Object *ExternalIP +} + +func (b0 ExternalIPsUpdateResponse_builder) Build() *ExternalIPsUpdateResponse { + m0 := &ExternalIPsUpdateResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Object = b.Object + return m0 +} + +type ExternalIPsDeleteRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsDeleteRequest) Reset() { + *x = ExternalIPsDeleteRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsDeleteRequest) ProtoMessage() {} + +func (x *ExternalIPsDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[8] + 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 *ExternalIPsDeleteRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPsDeleteRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPsDeleteRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsDeleteRequest_builder) Build() *ExternalIPsDeleteRequest { + m0 := &ExternalIPsDeleteRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPsDeleteResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsDeleteResponse) Reset() { + *x = ExternalIPsDeleteResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsDeleteResponse) ProtoMessage() {} + +func (x *ExternalIPsDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPsDeleteResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPsDeleteResponse_builder) Build() *ExternalIPsDeleteResponse { + m0 := &ExternalIPsDeleteResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +type ExternalIPsSignalRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsSignalRequest) Reset() { + *x = ExternalIPsSignalRequest{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsSignalRequest) ProtoMessage() {} + +func (x *ExternalIPsSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[10] + 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 *ExternalIPsSignalRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *ExternalIPsSignalRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type ExternalIPsSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 ExternalIPsSignalRequest_builder) Build() *ExternalIPsSignalRequest { + m0 := &ExternalIPsSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +type ExternalIPsSignalResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalIPsSignalResponse) Reset() { + *x = ExternalIPsSignalResponse{} + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalIPsSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalIPsSignalResponse) ProtoMessage() {} + +func (x *ExternalIPsSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_external_ips_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type ExternalIPsSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 ExternalIPsSignalResponse_builder) Build() *ExternalIPsSignalResponse { + m0 := &ExternalIPsSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + +var File_osac_private_v1_external_ips_service_proto protoreflect.FileDescriptor + +var file_osac_private_v1_external_ips_service_proto_rawDesc = string([]byte{ + 0x0a, 0x2a, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x6f, + 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, + 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x76, 0x0a, 0x17, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x31, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x05, 0x69, 0x74, 0x65, + 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x4d, 0x0a, 0x16, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x4f, 0x0a, 0x18, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x50, 0x0a, 0x19, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa0, 0x01, + 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x50, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, + 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x22, 0x2a, 0x0a, 0x18, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1b, + 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x0a, 0x18, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xc6, 0x06, 0x0a, 0x0b, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x50, 0x73, 0x12, 0x7f, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x24, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x12, 0x1c, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x26, 0x2e, + 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x50, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x21, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, + 0x7d, 0x12, 0x95, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x49, 0x50, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x34, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x1c, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x06, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x3a, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x62, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x32, 0x28, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x70, + 0x73, 0x2f, 0x7b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x8a, 0x01, + 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, + 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x2a, 0x21, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x5f, 0x69, 0x70, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0x61, 0x0a, 0x06, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x29, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x50, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2a, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x50, 0x73, 0x53, 0x69, 0x67, + 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xdc, 0x01, + 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x17, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x70, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, + 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_external_ips_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_osac_private_v1_external_ips_service_proto_goTypes = []any{ + (*ExternalIPsListRequest)(nil), // 0: osac.private.v1.ExternalIPsListRequest + (*ExternalIPsListResponse)(nil), // 1: osac.private.v1.ExternalIPsListResponse + (*ExternalIPsGetRequest)(nil), // 2: osac.private.v1.ExternalIPsGetRequest + (*ExternalIPsGetResponse)(nil), // 3: osac.private.v1.ExternalIPsGetResponse + (*ExternalIPsCreateRequest)(nil), // 4: osac.private.v1.ExternalIPsCreateRequest + (*ExternalIPsCreateResponse)(nil), // 5: osac.private.v1.ExternalIPsCreateResponse + (*ExternalIPsUpdateRequest)(nil), // 6: osac.private.v1.ExternalIPsUpdateRequest + (*ExternalIPsUpdateResponse)(nil), // 7: osac.private.v1.ExternalIPsUpdateResponse + (*ExternalIPsDeleteRequest)(nil), // 8: osac.private.v1.ExternalIPsDeleteRequest + (*ExternalIPsDeleteResponse)(nil), // 9: osac.private.v1.ExternalIPsDeleteResponse + (*ExternalIPsSignalRequest)(nil), // 10: osac.private.v1.ExternalIPsSignalRequest + (*ExternalIPsSignalResponse)(nil), // 11: osac.private.v1.ExternalIPsSignalResponse + (*ExternalIP)(nil), // 12: osac.private.v1.ExternalIP + (*fieldmaskpb.FieldMask)(nil), // 13: google.protobuf.FieldMask +} +var file_osac_private_v1_external_ips_service_proto_depIdxs = []int32{ + 12, // 0: osac.private.v1.ExternalIPsListResponse.items:type_name -> osac.private.v1.ExternalIP + 12, // 1: osac.private.v1.ExternalIPsGetResponse.object:type_name -> osac.private.v1.ExternalIP + 12, // 2: osac.private.v1.ExternalIPsCreateRequest.object:type_name -> osac.private.v1.ExternalIP + 12, // 3: osac.private.v1.ExternalIPsCreateResponse.object:type_name -> osac.private.v1.ExternalIP + 12, // 4: osac.private.v1.ExternalIPsUpdateRequest.object:type_name -> osac.private.v1.ExternalIP + 13, // 5: osac.private.v1.ExternalIPsUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 12, // 6: osac.private.v1.ExternalIPsUpdateResponse.object:type_name -> osac.private.v1.ExternalIP + 0, // 7: osac.private.v1.ExternalIPs.List:input_type -> osac.private.v1.ExternalIPsListRequest + 2, // 8: osac.private.v1.ExternalIPs.Get:input_type -> osac.private.v1.ExternalIPsGetRequest + 4, // 9: osac.private.v1.ExternalIPs.Create:input_type -> osac.private.v1.ExternalIPsCreateRequest + 6, // 10: osac.private.v1.ExternalIPs.Update:input_type -> osac.private.v1.ExternalIPsUpdateRequest + 8, // 11: osac.private.v1.ExternalIPs.Delete:input_type -> osac.private.v1.ExternalIPsDeleteRequest + 10, // 12: osac.private.v1.ExternalIPs.Signal:input_type -> osac.private.v1.ExternalIPsSignalRequest + 1, // 13: osac.private.v1.ExternalIPs.List:output_type -> osac.private.v1.ExternalIPsListResponse + 3, // 14: osac.private.v1.ExternalIPs.Get:output_type -> osac.private.v1.ExternalIPsGetResponse + 5, // 15: osac.private.v1.ExternalIPs.Create:output_type -> osac.private.v1.ExternalIPsCreateResponse + 7, // 16: osac.private.v1.ExternalIPs.Update:output_type -> osac.private.v1.ExternalIPsUpdateResponse + 9, // 17: osac.private.v1.ExternalIPs.Delete:output_type -> osac.private.v1.ExternalIPsDeleteResponse + 11, // 18: osac.private.v1.ExternalIPs.Signal:output_type -> osac.private.v1.ExternalIPsSignalResponse + 13, // [13:19] is the sub-list for method output_type + 7, // [7:13] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_external_ips_service_proto_init() } +func file_osac_private_v1_external_ips_service_proto_init() { + if File_osac_private_v1_external_ips_service_proto != nil { + return + } + file_osac_private_v1_external_ip_type_proto_init() + file_osac_private_v1_external_ips_service_proto_msgTypes[0].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_external_ips_service_proto_rawDesc), len(file_osac_private_v1_external_ips_service_proto_rawDesc)), + NumEnums: 0, + NumMessages: 12, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_osac_private_v1_external_ips_service_proto_goTypes, + DependencyIndexes: file_osac_private_v1_external_ips_service_proto_depIdxs, + MessageInfos: file_osac_private_v1_external_ips_service_proto_msgTypes, + }.Build() + File_osac_private_v1_external_ips_service_proto = out.File + file_osac_private_v1_external_ips_service_proto_goTypes = nil + file_osac_private_v1_external_ips_service_proto_depIdxs = nil +} 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 00a10550..f9f427a0 100644 --- a/internal/api/osac/private/v1/identity_provider_type.pb.go +++ b/internal/api/osac/private/v1/identity_provider_type.pb.go @@ -88,14 +88,65 @@ 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.). type IdentityProvider struct { state protoimpl.MessageState `protogen:"hybrid.v1"` - // Unique name identifier for this IdP. Immutable after creation. - // Must be URL-safe and unique - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Unique identifier for this IdP. Immutable after creation. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // Metadata contains common object metadata. Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` // Spec is the desired state of the identity provider. @@ -131,9 +182,9 @@ func (x *IdentityProvider) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvider) GetName() string { +func (x *IdentityProvider) GetId() string { if x != nil { - return x.Name + return x.Id } return "" } @@ -159,8 +210,8 @@ func (x *IdentityProvider) GetStatus() *IdentityProviderStatus { return nil } -func (x *IdentityProvider) SetName(v string) { - x.Name = v +func (x *IdentityProvider) SetId(v string) { + x.Id = v } func (x *IdentityProvider) SetMetadata(v *Metadata) { @@ -211,9 +262,8 @@ func (x *IdentityProvider) ClearStatus() { type IdentityProvider_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Unique name identifier for this IdP. Immutable after creation. - // Must be URL-safe and unique - Name string + // Unique identifier for this IdP. Immutable after creation. + Id string // Metadata contains common object metadata. Metadata *Metadata // Spec is the desired state of the identity provider. @@ -226,7 +276,7 @@ func (b0 IdentityProvider_builder) Build() *IdentityProvider { m0 := &IdentityProvider{} b, x := &b0, m0 _, _ = b, x - x.Name = b.Name + x.Id = b.Id x.Metadata = b.Metadata x.Spec = b.Spec x.Status = b.Status @@ -1379,6 +1429,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{ @@ -1393,190 +1557,221 @@ var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x75, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xd9, 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, 0x35, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x39, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 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, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xed, - 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, 0x31, - 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, - 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, - 0x63, 0x12, 0x31, 0x0a, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 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, 0xbc, 0x01, 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, 0x3c, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 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, 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, - 0x4a, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x19, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 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, 0xde, 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, 0x4c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 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, + 0x74, 0x6f, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xed, 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, 0x31, 0x0a, 0x04, 0x6f, 0x69, + 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x31, 0x0a, + 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 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, 0xbc, 0x01, 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, 0x3c, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 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, 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, 0x4a, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x19, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 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, 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, 0xde, 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, 0x4c, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 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() } @@ -1592,13 +1787,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 cadac8c7..77d0dcf1 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,12 +88,64 @@ 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.). type IdentityProvider struct { state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` xxx_hidden_Metadata *Metadata `protobuf:"bytes,2,opt,name=metadata,proto3"` xxx_hidden_Spec *IdentityProviderSpec `protobuf:"bytes,3,opt,name=spec,proto3"` xxx_hidden_Status *IdentityProviderStatus `protobuf:"bytes,4,opt,name=status,proto3"` @@ -126,9 +178,9 @@ func (x *IdentityProvider) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvider) GetName() string { +func (x *IdentityProvider) GetId() string { if x != nil { - return x.xxx_hidden_Name + return x.xxx_hidden_Id } return "" } @@ -154,8 +206,8 @@ func (x *IdentityProvider) GetStatus() *IdentityProviderStatus { return nil } -func (x *IdentityProvider) SetName(v string) { - x.xxx_hidden_Name = v +func (x *IdentityProvider) SetId(v string) { + x.xxx_hidden_Id = v } func (x *IdentityProvider) SetMetadata(v *Metadata) { @@ -206,9 +258,8 @@ func (x *IdentityProvider) ClearStatus() { type IdentityProvider_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Unique name identifier for this IdP. Immutable after creation. - // Must be URL-safe and unique - Name string + // Unique identifier for this IdP. Immutable after creation. + Id string // Metadata contains common object metadata. Metadata *Metadata // Spec is the desired state of the identity provider. @@ -221,7 +272,7 @@ func (b0 IdentityProvider_builder) Build() *IdentityProvider { m0 := &IdentityProvider{} b, x := &b0, m0 _, _ = b, x - x.xxx_hidden_Name = b.Name + x.xxx_hidden_Id = b.Id x.xxx_hidden_Metadata = b.Metadata x.xxx_hidden_Spec = b.Spec x.xxx_hidden_Status = b.Status @@ -1396,6 +1447,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{ @@ -1410,190 +1582,221 @@ var file_osac_private_v1_identity_provider_type_proto_rawDesc = string([]byte{ 0x75, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xd9, 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, 0x35, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x39, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 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, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xed, - 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, 0x31, - 0x0a, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, - 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, - 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, - 0x63, 0x12, 0x31, 0x0a, 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 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, 0xbc, 0x01, 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, 0x3c, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 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, 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, - 0x4a, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x19, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, - 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, - 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, 0xde, 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, 0x4c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 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, + 0x74, 0x6f, 0x22, 0xd5, 0x01, 0x0a, 0x10, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, + 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 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, 0x53, + 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 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, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xed, 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, 0x31, 0x0a, 0x04, 0x6f, 0x69, + 0x64, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x69, 0x64, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x04, 0x6f, 0x69, 0x64, 0x63, 0x12, 0x31, 0x0a, + 0x04, 0x6c, 0x64, 0x61, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 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, 0xbc, 0x01, 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, 0x3c, 0x0a, 0x05, 0x70, 0x68, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 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, 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, 0x4a, 0x0a, 0x0a, 0x63, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 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, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe9, 0x01, 0x0a, 0x19, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6f, 0x73, 0x61, 0x63, + 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 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, 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, 0xde, 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, 0x4c, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 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() } @@ -1609,13 +1812,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_providers_service.pb.go b/internal/api/osac/private/v1/identity_providers_service.pb.go index 73fed676..2100c721 100644 --- a/internal/api/osac/private/v1/identity_providers_service.pb.go +++ b/internal/api/osac/private/v1/identity_providers_service.pb.go @@ -25,6 +25,7 @@ import ( _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" reflect "reflect" unsafe "unsafe" ) @@ -253,11 +254,11 @@ func (b0 IdentityProvidersListResponse_builder) Build() *IdentityProvidersListRe return m0 } -// Request to get an identity provider by name. +// Request to get an identity provider by ID. type IdentityProvidersGetRequest struct { state protoimpl.MessageState `protogen:"hybrid.v1"` - // Name of the identity provider. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // ID of the identity provider. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -287,29 +288,29 @@ func (x *IdentityProvidersGetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersGetRequest) GetName() string { +func (x *IdentityProvidersGetRequest) GetId() string { if x != nil { - return x.Name + return x.Id } return "" } -func (x *IdentityProvidersGetRequest) SetName(v string) { - x.Name = v +func (x *IdentityProvidersGetRequest) SetId(v string) { + x.Id = v } type IdentityProvidersGetRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider. - Name string + // ID of the identity provider. + Id string } func (b0 IdentityProvidersGetRequest_builder) Build() *IdentityProvidersGetRequest { m0 := &IdentityProvidersGetRequest{} b, x := &b0, m0 _, _ = b, x - x.Name = b.Name + x.Id = b.Id return m0 } @@ -529,10 +530,14 @@ func (b0 IdentityProvidersCreateResponse_builder) Build() *IdentityProvidersCrea // Request to update an identity provider. type IdentityProvidersUpdateRequest struct { state protoimpl.MessageState `protogen:"hybrid.v1"` - // Name of the identity provider to update. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The updated identity provider object. - Object *IdentityProvider `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"` + Object *IdentityProvider `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + // Update mask indicating which fields to update. + UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"` + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected with a conflict error. + Lock bool `protobuf:"varint,3,opt,name=lock,proto3" json:"lock,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -562,28 +567,39 @@ func (x *IdentityProvidersUpdateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersUpdateRequest) GetName() string { +func (x *IdentityProvidersUpdateRequest) GetObject() *IdentityProvider { if x != nil { - return x.Name + return x.Object } - return "" + return nil } -func (x *IdentityProvidersUpdateRequest) GetObject() *IdentityProvider { +func (x *IdentityProvidersUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { - return x.Object + return x.UpdateMask } return nil } -func (x *IdentityProvidersUpdateRequest) SetName(v string) { - x.Name = v +func (x *IdentityProvidersUpdateRequest) GetLock() bool { + if x != nil { + return x.Lock + } + return false } func (x *IdentityProvidersUpdateRequest) SetObject(v *IdentityProvider) { x.Object = v } +func (x *IdentityProvidersUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.UpdateMask = v +} + +func (x *IdentityProvidersUpdateRequest) SetLock(v bool) { + x.Lock = v +} + func (x *IdentityProvidersUpdateRequest) HasObject() bool { if x == nil { return false @@ -591,25 +607,41 @@ func (x *IdentityProvidersUpdateRequest) HasObject() bool { return x.Object != nil } +func (x *IdentityProvidersUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.UpdateMask != nil +} + func (x *IdentityProvidersUpdateRequest) ClearObject() { x.Object = nil } +func (x *IdentityProvidersUpdateRequest) ClearUpdateMask() { + x.UpdateMask = nil +} + type IdentityProvidersUpdateRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider to update. - Name string // The updated identity provider object. Object *IdentityProvider + // Update mask indicating which fields to update. + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected with a conflict error. + Lock bool } func (b0 IdentityProvidersUpdateRequest_builder) Build() *IdentityProvidersUpdateRequest { m0 := &IdentityProvidersUpdateRequest{} b, x := &b0, m0 _, _ = b, x - x.Name = b.Name x.Object = b.Object + x.UpdateMask = b.UpdateMask + x.Lock = b.Lock return m0 } @@ -687,8 +719,8 @@ func (b0 IdentityProvidersUpdateResponse_builder) Build() *IdentityProvidersUpda // Request to delete an identity provider. type IdentityProvidersDeleteRequest struct { state protoimpl.MessageState `protogen:"hybrid.v1"` - // Name of the identity provider to delete. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // ID of the identity provider to delete. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -718,29 +750,29 @@ func (x *IdentityProvidersDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersDeleteRequest) GetName() string { +func (x *IdentityProvidersDeleteRequest) GetId() string { if x != nil { - return x.Name + return x.Id } return "" } -func (x *IdentityProvidersDeleteRequest) SetName(v string) { - x.Name = v +func (x *IdentityProvidersDeleteRequest) SetId(v string) { + x.Id = v } type IdentityProvidersDeleteRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider to delete. - Name string + // ID of the identity provider to delete. + Id string } func (b0 IdentityProvidersDeleteRequest_builder) Build() *IdentityProvidersDeleteRequest { m0 := &IdentityProvidersDeleteRequest{} b, x := &b0, m0 _, _ = b, x - x.Name = b.Name + x.Id = b.Id return m0 } @@ -1028,6 +1060,108 @@ func (b0 IdentityProvidersUnassignResponse_builder) Build() *IdentityProvidersUn return m0 } +// Request to signal that an identity provider needs reconciliation. +type IdentityProvidersSignalRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProvidersSignalRequest) Reset() { + *x = IdentityProvidersSignalRequest{} + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProvidersSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProvidersSignalRequest) ProtoMessage() {} + +func (x *IdentityProvidersSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[14] + 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 *IdentityProvidersSignalRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *IdentityProvidersSignalRequest) SetId(v string) { + x.Id = v +} + +type IdentityProvidersSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 IdentityProvidersSignalRequest_builder) Build() *IdentityProvidersSignalRequest { + m0 := &IdentityProvidersSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Id = b.Id + return m0 +} + +// Response for signal operation. +type IdentityProvidersSignalResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProvidersSignalResponse) Reset() { + *x = IdentityProvidersSignalResponse{} + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProvidersSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProvidersSignalResponse) ProtoMessage() {} + +func (x *IdentityProvidersSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type IdentityProvidersSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 IdentityProvidersSignalResponse_builder) Build() *IdentityProvidersSignalResponse { + m0 := &IdentityProvidersSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + var File_osac_private_v1_identity_providers_service_proto protoreflect.FileDescriptor var file_osac_private_v1_identity_providers_service_proto_rawDesc = string([]byte{ @@ -1037,173 +1171,191 @@ var file_osac_private_v1_identity_providers_service_proto_rawDesc = string([]byt 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x2c, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x93, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 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, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x31, 0x0a, 0x1b, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, - 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, - 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2d, 0x0a, 0x1b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5b, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x1c, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5b, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x22, 0x6f, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x22, 0x34, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, - 0x0a, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x32, 0x91, 0x09, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, + 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, - 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x04, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0xac, 0x01, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x9d, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2c, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x62, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x30, + 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, + 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x1e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x21, 0x0a, + 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x81, 0x0a, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x2f, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0xa6, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0x29, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, + 0x74, 0x12, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9b, 0x01, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x2c, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x06, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, + 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x9c, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x2a, 0x29, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x06, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x12, 0x2f, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, - 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x12, 0xb0, 0x01, 0x0a, 0x08, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x12, 0x31, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x75, - 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, - 0x1d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, - 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0x2f, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, + 0x22, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0xb0, 0x01, 0x0a, 0x08, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, + 0x31, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, + 0x2a, 0x22, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x75, 0x6e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x6d, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, + 0x2f, 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, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 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, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1d, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 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_providers_service_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_osac_private_v1_identity_providers_service_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_osac_private_v1_identity_providers_service_proto_goTypes = []any{ (*IdentityProvidersListRequest)(nil), // 0: osac.private.v1.IdentityProvidersListRequest (*IdentityProvidersListResponse)(nil), // 1: osac.private.v1.IdentityProvidersListResponse @@ -1219,34 +1371,40 @@ var file_osac_private_v1_identity_providers_service_proto_goTypes = []any{ (*IdentityProvidersAssignResponse)(nil), // 11: osac.private.v1.IdentityProvidersAssignResponse (*IdentityProvidersUnassignRequest)(nil), // 12: osac.private.v1.IdentityProvidersUnassignRequest (*IdentityProvidersUnassignResponse)(nil), // 13: osac.private.v1.IdentityProvidersUnassignResponse - (*IdentityProvider)(nil), // 14: osac.private.v1.IdentityProvider + (*IdentityProvidersSignalRequest)(nil), // 14: osac.private.v1.IdentityProvidersSignalRequest + (*IdentityProvidersSignalResponse)(nil), // 15: osac.private.v1.IdentityProvidersSignalResponse + (*IdentityProvider)(nil), // 16: osac.private.v1.IdentityProvider + (*fieldmaskpb.FieldMask)(nil), // 17: google.protobuf.FieldMask } var file_osac_private_v1_identity_providers_service_proto_depIdxs = []int32{ - 14, // 0: osac.private.v1.IdentityProvidersListResponse.items:type_name -> osac.private.v1.IdentityProvider - 14, // 1: osac.private.v1.IdentityProvidersGetResponse.object:type_name -> osac.private.v1.IdentityProvider - 14, // 2: osac.private.v1.IdentityProvidersCreateRequest.object:type_name -> osac.private.v1.IdentityProvider - 14, // 3: osac.private.v1.IdentityProvidersCreateResponse.object:type_name -> osac.private.v1.IdentityProvider - 14, // 4: osac.private.v1.IdentityProvidersUpdateRequest.object:type_name -> osac.private.v1.IdentityProvider - 14, // 5: osac.private.v1.IdentityProvidersUpdateResponse.object:type_name -> osac.private.v1.IdentityProvider - 4, // 6: osac.private.v1.IdentityProviders.Create:input_type -> osac.private.v1.IdentityProvidersCreateRequest - 0, // 7: osac.private.v1.IdentityProviders.List:input_type -> osac.private.v1.IdentityProvidersListRequest - 2, // 8: osac.private.v1.IdentityProviders.Get:input_type -> osac.private.v1.IdentityProvidersGetRequest - 6, // 9: osac.private.v1.IdentityProviders.Update:input_type -> osac.private.v1.IdentityProvidersUpdateRequest - 8, // 10: osac.private.v1.IdentityProviders.Delete:input_type -> osac.private.v1.IdentityProvidersDeleteRequest - 10, // 11: osac.private.v1.IdentityProviders.Assign:input_type -> osac.private.v1.IdentityProvidersAssignRequest - 12, // 12: osac.private.v1.IdentityProviders.Unassign:input_type -> osac.private.v1.IdentityProvidersUnassignRequest - 5, // 13: osac.private.v1.IdentityProviders.Create:output_type -> osac.private.v1.IdentityProvidersCreateResponse - 1, // 14: osac.private.v1.IdentityProviders.List:output_type -> osac.private.v1.IdentityProvidersListResponse - 3, // 15: osac.private.v1.IdentityProviders.Get:output_type -> osac.private.v1.IdentityProvidersGetResponse - 7, // 16: osac.private.v1.IdentityProviders.Update:output_type -> osac.private.v1.IdentityProvidersUpdateResponse - 9, // 17: osac.private.v1.IdentityProviders.Delete:output_type -> osac.private.v1.IdentityProvidersDeleteResponse - 11, // 18: osac.private.v1.IdentityProviders.Assign:output_type -> osac.private.v1.IdentityProvidersAssignResponse - 13, // 19: osac.private.v1.IdentityProviders.Unassign:output_type -> osac.private.v1.IdentityProvidersUnassignResponse - 13, // [13:20] is the sub-list for method output_type - 6, // [6:13] 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 + 16, // 0: osac.private.v1.IdentityProvidersListResponse.items:type_name -> osac.private.v1.IdentityProvider + 16, // 1: osac.private.v1.IdentityProvidersGetResponse.object:type_name -> osac.private.v1.IdentityProvider + 16, // 2: osac.private.v1.IdentityProvidersCreateRequest.object:type_name -> osac.private.v1.IdentityProvider + 16, // 3: osac.private.v1.IdentityProvidersCreateResponse.object:type_name -> osac.private.v1.IdentityProvider + 16, // 4: osac.private.v1.IdentityProvidersUpdateRequest.object:type_name -> osac.private.v1.IdentityProvider + 17, // 5: osac.private.v1.IdentityProvidersUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 16, // 6: osac.private.v1.IdentityProvidersUpdateResponse.object:type_name -> osac.private.v1.IdentityProvider + 4, // 7: osac.private.v1.IdentityProviders.Create:input_type -> osac.private.v1.IdentityProvidersCreateRequest + 0, // 8: osac.private.v1.IdentityProviders.List:input_type -> osac.private.v1.IdentityProvidersListRequest + 2, // 9: osac.private.v1.IdentityProviders.Get:input_type -> osac.private.v1.IdentityProvidersGetRequest + 6, // 10: osac.private.v1.IdentityProviders.Update:input_type -> osac.private.v1.IdentityProvidersUpdateRequest + 8, // 11: osac.private.v1.IdentityProviders.Delete:input_type -> osac.private.v1.IdentityProvidersDeleteRequest + 10, // 12: osac.private.v1.IdentityProviders.Assign:input_type -> osac.private.v1.IdentityProvidersAssignRequest + 12, // 13: osac.private.v1.IdentityProviders.Unassign:input_type -> osac.private.v1.IdentityProvidersUnassignRequest + 14, // 14: osac.private.v1.IdentityProviders.Signal:input_type -> osac.private.v1.IdentityProvidersSignalRequest + 5, // 15: osac.private.v1.IdentityProviders.Create:output_type -> osac.private.v1.IdentityProvidersCreateResponse + 1, // 16: osac.private.v1.IdentityProviders.List:output_type -> osac.private.v1.IdentityProvidersListResponse + 3, // 17: osac.private.v1.IdentityProviders.Get:output_type -> osac.private.v1.IdentityProvidersGetResponse + 7, // 18: osac.private.v1.IdentityProviders.Update:output_type -> osac.private.v1.IdentityProvidersUpdateResponse + 9, // 19: osac.private.v1.IdentityProviders.Delete:output_type -> osac.private.v1.IdentityProvidersDeleteResponse + 11, // 20: osac.private.v1.IdentityProviders.Assign:output_type -> osac.private.v1.IdentityProvidersAssignResponse + 13, // 21: osac.private.v1.IdentityProviders.Unassign:output_type -> osac.private.v1.IdentityProvidersUnassignResponse + 15, // 22: osac.private.v1.IdentityProviders.Signal:output_type -> osac.private.v1.IdentityProvidersSignalResponse + 15, // [15:23] is the sub-list for method output_type + 7, // [7:15] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_osac_private_v1_identity_providers_service_proto_init() } @@ -1262,7 +1420,7 @@ func file_osac_private_v1_identity_providers_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_identity_providers_service_proto_rawDesc), len(file_osac_private_v1_identity_providers_service_proto_rawDesc)), NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/api/osac/private/v1/identity_providers_service_grpc.pb.go b/internal/api/osac/private/v1/identity_providers_service_grpc.pb.go index 5346df45..d411bd39 100644 --- a/internal/api/osac/private/v1/identity_providers_service_grpc.pb.go +++ b/internal/api/osac/private/v1/identity_providers_service_grpc.pb.go @@ -39,6 +39,7 @@ const ( IdentityProviders_Delete_FullMethodName = "/osac.private.v1.IdentityProviders/Delete" IdentityProviders_Assign_FullMethodName = "/osac.private.v1.IdentityProviders/Assign" IdentityProviders_Unassign_FullMethodName = "/osac.private.v1.IdentityProviders/Unassign" + IdentityProviders_Signal_FullMethodName = "/osac.private.v1.IdentityProviders/Signal" ) // IdentityProvidersClient is the client API for IdentityProviders service. @@ -62,6 +63,8 @@ type IdentityProvidersClient interface { Assign(ctx context.Context, in *IdentityProvidersAssignRequest, opts ...grpc.CallOption) (*IdentityProvidersAssignResponse, error) // Unassigns an identity provider from a tenant. Unassign(ctx context.Context, in *IdentityProvidersUnassignRequest, opts ...grpc.CallOption) (*IdentityProvidersUnassignResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(ctx context.Context, in *IdentityProvidersSignalRequest, opts ...grpc.CallOption) (*IdentityProvidersSignalResponse, error) } type identityProvidersClient struct { @@ -142,6 +145,16 @@ func (c *identityProvidersClient) Unassign(ctx context.Context, in *IdentityProv return out, nil } +func (c *identityProvidersClient) Signal(ctx context.Context, in *IdentityProvidersSignalRequest, opts ...grpc.CallOption) (*IdentityProvidersSignalResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(IdentityProvidersSignalResponse) + err := c.cc.Invoke(ctx, IdentityProviders_Signal_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // IdentityProvidersServer is the server API for IdentityProviders service. // All implementations must embed UnimplementedIdentityProvidersServer // for forward compatibility. @@ -163,6 +176,8 @@ type IdentityProvidersServer interface { Assign(context.Context, *IdentityProvidersAssignRequest) (*IdentityProvidersAssignResponse, error) // Unassigns an identity provider from a tenant. Unassign(context.Context, *IdentityProvidersUnassignRequest) (*IdentityProvidersUnassignResponse, error) + // Indicates that something changed in the object or the system that may require reconciling the object. + Signal(context.Context, *IdentityProvidersSignalRequest) (*IdentityProvidersSignalResponse, error) mustEmbedUnimplementedIdentityProvidersServer() } @@ -194,6 +209,9 @@ func (UnimplementedIdentityProvidersServer) Assign(context.Context, *IdentityPro func (UnimplementedIdentityProvidersServer) Unassign(context.Context, *IdentityProvidersUnassignRequest) (*IdentityProvidersUnassignResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Unassign not implemented") } +func (UnimplementedIdentityProvidersServer) Signal(context.Context, *IdentityProvidersSignalRequest) (*IdentityProvidersSignalResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Signal not implemented") +} func (UnimplementedIdentityProvidersServer) mustEmbedUnimplementedIdentityProvidersServer() {} func (UnimplementedIdentityProvidersServer) testEmbeddedByValue() {} @@ -341,6 +359,24 @@ func _IdentityProviders_Unassign_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _IdentityProviders_Signal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IdentityProvidersSignalRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IdentityProvidersServer).Signal(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IdentityProviders_Signal_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IdentityProvidersServer).Signal(ctx, req.(*IdentityProvidersSignalRequest)) + } + return interceptor(ctx, in, info, handler) +} + // IdentityProviders_ServiceDesc is the grpc.ServiceDesc for IdentityProviders service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -376,6 +412,10 @@ var IdentityProviders_ServiceDesc = grpc.ServiceDesc{ MethodName: "Unassign", Handler: _IdentityProviders_Unassign_Handler, }, + { + MethodName: "Signal", + Handler: _IdentityProviders_Signal_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "osac/private/v1/identity_providers_service.proto", diff --git a/internal/api/osac/private/v1/identity_providers_service_protoopaque.pb.go b/internal/api/osac/private/v1/identity_providers_service_protoopaque.pb.go index bd0bcd31..e3e2aefb 100644 --- a/internal/api/osac/private/v1/identity_providers_service_protoopaque.pb.go +++ b/internal/api/osac/private/v1/identity_providers_service_protoopaque.pb.go @@ -25,6 +25,7 @@ import ( _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb" reflect "reflect" unsafe "unsafe" ) @@ -269,12 +270,12 @@ func (b0 IdentityProvidersListResponse_builder) Build() *IdentityProvidersListRe return m0 } -// Request to get an identity provider by name. +// Request to get an identity provider by ID. type IdentityProvidersGetRequest struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProvidersGetRequest) Reset() { @@ -302,29 +303,29 @@ func (x *IdentityProvidersGetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersGetRequest) GetName() string { +func (x *IdentityProvidersGetRequest) GetId() string { if x != nil { - return x.xxx_hidden_Name + return x.xxx_hidden_Id } return "" } -func (x *IdentityProvidersGetRequest) SetName(v string) { - x.xxx_hidden_Name = v +func (x *IdentityProvidersGetRequest) SetId(v string) { + x.xxx_hidden_Id = v } type IdentityProvidersGetRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider. - Name string + // ID of the identity provider. + Id string } func (b0 IdentityProvidersGetRequest_builder) Build() *IdentityProvidersGetRequest { m0 := &IdentityProvidersGetRequest{} b, x := &b0, m0 _, _ = b, x - x.xxx_hidden_Name = b.Name + x.xxx_hidden_Id = b.Id return m0 } @@ -540,11 +541,12 @@ func (b0 IdentityProvidersCreateResponse_builder) Build() *IdentityProvidersCrea // Request to update an identity provider. type IdentityProvidersUpdateRequest struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` - xxx_hidden_Object *IdentityProvider `protobuf:"bytes,2,opt,name=object,proto3"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Object *IdentityProvider `protobuf:"bytes,1,opt,name=object,proto3"` + xxx_hidden_UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3"` + xxx_hidden_Lock bool `protobuf:"varint,3,opt,name=lock,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProvidersUpdateRequest) Reset() { @@ -572,28 +574,39 @@ func (x *IdentityProvidersUpdateRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersUpdateRequest) GetName() string { +func (x *IdentityProvidersUpdateRequest) GetObject() *IdentityProvider { if x != nil { - return x.xxx_hidden_Name + return x.xxx_hidden_Object } - return "" + return nil } -func (x *IdentityProvidersUpdateRequest) GetObject() *IdentityProvider { +func (x *IdentityProvidersUpdateRequest) GetUpdateMask() *fieldmaskpb.FieldMask { if x != nil { - return x.xxx_hidden_Object + return x.xxx_hidden_UpdateMask } return nil } -func (x *IdentityProvidersUpdateRequest) SetName(v string) { - x.xxx_hidden_Name = v +func (x *IdentityProvidersUpdateRequest) GetLock() bool { + if x != nil { + return x.xxx_hidden_Lock + } + return false } func (x *IdentityProvidersUpdateRequest) SetObject(v *IdentityProvider) { x.xxx_hidden_Object = v } +func (x *IdentityProvidersUpdateRequest) SetUpdateMask(v *fieldmaskpb.FieldMask) { + x.xxx_hidden_UpdateMask = v +} + +func (x *IdentityProvidersUpdateRequest) SetLock(v bool) { + x.xxx_hidden_Lock = v +} + func (x *IdentityProvidersUpdateRequest) HasObject() bool { if x == nil { return false @@ -601,25 +614,41 @@ func (x *IdentityProvidersUpdateRequest) HasObject() bool { return x.xxx_hidden_Object != nil } +func (x *IdentityProvidersUpdateRequest) HasUpdateMask() bool { + if x == nil { + return false + } + return x.xxx_hidden_UpdateMask != nil +} + func (x *IdentityProvidersUpdateRequest) ClearObject() { x.xxx_hidden_Object = nil } +func (x *IdentityProvidersUpdateRequest) ClearUpdateMask() { + x.xxx_hidden_UpdateMask = nil +} + type IdentityProvidersUpdateRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider to update. - Name string // The updated identity provider object. Object *IdentityProvider + // Update mask indicating which fields to update. + UpdateMask *fieldmaskpb.FieldMask + // Lock enables optimistic locking. When set to true, the server verifies that the current version of the object + // matches the value of the metadata.version field of the submitted object. If they differ the update will be + // rejected with a conflict error. + Lock bool } func (b0 IdentityProvidersUpdateRequest_builder) Build() *IdentityProvidersUpdateRequest { m0 := &IdentityProvidersUpdateRequest{} b, x := &b0, m0 _, _ = b, x - x.xxx_hidden_Name = b.Name x.xxx_hidden_Object = b.Object + x.xxx_hidden_UpdateMask = b.UpdateMask + x.xxx_hidden_Lock = b.Lock return m0 } @@ -695,10 +724,10 @@ func (b0 IdentityProvidersUpdateResponse_builder) Build() *IdentityProvidersUpda // Request to delete an identity provider. type IdentityProvidersDeleteRequest struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *IdentityProvidersDeleteRequest) Reset() { @@ -726,29 +755,29 @@ func (x *IdentityProvidersDeleteRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -func (x *IdentityProvidersDeleteRequest) GetName() string { +func (x *IdentityProvidersDeleteRequest) GetId() string { if x != nil { - return x.xxx_hidden_Name + return x.xxx_hidden_Id } return "" } -func (x *IdentityProvidersDeleteRequest) SetName(v string) { - x.xxx_hidden_Name = v +func (x *IdentityProvidersDeleteRequest) SetId(v string) { + x.xxx_hidden_Id = v } type IdentityProvidersDeleteRequest_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. - // Name of the identity provider to delete. - Name string + // ID of the identity provider to delete. + Id string } func (b0 IdentityProvidersDeleteRequest_builder) Build() *IdentityProvidersDeleteRequest { m0 := &IdentityProvidersDeleteRequest{} b, x := &b0, m0 _, _ = b, x - x.xxx_hidden_Name = b.Name + x.xxx_hidden_Id = b.Id return m0 } @@ -1032,6 +1061,108 @@ func (b0 IdentityProvidersUnassignResponse_builder) Build() *IdentityProvidersUn return m0 } +// Request to signal that an identity provider needs reconciliation. +type IdentityProvidersSignalRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Id string `protobuf:"bytes,1,opt,name=id,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProvidersSignalRequest) Reset() { + *x = IdentityProvidersSignalRequest{} + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProvidersSignalRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProvidersSignalRequest) ProtoMessage() {} + +func (x *IdentityProvidersSignalRequest) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[14] + 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 *IdentityProvidersSignalRequest) GetId() string { + if x != nil { + return x.xxx_hidden_Id + } + return "" +} + +func (x *IdentityProvidersSignalRequest) SetId(v string) { + x.xxx_hidden_Id = v +} + +type IdentityProvidersSignalRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Id string +} + +func (b0 IdentityProvidersSignalRequest_builder) Build() *IdentityProvidersSignalRequest { + m0 := &IdentityProvidersSignalRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Id = b.Id + return m0 +} + +// Response for signal operation. +type IdentityProvidersSignalResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IdentityProvidersSignalResponse) Reset() { + *x = IdentityProvidersSignalResponse{} + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IdentityProvidersSignalResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IdentityProvidersSignalResponse) ProtoMessage() {} + +func (x *IdentityProvidersSignalResponse) ProtoReflect() protoreflect.Message { + mi := &file_osac_private_v1_identity_providers_service_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +type IdentityProvidersSignalResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + +} + +func (b0 IdentityProvidersSignalResponse_builder) Build() *IdentityProvidersSignalResponse { + m0 := &IdentityProvidersSignalResponse{} + b, x := &b0, m0 + _, _ = b, x + return m0 +} + var File_osac_private_v1_identity_providers_service_proto protoreflect.FileDescriptor var file_osac_private_v1_identity_providers_service_proto_rawDesc = string([]byte{ @@ -1041,173 +1172,191 @@ var file_osac_private_v1_identity_providers_service_proto_rawDesc = string([]byt 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x2c, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x93, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x05, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 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, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x31, 0x0a, 0x1b, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, - 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, - 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x2c, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x93, 0x01, 0x0a, 0x1c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x19, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x06, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x09, 0x0a, 0x07, + 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x1d, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x2d, 0x0a, 0x1b, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5b, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, + 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x59, 0x0a, 0x1c, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5b, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x22, 0x6f, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x22, 0x34, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, - 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, - 0x0a, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x32, 0x91, 0x09, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, + 0x65, 0x63, 0x74, 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, - 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x04, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0xac, 0x01, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, + 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x6f, 0x63, 0x6b, + 0x22, 0x5c, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, - 0x9d, 0x01, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x2c, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x62, 0x06, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x29, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x30, + 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x1e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x21, 0x0a, 0x1f, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x0a, + 0x20, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x23, 0x0a, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x1e, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x21, 0x0a, + 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x32, 0x81, 0x0a, 0x0a, 0x11, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x2f, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0xa6, 0x01, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0x29, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x9e, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x04, 0x4c, 0x69, 0x73, + 0x74, 0x12, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 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, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x12, 0x22, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x9b, 0x01, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x2c, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 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, 0x73, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x62, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xab, 0x01, 0x0a, 0x06, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, + 0x3a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x2e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x69, 0x64, 0x7d, 0x12, 0x9c, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x2f, 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, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x2a, 0x29, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x2a, 0x27, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x06, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x12, 0x2f, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, - 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x61, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x12, 0xb0, 0x01, 0x0a, 0x08, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x12, 0x31, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, - 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x75, - 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, - 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, - 0x1d, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, - 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xa8, 0x01, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0x2f, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 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, 0x73, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, + 0x22, 0x30, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x12, 0xb0, 0x01, 0x0a, 0x08, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, + 0x31, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x32, 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, 0x73, 0x55, 0x6e, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, + 0x2a, 0x22, 0x32, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x75, 0x6e, 0x61, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x6d, 0x0a, 0x06, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, + 0x2f, 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, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x30, 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, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0xe2, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x1d, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 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_providers_service_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_osac_private_v1_identity_providers_service_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_osac_private_v1_identity_providers_service_proto_goTypes = []any{ (*IdentityProvidersListRequest)(nil), // 0: osac.private.v1.IdentityProvidersListRequest (*IdentityProvidersListResponse)(nil), // 1: osac.private.v1.IdentityProvidersListResponse @@ -1223,34 +1372,40 @@ var file_osac_private_v1_identity_providers_service_proto_goTypes = []any{ (*IdentityProvidersAssignResponse)(nil), // 11: osac.private.v1.IdentityProvidersAssignResponse (*IdentityProvidersUnassignRequest)(nil), // 12: osac.private.v1.IdentityProvidersUnassignRequest (*IdentityProvidersUnassignResponse)(nil), // 13: osac.private.v1.IdentityProvidersUnassignResponse - (*IdentityProvider)(nil), // 14: osac.private.v1.IdentityProvider + (*IdentityProvidersSignalRequest)(nil), // 14: osac.private.v1.IdentityProvidersSignalRequest + (*IdentityProvidersSignalResponse)(nil), // 15: osac.private.v1.IdentityProvidersSignalResponse + (*IdentityProvider)(nil), // 16: osac.private.v1.IdentityProvider + (*fieldmaskpb.FieldMask)(nil), // 17: google.protobuf.FieldMask } var file_osac_private_v1_identity_providers_service_proto_depIdxs = []int32{ - 14, // 0: osac.private.v1.IdentityProvidersListResponse.items:type_name -> osac.private.v1.IdentityProvider - 14, // 1: osac.private.v1.IdentityProvidersGetResponse.object:type_name -> osac.private.v1.IdentityProvider - 14, // 2: osac.private.v1.IdentityProvidersCreateRequest.object:type_name -> osac.private.v1.IdentityProvider - 14, // 3: osac.private.v1.IdentityProvidersCreateResponse.object:type_name -> osac.private.v1.IdentityProvider - 14, // 4: osac.private.v1.IdentityProvidersUpdateRequest.object:type_name -> osac.private.v1.IdentityProvider - 14, // 5: osac.private.v1.IdentityProvidersUpdateResponse.object:type_name -> osac.private.v1.IdentityProvider - 4, // 6: osac.private.v1.IdentityProviders.Create:input_type -> osac.private.v1.IdentityProvidersCreateRequest - 0, // 7: osac.private.v1.IdentityProviders.List:input_type -> osac.private.v1.IdentityProvidersListRequest - 2, // 8: osac.private.v1.IdentityProviders.Get:input_type -> osac.private.v1.IdentityProvidersGetRequest - 6, // 9: osac.private.v1.IdentityProviders.Update:input_type -> osac.private.v1.IdentityProvidersUpdateRequest - 8, // 10: osac.private.v1.IdentityProviders.Delete:input_type -> osac.private.v1.IdentityProvidersDeleteRequest - 10, // 11: osac.private.v1.IdentityProviders.Assign:input_type -> osac.private.v1.IdentityProvidersAssignRequest - 12, // 12: osac.private.v1.IdentityProviders.Unassign:input_type -> osac.private.v1.IdentityProvidersUnassignRequest - 5, // 13: osac.private.v1.IdentityProviders.Create:output_type -> osac.private.v1.IdentityProvidersCreateResponse - 1, // 14: osac.private.v1.IdentityProviders.List:output_type -> osac.private.v1.IdentityProvidersListResponse - 3, // 15: osac.private.v1.IdentityProviders.Get:output_type -> osac.private.v1.IdentityProvidersGetResponse - 7, // 16: osac.private.v1.IdentityProviders.Update:output_type -> osac.private.v1.IdentityProvidersUpdateResponse - 9, // 17: osac.private.v1.IdentityProviders.Delete:output_type -> osac.private.v1.IdentityProvidersDeleteResponse - 11, // 18: osac.private.v1.IdentityProviders.Assign:output_type -> osac.private.v1.IdentityProvidersAssignResponse - 13, // 19: osac.private.v1.IdentityProviders.Unassign:output_type -> osac.private.v1.IdentityProvidersUnassignResponse - 13, // [13:20] is the sub-list for method output_type - 6, // [6:13] 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 + 16, // 0: osac.private.v1.IdentityProvidersListResponse.items:type_name -> osac.private.v1.IdentityProvider + 16, // 1: osac.private.v1.IdentityProvidersGetResponse.object:type_name -> osac.private.v1.IdentityProvider + 16, // 2: osac.private.v1.IdentityProvidersCreateRequest.object:type_name -> osac.private.v1.IdentityProvider + 16, // 3: osac.private.v1.IdentityProvidersCreateResponse.object:type_name -> osac.private.v1.IdentityProvider + 16, // 4: osac.private.v1.IdentityProvidersUpdateRequest.object:type_name -> osac.private.v1.IdentityProvider + 17, // 5: osac.private.v1.IdentityProvidersUpdateRequest.update_mask:type_name -> google.protobuf.FieldMask + 16, // 6: osac.private.v1.IdentityProvidersUpdateResponse.object:type_name -> osac.private.v1.IdentityProvider + 4, // 7: osac.private.v1.IdentityProviders.Create:input_type -> osac.private.v1.IdentityProvidersCreateRequest + 0, // 8: osac.private.v1.IdentityProviders.List:input_type -> osac.private.v1.IdentityProvidersListRequest + 2, // 9: osac.private.v1.IdentityProviders.Get:input_type -> osac.private.v1.IdentityProvidersGetRequest + 6, // 10: osac.private.v1.IdentityProviders.Update:input_type -> osac.private.v1.IdentityProvidersUpdateRequest + 8, // 11: osac.private.v1.IdentityProviders.Delete:input_type -> osac.private.v1.IdentityProvidersDeleteRequest + 10, // 12: osac.private.v1.IdentityProviders.Assign:input_type -> osac.private.v1.IdentityProvidersAssignRequest + 12, // 13: osac.private.v1.IdentityProviders.Unassign:input_type -> osac.private.v1.IdentityProvidersUnassignRequest + 14, // 14: osac.private.v1.IdentityProviders.Signal:input_type -> osac.private.v1.IdentityProvidersSignalRequest + 5, // 15: osac.private.v1.IdentityProviders.Create:output_type -> osac.private.v1.IdentityProvidersCreateResponse + 1, // 16: osac.private.v1.IdentityProviders.List:output_type -> osac.private.v1.IdentityProvidersListResponse + 3, // 17: osac.private.v1.IdentityProviders.Get:output_type -> osac.private.v1.IdentityProvidersGetResponse + 7, // 18: osac.private.v1.IdentityProviders.Update:output_type -> osac.private.v1.IdentityProvidersUpdateResponse + 9, // 19: osac.private.v1.IdentityProviders.Delete:output_type -> osac.private.v1.IdentityProvidersDeleteResponse + 11, // 20: osac.private.v1.IdentityProviders.Assign:output_type -> osac.private.v1.IdentityProvidersAssignResponse + 13, // 21: osac.private.v1.IdentityProviders.Unassign:output_type -> osac.private.v1.IdentityProvidersUnassignResponse + 15, // 22: osac.private.v1.IdentityProviders.Signal:output_type -> osac.private.v1.IdentityProvidersSignalResponse + 15, // [15:23] is the sub-list for method output_type + 7, // [7:15] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_osac_private_v1_identity_providers_service_proto_init() } @@ -1266,7 +1421,7 @@ func file_osac_private_v1_identity_providers_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_identity_providers_service_proto_rawDesc), len(file_osac_private_v1_identity_providers_service_proto_rawDesc)), NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/api/osac/private/v1/ip_family_type.pb.go b/internal/api/osac/private/v1/ip_family_type.pb.go new file mode 100644 index 00000000..b728e876 --- /dev/null +++ b/internal/api/osac/private/v1/ip_family_type.pb.go @@ -0,0 +1,148 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/ip_family_type.proto + +//go:build !protoopaque + +package privatev1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// IP address family for IP pools. +type IPFamily int32 + +const ( + // IP family is unknown or has not been specified. + IPFamily_IP_FAMILY_UNSPECIFIED IPFamily = 0 + // IPv4 address family. CIDRs must be valid IPv4 CIDR notation. + IPFamily_IP_FAMILY_IPV4 IPFamily = 1 + // IPv6 address family. CIDRs must be valid IPv6 CIDR notation. + IPFamily_IP_FAMILY_IPV6 IPFamily = 2 +) + +// Enum value maps for IPFamily. +var ( + IPFamily_name = map[int32]string{ + 0: "IP_FAMILY_UNSPECIFIED", + 1: "IP_FAMILY_IPV4", + 2: "IP_FAMILY_IPV6", + } + IPFamily_value = map[string]int32{ + "IP_FAMILY_UNSPECIFIED": 0, + "IP_FAMILY_IPV4": 1, + "IP_FAMILY_IPV6": 2, + } +) + +func (x IPFamily) Enum() *IPFamily { + p := new(IPFamily) + *p = x + return p +} + +func (x IPFamily) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IPFamily) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_ip_family_type_proto_enumTypes[0].Descriptor() +} + +func (IPFamily) Type() protoreflect.EnumType { + return &file_osac_private_v1_ip_family_type_proto_enumTypes[0] +} + +func (x IPFamily) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +var File_osac_private_v1_ip_family_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_ip_family_type_proto_rawDesc = string([]byte{ + 0x0a, 0x24, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2a, 0x4d, 0x0a, 0x08, 0x49, 0x50, 0x46, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x34, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, + 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x42, 0xd6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x11, + 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, + 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_ip_family_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_ip_family_type_proto_goTypes = []any{ + (IPFamily)(0), // 0: osac.private.v1.IPFamily +} +var file_osac_private_v1_ip_family_type_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_ip_family_type_proto_init() } +func file_osac_private_v1_ip_family_type_proto_init() { + if File_osac_private_v1_ip_family_type_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_ip_family_type_proto_rawDesc), len(file_osac_private_v1_ip_family_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 0, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_ip_family_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_ip_family_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_ip_family_type_proto_enumTypes, + }.Build() + File_osac_private_v1_ip_family_type_proto = out.File + file_osac_private_v1_ip_family_type_proto_goTypes = nil + file_osac_private_v1_ip_family_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/ip_family_type_protoopaque.pb.go b/internal/api/osac/private/v1/ip_family_type_protoopaque.pb.go new file mode 100644 index 00000000..3488e720 --- /dev/null +++ b/internal/api/osac/private/v1/ip_family_type_protoopaque.pb.go @@ -0,0 +1,148 @@ +// +// 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. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.5 +// protoc (unknown) +// source: osac/private/v1/ip_family_type.proto + +//go:build protoopaque + +package privatev1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// IP address family for IP pools. +type IPFamily int32 + +const ( + // IP family is unknown or has not been specified. + IPFamily_IP_FAMILY_UNSPECIFIED IPFamily = 0 + // IPv4 address family. CIDRs must be valid IPv4 CIDR notation. + IPFamily_IP_FAMILY_IPV4 IPFamily = 1 + // IPv6 address family. CIDRs must be valid IPv6 CIDR notation. + IPFamily_IP_FAMILY_IPV6 IPFamily = 2 +) + +// Enum value maps for IPFamily. +var ( + IPFamily_name = map[int32]string{ + 0: "IP_FAMILY_UNSPECIFIED", + 1: "IP_FAMILY_IPV4", + 2: "IP_FAMILY_IPV6", + } + IPFamily_value = map[string]int32{ + "IP_FAMILY_UNSPECIFIED": 0, + "IP_FAMILY_IPV4": 1, + "IP_FAMILY_IPV6": 2, + } +) + +func (x IPFamily) Enum() *IPFamily { + p := new(IPFamily) + *p = x + return p +} + +func (x IPFamily) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (IPFamily) Descriptor() protoreflect.EnumDescriptor { + return file_osac_private_v1_ip_family_type_proto_enumTypes[0].Descriptor() +} + +func (IPFamily) Type() protoreflect.EnumType { + return &file_osac_private_v1_ip_family_type_proto_enumTypes[0] +} + +func (x IPFamily) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +var File_osac_private_v1_ip_family_type_proto protoreflect.FileDescriptor + +var file_osac_private_v1_ip_family_type_proto_rawDesc = string([]byte{ + 0x0a, 0x24, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2a, 0x4d, 0x0a, 0x08, 0x49, 0x50, 0x46, 0x61, 0x6d, + 0x69, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x15, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x34, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, + 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x42, 0xd6, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x11, + 0x49, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, + 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_ip_family_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_osac_private_v1_ip_family_type_proto_goTypes = []any{ + (IPFamily)(0), // 0: osac.private.v1.IPFamily +} +var file_osac_private_v1_ip_family_type_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_osac_private_v1_ip_family_type_proto_init() } +func file_osac_private_v1_ip_family_type_proto_init() { + if File_osac_private_v1_ip_family_type_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_ip_family_type_proto_rawDesc), len(file_osac_private_v1_ip_family_type_proto_rawDesc)), + NumEnums: 1, + NumMessages: 0, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_osac_private_v1_ip_family_type_proto_goTypes, + DependencyIndexes: file_osac_private_v1_ip_family_type_proto_depIdxs, + EnumInfos: file_osac_private_v1_ip_family_type_proto_enumTypes, + }.Build() + File_osac_private_v1_ip_family_type_proto = out.File + file_osac_private_v1_ip_family_type_proto_goTypes = nil + file_osac_private_v1_ip_family_type_proto_depIdxs = nil +} diff --git a/internal/api/osac/private/v1/public_ip_pool_type.pb.go b/internal/api/osac/private/v1/public_ip_pool_type.pb.go index eeb14a27..52c4866c 100644 --- a/internal/api/osac/private/v1/public_ip_pool_type.pb.go +++ b/internal/api/osac/private/v1/public_ip_pool_type.pb.go @@ -36,54 +36,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// IP address family for a PublicIPPool. -type IPFamily int32 - -const ( - // IP family is unknown or has not been specified. - IPFamily_IP_FAMILY_UNSPECIFIED IPFamily = 0 - // IPv4 address family. CIDRs must be valid IPv4 CIDR notation. - IPFamily_IP_FAMILY_IPV4 IPFamily = 1 - // IPv6 address family. CIDRs must be valid IPv6 CIDR notation. - IPFamily_IP_FAMILY_IPV6 IPFamily = 2 -) - -// Enum value maps for IPFamily. -var ( - IPFamily_name = map[int32]string{ - 0: "IP_FAMILY_UNSPECIFIED", - 1: "IP_FAMILY_IPV4", - 2: "IP_FAMILY_IPV6", - } - IPFamily_value = map[string]int32{ - "IP_FAMILY_UNSPECIFIED": 0, - "IP_FAMILY_IPV4": 1, - "IP_FAMILY_IPV6": 2, - } -) - -func (x IPFamily) Enum() *IPFamily { - p := new(IPFamily) - *p = x - return p -} - -func (x IPFamily) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (IPFamily) Descriptor() protoreflect.EnumDescriptor { - return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0].Descriptor() -} - -func (IPFamily) Type() protoreflect.EnumType { - return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0] -} - -func (x IPFamily) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - // Lifecycle states for PublicIPPool resources. // // State transitions typically follow: UNSPECIFIED -> PENDING -> READY, with FAILED as a terminal @@ -158,11 +110,11 @@ func (x PublicIPPoolState) String() string { } func (PublicIPPoolState) Descriptor() protoreflect.EnumDescriptor { - return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[1].Descriptor() + return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0].Descriptor() } func (PublicIPPoolState) Type() protoreflect.EnumType { - return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[1] + return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0] } func (x PublicIPPoolState) Number() protoreflect.EnumNumber { @@ -625,101 +577,99 @@ var file_osac_private_v1_public_ip_pool_type_proto_rawDesc = string([]byte{ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, - 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, - 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb1, - 0x01, 0x0a, 0x10, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, - 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, - 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, - 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, - 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x21, - 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2a, 0x4d, 0x0a, 0x08, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x15, - 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, - 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x34, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, - 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x2a, - 0xe7, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, - 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x50, - 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, - 0x1a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, - 0x1b, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, - 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, - 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0xda, 0x01, 0x0a, 0x13, 0x63, 0x6f, - 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x42, 0x15, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 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, + 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x6f, + 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x35, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x10, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, + 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, + 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, + 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, + 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xe7, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x20, + 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, + 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, + 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x55, 0x42, 0x4c, + 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x42, 0xda, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x15, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x49, 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_public_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_public_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_osac_private_v1_public_ip_pool_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_osac_private_v1_public_ip_pool_type_proto_goTypes = []any{ - (IPFamily)(0), // 0: osac.private.v1.IPFamily - (PublicIPPoolState)(0), // 1: osac.private.v1.PublicIPPoolState - (*PublicIPPool)(nil), // 2: osac.private.v1.PublicIPPool - (*PublicIPPoolSpec)(nil), // 3: osac.private.v1.PublicIPPoolSpec - (*PublicIPPoolStatus)(nil), // 4: osac.private.v1.PublicIPPoolStatus - (*Metadata)(nil), // 5: osac.private.v1.Metadata + (PublicIPPoolState)(0), // 0: osac.private.v1.PublicIPPoolState + (*PublicIPPool)(nil), // 1: osac.private.v1.PublicIPPool + (*PublicIPPoolSpec)(nil), // 2: osac.private.v1.PublicIPPoolSpec + (*PublicIPPoolStatus)(nil), // 3: osac.private.v1.PublicIPPoolStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata + (IPFamily)(0), // 5: osac.private.v1.IPFamily } var file_osac_private_v1_public_ip_pool_type_proto_depIdxs = []int32{ - 5, // 0: osac.private.v1.PublicIPPool.metadata:type_name -> osac.private.v1.Metadata - 3, // 1: osac.private.v1.PublicIPPool.spec:type_name -> osac.private.v1.PublicIPPoolSpec - 4, // 2: osac.private.v1.PublicIPPool.status:type_name -> osac.private.v1.PublicIPPoolStatus - 0, // 3: osac.private.v1.PublicIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily - 1, // 4: osac.private.v1.PublicIPPoolStatus.state:type_name -> osac.private.v1.PublicIPPoolState + 4, // 0: osac.private.v1.PublicIPPool.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.PublicIPPool.spec:type_name -> osac.private.v1.PublicIPPoolSpec + 3, // 2: osac.private.v1.PublicIPPool.status:type_name -> osac.private.v1.PublicIPPoolStatus + 5, // 3: osac.private.v1.PublicIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily + 0, // 4: osac.private.v1.PublicIPPoolStatus.state:type_name -> osac.private.v1.PublicIPPoolState 5, // [5:5] is the sub-list for method output_type 5, // [5:5] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name @@ -732,6 +682,7 @@ func file_osac_private_v1_public_ip_pool_type_proto_init() { if File_osac_private_v1_public_ip_pool_type_proto != nil { return } + file_osac_private_v1_ip_family_type_proto_init() file_osac_private_v1_metadata_type_proto_init() file_osac_private_v1_public_ip_pool_type_proto_msgTypes[2].OneofWrappers = []any{} type x struct{} @@ -739,7 +690,7 @@ func file_osac_private_v1_public_ip_pool_type_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_public_ip_pool_type_proto_rawDesc), len(file_osac_private_v1_public_ip_pool_type_proto_rawDesc)), - NumEnums: 2, + NumEnums: 1, NumMessages: 3, NumExtensions: 0, NumServices: 0, diff --git a/internal/api/osac/private/v1/public_ip_pool_type_protoopaque.pb.go b/internal/api/osac/private/v1/public_ip_pool_type_protoopaque.pb.go index f65a8648..5acf7627 100644 --- a/internal/api/osac/private/v1/public_ip_pool_type_protoopaque.pb.go +++ b/internal/api/osac/private/v1/public_ip_pool_type_protoopaque.pb.go @@ -36,54 +36,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// IP address family for a PublicIPPool. -type IPFamily int32 - -const ( - // IP family is unknown or has not been specified. - IPFamily_IP_FAMILY_UNSPECIFIED IPFamily = 0 - // IPv4 address family. CIDRs must be valid IPv4 CIDR notation. - IPFamily_IP_FAMILY_IPV4 IPFamily = 1 - // IPv6 address family. CIDRs must be valid IPv6 CIDR notation. - IPFamily_IP_FAMILY_IPV6 IPFamily = 2 -) - -// Enum value maps for IPFamily. -var ( - IPFamily_name = map[int32]string{ - 0: "IP_FAMILY_UNSPECIFIED", - 1: "IP_FAMILY_IPV4", - 2: "IP_FAMILY_IPV6", - } - IPFamily_value = map[string]int32{ - "IP_FAMILY_UNSPECIFIED": 0, - "IP_FAMILY_IPV4": 1, - "IP_FAMILY_IPV6": 2, - } -) - -func (x IPFamily) Enum() *IPFamily { - p := new(IPFamily) - *p = x - return p -} - -func (x IPFamily) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (IPFamily) Descriptor() protoreflect.EnumDescriptor { - return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0].Descriptor() -} - -func (IPFamily) Type() protoreflect.EnumType { - return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0] -} - -func (x IPFamily) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - // Lifecycle states for PublicIPPool resources. // // State transitions typically follow: UNSPECIFIED -> PENDING -> READY, with FAILED as a terminal @@ -158,11 +110,11 @@ func (x PublicIPPoolState) String() string { } func (PublicIPPoolState) Descriptor() protoreflect.EnumDescriptor { - return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[1].Descriptor() + return file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0].Descriptor() } func (PublicIPPoolState) Type() protoreflect.EnumType { - return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[1] + return &file_osac_private_v1_public_ip_pool_type_proto_enumTypes[0] } func (x PublicIPPoolState) Number() protoreflect.EnumNumber { @@ -598,101 +550,99 @@ var file_osac_private_v1_public_ip_pool_type_proto_rawDesc = string([]byte{ 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, - 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, - 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, - 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x35, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, - 0x63, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb1, - 0x01, 0x0a, 0x10, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, - 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, - 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, - 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, - 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, - 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, - 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, - 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, - 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x21, - 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2a, 0x4d, 0x0a, 0x08, 0x49, 0x50, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x19, 0x0a, 0x15, - 0x49, 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x50, 0x5f, 0x46, 0x41, - 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x34, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x49, - 0x50, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x50, 0x56, 0x36, 0x10, 0x02, 0x2a, - 0xe7, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, - 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x50, - 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, - 0x1a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, - 0x1b, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, - 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, - 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x42, 0xda, 0x01, 0x0a, 0x13, 0x63, 0x6f, - 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x42, 0x15, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x54, - 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 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, + 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x6f, + 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x70, 0x5f, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x6f, 0x73, 0x61, 0x63, 0x2f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x73, + 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x35, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x10, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, + 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1c, 0x0a, 0x05, 0x63, 0x69, 0x64, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, + 0x52, 0x05, 0x63, 0x69, 0x64, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x09, 0x69, 0x70, 0x5f, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, 0x61, + 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x50, 0x46, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x08, 0x69, + 0x70, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, 0x05, + 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xfb, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x68, 0x75, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x03, 0xe0, 0x41, 0x03, 0x52, 0x03, 0x68, 0x75, 0x62, 0x12, 0x19, 0x0a, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x09, 0x61, 0x6c, + 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, + 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0xe7, 0x01, 0x0a, 0x11, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x49, 0x50, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x20, + 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, + 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x49, + 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, + 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x55, 0x42, 0x4c, + 0x49, 0x43, 0x5f, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x4f, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x05, + 0x42, 0xda, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x15, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x49, 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_public_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_osac_private_v1_public_ip_pool_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_osac_private_v1_public_ip_pool_type_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_osac_private_v1_public_ip_pool_type_proto_goTypes = []any{ - (IPFamily)(0), // 0: osac.private.v1.IPFamily - (PublicIPPoolState)(0), // 1: osac.private.v1.PublicIPPoolState - (*PublicIPPool)(nil), // 2: osac.private.v1.PublicIPPool - (*PublicIPPoolSpec)(nil), // 3: osac.private.v1.PublicIPPoolSpec - (*PublicIPPoolStatus)(nil), // 4: osac.private.v1.PublicIPPoolStatus - (*Metadata)(nil), // 5: osac.private.v1.Metadata + (PublicIPPoolState)(0), // 0: osac.private.v1.PublicIPPoolState + (*PublicIPPool)(nil), // 1: osac.private.v1.PublicIPPool + (*PublicIPPoolSpec)(nil), // 2: osac.private.v1.PublicIPPoolSpec + (*PublicIPPoolStatus)(nil), // 3: osac.private.v1.PublicIPPoolStatus + (*Metadata)(nil), // 4: osac.private.v1.Metadata + (IPFamily)(0), // 5: osac.private.v1.IPFamily } var file_osac_private_v1_public_ip_pool_type_proto_depIdxs = []int32{ - 5, // 0: osac.private.v1.PublicIPPool.metadata:type_name -> osac.private.v1.Metadata - 3, // 1: osac.private.v1.PublicIPPool.spec:type_name -> osac.private.v1.PublicIPPoolSpec - 4, // 2: osac.private.v1.PublicIPPool.status:type_name -> osac.private.v1.PublicIPPoolStatus - 0, // 3: osac.private.v1.PublicIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily - 1, // 4: osac.private.v1.PublicIPPoolStatus.state:type_name -> osac.private.v1.PublicIPPoolState + 4, // 0: osac.private.v1.PublicIPPool.metadata:type_name -> osac.private.v1.Metadata + 2, // 1: osac.private.v1.PublicIPPool.spec:type_name -> osac.private.v1.PublicIPPoolSpec + 3, // 2: osac.private.v1.PublicIPPool.status:type_name -> osac.private.v1.PublicIPPoolStatus + 5, // 3: osac.private.v1.PublicIPPoolSpec.ip_family:type_name -> osac.private.v1.IPFamily + 0, // 4: osac.private.v1.PublicIPPoolStatus.state:type_name -> osac.private.v1.PublicIPPoolState 5, // [5:5] is the sub-list for method output_type 5, // [5:5] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name @@ -705,6 +655,7 @@ func file_osac_private_v1_public_ip_pool_type_proto_init() { if File_osac_private_v1_public_ip_pool_type_proto != nil { return } + file_osac_private_v1_ip_family_type_proto_init() file_osac_private_v1_metadata_type_proto_init() file_osac_private_v1_public_ip_pool_type_proto_msgTypes[2].OneofWrappers = []any{} type x struct{} @@ -712,7 +663,7 @@ func file_osac_private_v1_public_ip_pool_type_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_osac_private_v1_public_ip_pool_type_proto_rawDesc), len(file_osac_private_v1_public_ip_pool_type_proto_rawDesc)), - NumEnums: 2, + NumEnums: 1, NumMessages: 3, NumExtensions: 0, NumServices: 0, diff --git a/internal/api/osac/private/v1/security_group_type.pb.go b/internal/api/osac/private/v1/security_group_type.pb.go index 9a63ab6b..a5b45496 100644 --- a/internal/api/osac/private/v1/security_group_type.pb.go +++ b/internal/api/osac/private/v1/security_group_type.pb.go @@ -398,9 +398,15 @@ type SecurityGroupSpec struct { // match, traffic is denied by default. // // Example: Allow all outbound traffic, or restrict to specific destinations - Egress []*SecurityRule `protobuf:"bytes,3,rep,name=egress,proto3" json:"egress,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Egress []*SecurityRule `protobuf:"bytes,3,rep,name=egress,proto3" json:"egress,omitempty"` + // Implementation strategy that determines the backend used to enforce security rules. + // Set by the system at creation time. Immutable after creation. + // + // Known values: + // - "network_policy": standard Kubernetes NetworkPolicy (current default) + ImplementationStrategy string `protobuf:"bytes,4,opt,name=implementation_strategy,json=implementationStrategy,proto3" json:"implementation_strategy,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SecurityGroupSpec) Reset() { @@ -449,6 +455,13 @@ func (x *SecurityGroupSpec) GetEgress() []*SecurityRule { return nil } +func (x *SecurityGroupSpec) GetImplementationStrategy() string { + if x != nil { + return x.ImplementationStrategy + } + return "" +} + func (x *SecurityGroupSpec) SetVirtualNetwork(v string) { x.VirtualNetwork = v } @@ -461,6 +474,10 @@ func (x *SecurityGroupSpec) SetEgress(v []*SecurityRule) { x.Egress = v } +func (x *SecurityGroupSpec) SetImplementationStrategy(v string) { + x.ImplementationStrategy = v +} + type SecurityGroupSpec_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -486,6 +503,12 @@ type SecurityGroupSpec_builder struct { // // Example: Allow all outbound traffic, or restrict to specific destinations Egress []*SecurityRule + // Implementation strategy that determines the backend used to enforce security rules. + // Set by the system at creation time. Immutable after creation. + // + // Known values: + // - "network_policy": standard Kubernetes NetworkPolicy (current default) + ImplementationStrategy string } func (b0 SecurityGroupSpec_builder) Build() *SecurityGroupSpec { @@ -495,6 +518,7 @@ func (b0 SecurityGroupSpec_builder) Build() *SecurityGroupSpec { x.VirtualNetwork = b.VirtualNetwork x.Ingress = b.Ingress x.Egress = b.Egress + x.ImplementationStrategy = b.ImplementationStrategy return m0 } @@ -863,7 +887,7 @@ var file_osac_private_v1_security_group_type_proto_rawDesc = string([]byte{ 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, + 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, @@ -874,67 +898,71 @@ var file_osac_private_v1_security_group_type_proto_rawDesc = string([]byte{ 0x73, 0x12, 0x35, 0x0a, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xff, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x88, - 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x6f, 0x88, 0x01, 0x01, - 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x43, 0x69, 0x64, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, 0x43, 0x69, 0x64, - 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, - 0x6f, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, 0x7b, 0x0a, 0x13, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, - 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, - 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49, 0x43, - 0x4d, 0x50, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, - 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x2a, 0xe8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, - 0x20, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, - 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, - 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, - 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, - 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x43, - 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, - 0x05, 0x42, 0xdb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x16, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, - 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x52, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, + 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xff, 0x01, 0x0a, 0x0c, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x72, 0x6f, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x6f, 0x88, 0x01, + 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x43, 0x69, 0x64, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, 0x43, 0x69, + 0x64, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, 0x7b, 0x0a, 0x13, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, + 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, + 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49, + 0x43, 0x4d, 0x50, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, + 0x4c, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x2a, 0xe8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, + 0x0a, 0x20, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, + 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, + 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, + 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x43, 0x55, 0x52, + 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, + 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, + 0x10, 0x05, 0x42, 0xdb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x16, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_security_group_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) diff --git a/internal/api/osac/private/v1/security_group_type_protoopaque.pb.go b/internal/api/osac/private/v1/security_group_type_protoopaque.pb.go index c913119c..82657473 100644 --- a/internal/api/osac/private/v1/security_group_type_protoopaque.pb.go +++ b/internal/api/osac/private/v1/security_group_type_protoopaque.pb.go @@ -368,12 +368,13 @@ func (b0 SecurityGroup_builder) Build() *SecurityGroup { // in order, and the first matching rule determines whether traffic is allowed. If no rules match, traffic // is denied by default. type SecurityGroupSpec struct { - state protoimpl.MessageState `protogen:"opaque.v1"` - xxx_hidden_VirtualNetwork string `protobuf:"bytes,1,opt,name=virtual_network,json=virtualNetwork,proto3"` - xxx_hidden_Ingress *[]*SecurityRule `protobuf:"bytes,2,rep,name=ingress,proto3"` - xxx_hidden_Egress *[]*SecurityRule `protobuf:"bytes,3,rep,name=egress,proto3"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_VirtualNetwork string `protobuf:"bytes,1,opt,name=virtual_network,json=virtualNetwork,proto3"` + xxx_hidden_Ingress *[]*SecurityRule `protobuf:"bytes,2,rep,name=ingress,proto3"` + xxx_hidden_Egress *[]*SecurityRule `protobuf:"bytes,3,rep,name=egress,proto3"` + xxx_hidden_ImplementationStrategy string `protobuf:"bytes,4,opt,name=implementation_strategy,json=implementationStrategy,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SecurityGroupSpec) Reset() { @@ -426,6 +427,13 @@ func (x *SecurityGroupSpec) GetEgress() []*SecurityRule { return nil } +func (x *SecurityGroupSpec) GetImplementationStrategy() string { + if x != nil { + return x.xxx_hidden_ImplementationStrategy + } + return "" +} + func (x *SecurityGroupSpec) SetVirtualNetwork(v string) { x.xxx_hidden_VirtualNetwork = v } @@ -438,6 +446,10 @@ func (x *SecurityGroupSpec) SetEgress(v []*SecurityRule) { x.xxx_hidden_Egress = &v } +func (x *SecurityGroupSpec) SetImplementationStrategy(v string) { + x.xxx_hidden_ImplementationStrategy = v +} + type SecurityGroupSpec_builder struct { _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. @@ -463,6 +475,12 @@ type SecurityGroupSpec_builder struct { // // Example: Allow all outbound traffic, or restrict to specific destinations Egress []*SecurityRule + // Implementation strategy that determines the backend used to enforce security rules. + // Set by the system at creation time. Immutable after creation. + // + // Known values: + // - "network_policy": standard Kubernetes NetworkPolicy (current default) + ImplementationStrategy string } func (b0 SecurityGroupSpec_builder) Build() *SecurityGroupSpec { @@ -472,6 +490,7 @@ func (b0 SecurityGroupSpec_builder) Build() *SecurityGroupSpec { x.xxx_hidden_VirtualNetwork = b.VirtualNetwork x.xxx_hidden_Ingress = &b.Ingress x.xxx_hidden_Egress = &b.Egress + x.xxx_hidden_ImplementationStrategy = b.ImplementationStrategy return m0 } @@ -835,7 +854,7 @@ var file_osac_private_v1_security_group_type_proto_rawDesc = string([]byte{ 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0xb4, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, + 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x11, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2f, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x02, 0xe0, 0x41, 0x05, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, @@ -846,67 +865,71 @@ var file_osac_private_v1_security_group_type_proto_rawDesc = string([]byte{ 0x73, 0x12, 0x35, 0x0a, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0xff, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x73, - 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x88, - 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x6f, 0x88, 0x01, 0x01, - 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x43, 0x69, 0x64, 0x72, 0x88, - 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, 0x43, 0x69, 0x64, - 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, - 0x6f, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, 0x7b, 0x0a, 0x13, 0x53, 0x65, - 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, - 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, 0x10, - 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49, 0x43, - 0x4d, 0x50, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, - 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x2a, 0xe8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, - 0x20, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, - 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, 0x44, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, - 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x45, - 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, - 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, - 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, - 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, 0x43, - 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, - 0x05, 0x42, 0xdb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x16, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, 0x61, - 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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, + 0x52, 0x06, 0x65, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3f, 0x0a, 0x17, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x06, 0xe0, 0x41, 0x03, 0xe0, 0x41, + 0x05, 0x52, 0x16, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xff, 0x01, 0x0a, 0x0c, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, + 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x20, 0x0a, 0x09, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x72, 0x6f, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x06, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x6f, 0x88, 0x01, + 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, 0x69, 0x70, 0x76, 0x34, 0x43, 0x69, 0x64, 0x72, + 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x08, 0x69, 0x70, 0x76, 0x36, 0x43, 0x69, + 0x64, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x6f, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x34, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x69, 0x70, 0x76, 0x36, 0x5f, 0x63, 0x69, 0x64, 0x72, 0x22, 0x7b, 0x0a, 0x13, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x23, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x6d, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, + 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x54, 0x43, 0x50, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x55, 0x44, 0x50, + 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, 0x4c, 0x5f, 0x49, + 0x43, 0x4d, 0x50, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x4f, 0x54, 0x4f, 0x43, 0x4f, + 0x4c, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x04, 0x2a, 0xe8, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x24, + 0x0a, 0x20, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, + 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, + 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, + 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x45, 0x43, 0x55, 0x52, + 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x26, 0x0a, 0x22, 0x53, 0x45, + 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, + 0x10, 0x05, 0x42, 0xdb, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x73, 0x61, 0x63, 0x2e, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x16, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x6f, 0x73, 0x61, 0x63, 0x2d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x6f, 0x73, + 0x61, 0x63, 0x2d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 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_security_group_type_proto_enumTypes = make([]protoimpl.EnumInfo, 2) diff --git a/internal/controller/constants_common.go b/internal/controller/constants_common.go index 345fd92c..95ea7e26 100644 --- a/internal/controller/constants_common.go +++ b/internal/controller/constants_common.go @@ -38,10 +38,18 @@ const ( // set on PublicIP CRs osacPublicIPPoolNameAnnotation = osacPrefix + "/publicippool-name" + // osacExternalIPPoolNameAnnotation is the K8s resource name of the parent ExternalIPPool. + // set on ExternalIP CRs + osacExternalIPPoolNameAnnotation = osacPrefix + "/externalippool-name" + // defaultPublicIPPoolImplementationStrategy is the fallback strategy when none is specified. // Used by PublicIPPool (from its own spec) and PublicIP (inherited from parent pool). defaultPublicIPPoolImplementationStrategy = "metallb-l2" + // defaultExternalIPPoolImplementationStrategy is the fallback strategy when none is specified. + // Used by ExternalIPPool (from its own spec) and ExternalIP (inherited from parent pool). + defaultExternalIPPoolImplementationStrategy = "metallb-l2" + // defaultSecurityGroupImplementationStrategy is the implementation strategy for SecurityGroup. // SecurityGroup enforcement uses standard Kubernetes NetworkPolicy, independent of the // VirtualNetwork's NetworkClass. diff --git a/internal/controller/externalip_controller.go b/internal/controller/externalip_controller.go new file mode 100644 index 00000000..f9eb0ae4 --- /dev/null +++ b/internal/controller/externalip_controller.go @@ -0,0 +1,411 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "fmt" + "time" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/events" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + controllerutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + mc "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +const ( + osacExternalIPFinalizer = "osac.openshift.io/externalip-finalizer" +) + +// ExternalIPReconciler reconciles ExternalIP CRs created by the fulfillment-service. +// +// Each ExternalIP belongs to a parent ExternalIPPool (referenced by UUID in spec.pool). +// The controller adds a finalizer, inherits the implementation strategy from the +// parent pool, then delegates to the shared provisioning lifecycle to trigger AAP +// jobs for allocation and deallocation. +// +// Attach/detach is handled by the ExternalIPAttachment controller. +// +// Phase transitions: "" -> Progressing -> Ready/Failed; on delete: Deleting. +type ExternalIPReconciler struct { + client.Client + APIReader client.Reader + Scheme *runtime.Scheme + Recorder events.EventRecorder + mgr mcmanager.Manager + NetworkingNamespace string + ProvisioningProvider provisioning.ProvisioningProvider + StatusPollInterval time.Duration + MaxJobHistory int + targetCluster mc.ClusterName +} + +// NewExternalIPReconciler creates a new reconciler for ExternalIP resources. +func NewExternalIPReconciler( + mgr mcmanager.Manager, + networkingNamespace string, + provisioningProvider provisioning.ProvisioningProvider, + statusPollInterval time.Duration, + maxJobHistory int, + targetCluster mc.ClusterName, +) *ExternalIPReconciler { + if mgr == nil { + panic("mgr must not be nil") + } + if statusPollInterval <= 0 { + statusPollInterval = provisioning.DefaultStatusPollInterval + } + if maxJobHistory <= 0 { + maxJobHistory = provisioning.DefaultMaxJobHistory + } + return &ExternalIPReconciler{ + Client: mgr.GetLocalManager().GetClient(), + APIReader: mgr.GetLocalManager().GetAPIReader(), + Scheme: mgr.GetLocalManager().GetScheme(), + Recorder: mgr.GetLocalManager().GetEventRecorder(externalipControllerName), + mgr: mgr, + NetworkingNamespace: networkingNamespace, + ProvisioningProvider: provisioningProvider, + StatusPollInterval: statusPollInterval, + MaxJobHistory: maxJobHistory, + targetCluster: targetCluster, + } +} + +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalips,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalips/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalips/finalizers,verbs=update +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalippools,verbs=get;list;watch +// +kubebuilder:rbac:groups=events.k8s.io,resources=events,verbs=create;patch +// +kubebuilder:rbac:groups="",resources=services,verbs=get + +// Reconcile handles create/update/delete for a ExternalIP CR. +// On create/update it ensures a finalizer, resolves the parent pool, and runs provisioning. +// On delete it triggers deprovisioning and removes the finalizer when complete. +func (r *ExternalIPReconciler) Reconcile(ctx context.Context, req mcreconcile.Request) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + publicIP := &v1alpha1.ExternalIP{} + err := r.Get(ctx, req.NamespacedName, publicIP) + if err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + // Skip unmanaged resources, but still allow deletion to proceed + val, exists := publicIP.Annotations[osacManagementStateAnnotation] + if publicIP.ObjectMeta.DeletionTimestamp.IsZero() && exists && val == ManagementStateUnmanaged { + log.Info("ignoring ExternalIP due to management-state annotation", "management-state", val) + return ctrl.Result{}, nil + } + + log.Info("start reconcile", "pool", publicIP.Spec.Pool, "phase", publicIP.Status.Phase) + + oldstatus := publicIP.Status.DeepCopy() + + var res ctrl.Result + if publicIP.ObjectMeta.DeletionTimestamp.IsZero() { + res, err = r.handleUpdate(ctx, publicIP) + } else { + res, err = r.handleDelete(ctx, publicIP) + } + + if !equality.Semantic.DeepEqual(publicIP.Status, *oldstatus) { + log.Info("status requires update", "phase", publicIP.Status.Phase) + if updateErr := r.Status().Update(ctx, publicIP); updateErr != nil { + log.Error(updateErr, "failed to update status") + return res, updateErr + } + } + + log.Info("end reconcile", "phase", publicIP.Status.Phase) + return res, err +} + +// handleUpdate processes a non-deleted ExternalIP: adds finalizer, resolves the parent +// ExternalIPPool, inherits the implementation strategy, and runs provisioning. +func (r *ExternalIPReconciler) handleUpdate(ctx context.Context, publicIP *v1alpha1.ExternalIP) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + // Add finalizer if not present + if controllerutil.AddFinalizer(publicIP, osacExternalIPFinalizer) { + log.Info("adding finalizer") + if err := r.Update(ctx, publicIP); err != nil { + return ctrl.Result{}, err + } + // Re-fetch to get the latest resourceVersion after the metadata update + if err := r.Get(ctx, client.ObjectKeyFromObject(publicIP), publicIP); err != nil { + return ctrl.Result{}, err + } + } + + if publicIP.Status.Phase == "" { + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseProgressing + publicIP.Status.State = v1alpha1.ExternalIPStatePending + } + + // Resolve the parent ExternalIPPool by the fulfillment-service UUID stored in spec.pool. + // The fulfillment-service creates pool CRs with a UUID label; spec.pool contains that + // UUID, not the K8s object name. + poolList := &v1alpha1.ExternalIPPoolList{} + err := r.List(ctx, poolList, + client.InNamespace(publicIP.Namespace), + client.MatchingLabels{osacExternalIPPoolIDLabel: publicIP.Spec.Pool}, + ) + if err != nil { + return ctrl.Result{}, err + } + if len(poolList.Items) == 0 { + log.Info("parent ExternalIPPool not found, requeueing", "poolUUID", publicIP.Spec.Pool) + return ctrl.Result{RequeueAfter: defaultPreconditionRequeueInterval}, nil + } + pool := &poolList.Items[0] + log.Info("resolved parent ExternalIPPool", "poolName", pool.Name, "poolUUID", publicIP.Spec.Pool) + + // Inherit implementation strategy from the parent pool. Unlike ExternalIPPool (which + // reads strategy from its own spec), ExternalIP must look it up from the parent. + implementationStrategy := pool.Spec.ImplementationStrategy + if implementationStrategy == "" { + implementationStrategy = defaultExternalIPPoolImplementationStrategy + } + + if publicIP.Annotations == nil { + publicIP.Annotations = make(map[string]string) + } + + // Annotate the CR so AAP playbooks can select the appropriate role without + // having to look up the parent pool themselves. + needsUpdate := false + if publicIP.Annotations[osacImplementationStrategyAnnotation] != implementationStrategy { + publicIP.Annotations[osacImplementationStrategyAnnotation] = implementationStrategy + log.Info("setting implementation-strategy annotation", "strategy", implementationStrategy) + needsUpdate = true + } + if publicIP.Annotations[osacExternalIPPoolNameAnnotation] != pool.Name { + publicIP.Annotations[osacExternalIPPoolNameAnnotation] = pool.Name + log.Info("setting externalippool-name annotation", "poolName", pool.Name) + needsUpdate = true + } + if needsUpdate { + if err := r.Update(ctx, publicIP); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil + } + + // Compute desired config version from spec and inherited implementation strategy. + // This hash drives the provisioning lifecycle: a new version triggers re-provisioning. + desiredVersion, err := provisioning.ComputeDesiredConfigVersion(struct { + Spec v1alpha1.ExternalIPSpec + ImplementationStrategy string + }{publicIP.Spec, implementationStrategy}) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to compute desired config version: %w", err) + } + publicIP.Status.DesiredConfigVersion = desiredVersion + + v1alpha1.SetExternalIPStatusCondition(publicIP, metav1.Condition{ + Type: string(v1alpha1.ExternalIPConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: conditionReasonConfigurationApplied, + Message: conditionMessageConfigurationApplied, + LastTransitionTime: metav1.Now(), + }) + + // Transition to Progressing on first provision or when spec changed after a previous + // success. Don't override Failed during backoff (the provisioning lifecycle handles retry). + if publicIP.Status.Phase == "" || (publicIP.Status.Phase == v1alpha1.ExternalIPPhaseReady && + !provisioning.IsConfigApplied(&publicIP.Status.ProvisioningJobs, publicIP.Status.DesiredConfigVersion)) { + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseProgressing + if publicIP.Status.State == "" { + publicIP.Status.State = v1alpha1.ExternalIPStatePending + } + } + + r.maybePopulateAddress(ctx, publicIP) + + result, err := r.handleProvisioning(ctx, publicIP) + if err != nil || result.RequeueAfter > 0 { + return result, err + } + + if publicIP.Status.State == v1alpha1.ExternalIPStateAllocated && publicIP.Status.Address == "" { + return ctrl.Result{RequeueAfter: r.StatusPollInterval}, nil + } + + return result, nil +} + +// maybePopulateAddress sets status.address from the MetalLB LoadBalancer Service +// after initial provisioning succeeds, and transitions to Ready once the address +// is known. +// +// State == Allocated is set exclusively by OnSuccess after the AAP provisioning +// job reports success, so this guard ensures address population happens strictly +// after provisioning completes. +func (r *ExternalIPReconciler) maybePopulateAddress(ctx context.Context, publicIP *v1alpha1.ExternalIP) { + if publicIP.Status.State != v1alpha1.ExternalIPStateAllocated || publicIP.Status.Address != "" { + return + } + log := ctrllog.FromContext(ctx) + targetClient, err := getTargetClient(ctx, r.mgr, r.targetCluster) + if err != nil { + log.Error(err, "failed to get target cluster client for address lookup") + return + } + ipAddress := r.getExternalIPAddress(ctx, targetClient, publicIP.Name) + if ipAddress != "" { + publicIP.Status.Address = ipAddress + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseReady + log.Info("populated ExternalIP address from LoadBalancer Service", "address", ipAddress) + } +} + +// handleDelete sets the Deleting phase, runs deprovisioning, and removes the finalizer +// once deprovisioning completes (or is skipped). +func (r *ExternalIPReconciler) handleDelete(ctx context.Context, publicIP *v1alpha1.ExternalIP) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + log.Info("deleting external IP") + + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseDeleting + + if !controllerutil.ContainsFinalizer(publicIP, osacExternalIPFinalizer) { + return ctrl.Result{}, nil + } + + result, err := r.handleDeprovisioning(ctx, publicIP) + if err != nil || result.RequeueAfter > 0 { + return result, err + } + + // Deprovisioning complete, remove finalizer to allow K8s garbage collection + log.Info("removing finalizer after successful deprovisioning") + controllerutil.RemoveFinalizer(publicIP, osacExternalIPFinalizer) + if err := r.Update(ctx, publicIP); err != nil { + return ctrl.Result{}, err + } + + return ctrl.Result{}, nil +} + +// handleProvisioning delegates to the shared provisioning lifecycle, which triggers +// an AAP job (e.g., osac-create-external-ip) and polls its status until completion. +func (r *ExternalIPReconciler) handleProvisioning(ctx context.Context, publicIP *v1alpha1.ExternalIP) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + if r.ProvisioningProvider == nil { + log.Info("no provisioning provider configured, skipping provisioning") + return ctrl.Result{}, nil + } + + return provisioning.RunProvisioningLifecycle(ctx, r.ProvisioningProvider, publicIP, + &provisioning.State{Jobs: &publicIP.Status.ProvisioningJobs, DesiredConfigVersion: publicIP.Status.DesiredConfigVersion}, + r.MaxJobHistory, r.StatusPollInterval, + &provisioning.PollCallbacks{ + OnFailed: func(_ string) { + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseFailed + publicIP.Status.State = v1alpha1.ExternalIPStateFailed + }, + OnSuccess: func(_ provisioning.ProvisionStatus) { + publicIP.Status.State = v1alpha1.ExternalIPStateAllocated + if publicIP.Status.Address == "" { + if targetClient, err := getTargetClient(ctx, r.mgr, r.targetCluster); err != nil { + log.Error(err, "failed to get target cluster client for address lookup on allocation") + } else if ip := r.getExternalIPAddress(ctx, targetClient, publicIP.Name); ip != "" { + publicIP.Status.Address = ip + } + } + if publicIP.Status.Address != "" { + publicIP.Status.Phase = v1alpha1.ExternalIPPhaseReady + } + }, + }, + func() bool { + return provisioning.CheckAPIServerForNonTerminalProvisionJob( + ctx, r.APIReader, client.ObjectKeyFromObject(publicIP), &v1alpha1.ExternalIP{}, func(obj client.Object) []v1alpha1.JobStatus { + return obj.(*v1alpha1.ExternalIP).Status.ProvisioningJobs + }) + }, + func() error { return r.Status().Update(ctx, publicIP) }, + ) +} + +// handleDeprovisioning triggers an AAP deprovisioning job (e.g., osac-delete-external-ip) +// and polls its status. On failure, it either blocks deletion (to prevent orphaned +// resources) or allows the process to continue, depending on provider policy. +func (r *ExternalIPReconciler) handleDeprovisioning(ctx context.Context, publicIP *v1alpha1.ExternalIP) (ctrl.Result, error) { + if r.ProvisioningProvider == nil { + ctrllog.FromContext(ctx).Info("no provisioning provider configured, skipping deprovisioning") + return ctrl.Result{}, nil + } + result, done, err := provisioning.RunDeprovisioningLifecycle(ctx, r.ProvisioningProvider, publicIP, + &publicIP.Status.ProvisioningJobs, r.MaxJobHistory, r.StatusPollInterval) + if err != nil || !done { + return result, err + } + return ctrl.Result{}, nil +} + +// getExternalIPAddress fetches the LoadBalancer Service created by the AAP create_public_ip +// playbook and returns the assigned IP from status.loadBalancer.ingress[0].ip. +// Returns "" on any error or if no IP is assigned yet (best-effort). +func (r *ExternalIPReconciler) getExternalIPAddress(ctx context.Context, targetClient client.Client, publicIPName string) string { + log := ctrllog.FromContext(ctx) + + svc := &corev1.Service{} + serviceName := externalIPServiceNamePrefix + publicIPName + if err := targetClient.Get(ctx, types.NamespacedName{Namespace: externalIPDefaultMetalLBNamespace, Name: serviceName}, svc); err != nil { + log.Error(err, "failed to get LoadBalancer Service", "namespace", externalIPDefaultMetalLBNamespace, "name", serviceName) + return "" + } + + if len(svc.Status.LoadBalancer.Ingress) == 0 { + log.Info("LoadBalancer Service has no ingress IP yet", "name", serviceName) + return "" + } + + ip := svc.Status.LoadBalancer.Ingress[0].IP + if ip == "" { + log.Info("LoadBalancer Service ingress IP is empty", "name", serviceName) + return "" + } + + return ip +} + +// SetupWithManager registers this controller with the multicluster manager. +// It watches ExternalIP CRs in the networking namespace on the local cluster only. +func (r *ExternalIPReconciler) SetupWithManager(mgr mcmanager.Manager) error { + return mcbuilder.ControllerManagedBy(mgr). + For(&v1alpha1.ExternalIP{}, + mcbuilder.WithPredicates(NetworkingNamespacePredicate(r.NetworkingNamespace)), + mcbuilder.WithEngageWithLocalCluster(true), + mcbuilder.WithEngageWithProviderClusters(false)). + Complete(r) +} diff --git a/internal/controller/externalip_controller_test.go b/internal/controller/externalip_controller_test.go new file mode 100644 index 00000000..f7540eb5 --- /dev/null +++ b/internal/controller/externalip_controller_test.go @@ -0,0 +1,930 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "time" + + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + runtimecluster "sigs.k8s.io/controller-runtime/pkg/cluster" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + mc "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + osacv1alpha1 "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +// mockExternalIPMulticlusterManager is a minimal implementation for testing address population. +// Embeds the full Manager interface; only GetCluster is overridden. +type mockExternalIPMulticlusterManager struct { + mcmanager.Manager + targetClient client.Client +} + +func (m *mockExternalIPMulticlusterManager) GetCluster(_ context.Context, _ mc.ClusterName) (runtimecluster.Cluster, error) { + return &mockExternalIPCluster{client: m.targetClient}, nil +} + +// mockExternalIPCluster satisfies cluster.Cluster; only GetClient is overridden. +type mockExternalIPCluster struct { + runtimecluster.Cluster + client client.Client +} + +func (c *mockExternalIPCluster) GetClient() client.Client { + return c.client +} + +// Tests for the ExternalIP provisioning controller. +// +// Key concepts for understanding these tests: +// +// - A ExternalIP belongs to a parent ExternalIPPool. The relationship uses fulfillment-service +// UUIDs, not K8s object names: publicIP.spec.pool contains a UUID, and the parent +// ExternalIPPool CR carries that UUID in its osac.openshift.io/externalippool-uuid label. +// The controller resolves the parent by listing pools with a matching label. +// +// - The reconcile loop requires multiple passes because each pass does one thing and +// returns: first pass adds the finalizer (metadata write), second pass processes the +// spec and triggers provisioning, third pass polls the provisioning job status. +// +// - Deletion tests call handleDelete directly because the fake client does not support +// setting DeletionTimestamp via Update. We set it in memory and invoke the handler. +// +// - The mock provisioning provider (defined in computeinstance_provisioning_test.go) +// simulates AAP job triggers and status polls. By default it returns success; tests +// override specific funcs to simulate failures or running states. +var _ = Describe("ExternalIPReconciler", func() { + var ( + reconciler *ExternalIPReconciler + mockProvider *mockProvisioningProvider + fakeClient client.Client + testCtx context.Context + publicIP *osacv1alpha1.ExternalIP + parentPool *osacv1alpha1.ExternalIPPool + testScheme *runtime.Scheme + ) + + const ( + testNamespace = "test-namespace" + testPoolUUID = "pool-uuid-123" + testConfigVersion = "version-1-abc123" + testConfigVersionUpdated = "version-2-def456" + ) + + BeforeEach(func() { + testCtx = context.TODO() + testScheme = runtime.NewScheme() + Expect(osacv1alpha1.AddToScheme(testScheme)).To(Succeed()) + Expect(scheme.AddToScheme(testScheme)).To(Succeed()) + + // The parent pool has a K8s name ("pool-k8s-name") that differs from the UUID + // ("pool-uuid-123") to verify the controller uses label-based lookup, not name-based. + parentPool = &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pool-k8s-name", + Namespace: testNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: testPoolUUID, + }, + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"192.168.1.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + }, + } + + // The ExternalIP references the parent pool by UUID, not by K8s name. + publicIP = &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-externalip", + Namespace: testNamespace, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: testPoolUUID, + }, + } + + fakeClient = fake.NewClientBuilder(). + WithScheme(testScheme). + WithObjects(publicIP, parentPool). + WithStatusSubresource(&osacv1alpha1.ExternalIP{}). + Build() + + mockProvider = &mockProvisioningProvider{name: "mock-aap"} + + // Default mock mgr provides an empty workload-cluster client so the + // address-population guard in handleUpdate does not nil-panic. Tests + // that need a Service on the workload cluster override reconciler.mgr. + emptyTargetClient := fake.NewClientBuilder().WithScheme(testScheme).Build() + + reconciler = &ExternalIPReconciler{ + Client: fakeClient, + APIReader: fakeClient, + Scheme: testScheme, + mgr: &mockExternalIPMulticlusterManager{targetClient: emptyTargetClient}, + NetworkingNamespace: testNamespace, + ProvisioningProvider: mockProvider, + StatusPollInterval: 1 * time.Second, + MaxJobHistory: 10, + } + }) + + Context("Reconcile", func() { + It("should add finalizer on first reconcile", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + result, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + Expect(result).NotTo(BeNil()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Finalizers).To(ContainElement(osacExternalIPFinalizer)) + }) + + It("should set phase to Progressing initially", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + // Keep the job in Running state so the phase stays Progressing + // (a Succeeded job would transition to Ready) + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateRunning, + Message: "Job running", + }, nil + } + + // Pass 1: adds finalizer + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Pass 2: resolves parent pool, triggers provisioning, sets Progressing + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseProgressing)) + }) + + It("should set implementation-strategy annotation from parent pool", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + // Pass 1: adds finalizer + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Pass 2: resolves parent pool and copies its implementation strategy + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Annotations[osacImplementationStrategyAnnotation]).To(Equal("metallb-l2")) + Expect(updated.Annotations[osacExternalIPPoolNameAnnotation]).To(Equal("pool-k8s-name")) + }) + + It("should requeue when parent ExternalIPPool is not found", func() { + // This ExternalIP references a pool UUID that doesn't exist as a label + // on any ExternalIPPool CR. The controller should requeue and wait for + // the pool to appear (it may not have been reconciled to K8s yet). + orphanIP := &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "orphan-externalip", + Namespace: testNamespace, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: "nonexistent-pool-uuid", + }, + } + Expect(fakeClient.Create(testCtx, orphanIP)).To(Succeed()) + + key := types.NamespacedName{Name: orphanIP.Name, Namespace: orphanIP.Namespace} + + // Pass 1: adds finalizer + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Pass 2: parent pool not found, requeues after precondition interval + result, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(defaultPreconditionRequeueInterval)) + }) + + It("should use default implementation strategy when pool has none", func() { + // A pool with no ImplementationStrategy in its spec should fall back + // to defaultExternalIPPoolImplementationStrategy ("metallb-l2"). + poolNoStrategy := &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pool-no-strategy", + Namespace: testNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: "pool-no-strategy-uuid", + }, + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + } + Expect(fakeClient.Create(testCtx, poolNoStrategy)).To(Succeed()) + + ipNoStrategy := &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ip-no-strategy", + Namespace: testNamespace, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: "pool-no-strategy-uuid", + }, + } + Expect(fakeClient.Create(testCtx, ipNoStrategy)).To(Succeed()) + + key := types.NamespacedName{Name: ipNoStrategy.Name, Namespace: ipNoStrategy.Namespace} + + // Pass 1: adds finalizer + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Pass 2: inherits default strategy since pool has none + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Annotations[osacImplementationStrategyAnnotation]).To(Equal(defaultExternalIPPoolImplementationStrategy)) + Expect(updated.Annotations[osacExternalIPPoolNameAnnotation]).To(Equal("pool-no-strategy")) + }) + + It("should set ConfigurationApplied condition to True", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + // Pass 1: finalizer, Pass 2: process spec and set condition + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + + condition := osacv1alpha1.GetExternalIPStatusCondition( + updated, osacv1alpha1.ExternalIPConditionConfigurationApplied, + ) + Expect(condition).NotTo(BeNil()) + Expect(condition.Status).To(Equal(metav1.ConditionTrue)) + Expect(condition.Reason).To(Equal("ConfigurationApplied")) + }) + + It("should set phase to Ready on successful provision when address is available", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + publicIP.Name, + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{{IP: "203.0.113.99"}}, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + reconciler.mgr = &mockExternalIPMulticlusterManager{targetClient: targetClient} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-success", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Provisioning completed", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger AAP job, Pass 3: poll job -> Succeeded -> Ready + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseReady)) + Expect(updated.Status.Address).To(Equal("203.0.113.99")) + }) + + It("should set phase to Failed on provision failure", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-fail", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateFailed, + Message: "Provisioning failed", + ErrorDetails: "MetalLB unreachable", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger, Pass 3: poll -> Failed + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseFailed)) + }) + + // Deletion tests call handleDelete directly because the fake client does not + // support setting DeletionTimestamp via Update. We add the finalizer via a + // normal Reconcile, then set DeletionTimestamp in memory and call handleDelete. + + It("should trigger deprovision on delete", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + deprovisionCalled := false + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + deprovisionCalled = true + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "deprovision-job-123", + BlockDeletionOnFailure: true, + }, nil + } + + // Add finalizer via normal reconcile + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Simulate K8s delete by setting DeletionTimestamp in memory + toDelete := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, err = reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + + Expect(deprovisionCalled).To(BeTrue()) + Expect(toDelete.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseDeleting)) + + latestJob := provisioning.FindLatestJobByType(toDelete.Status.ProvisioningJobs, osacv1alpha1.JobTypeDeprovision) + Expect(latestJob).NotTo(BeNil()) + Expect(latestJob.JobID).To(Equal("deprovision-job-123")) + }) + + It("should remove finalizer after successful deprovision", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "deprovision-success", + BlockDeletionOnFailure: true, + }, nil + } + + mockProvider.getDeprovisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Deprovision completed", + }, nil + } + + // Add finalizer via normal reconcile + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + toDelete := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + // First call triggers the deprovision job + _, err = reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + + // Second call polls status (Succeeded) and removes the finalizer + _, _ = reconciler.handleDelete(testCtx, toDelete) + + Expect(toDelete.Finalizers).NotTo(ContainElement(osacExternalIPFinalizer)) + }) + + It("should still handle delete for unmanaged ExternalIP with finalizer", func() { + // Edge case: a ExternalIP was managed (has finalizer), then an admin marked + // it unmanaged. The management-state guard in Reconcile skips processing + // for non-deleted resources, but deletion must still proceed to clean up + // the AAP-provisioned resources and remove the finalizer. + managedThenUnmanaged := &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "managed-then-unmanaged", + Namespace: testNamespace, + Annotations: map[string]string{ + osacManagementStateAnnotation: ManagementStateUnmanaged, + }, + Finalizers: []string{osacExternalIPFinalizer}, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: testPoolUUID, + }, + } + Expect(fakeClient.Create(testCtx, managedThenUnmanaged)).To(Succeed()) + + key := types.NamespacedName{Name: managedThenUnmanaged.Name, Namespace: managedThenUnmanaged.Namespace} + + deprovisionCalled := false + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + deprovisionCalled = true + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionSkipped, + }, nil + } + + fetched := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, fetched)).To(Succeed()) + now := metav1.Now() + fetched.DeletionTimestamp = &now + + // Verify the guard logic: DeletionTimestamp is set, so the unmanaged + // annotation is ignored and the delete branch runs. + Expect(fetched.ObjectMeta.DeletionTimestamp.IsZero()).To(BeFalse()) + + _, _ = reconciler.handleDelete(testCtx, fetched) + + Expect(deprovisionCalled).To(BeTrue()) + Expect(fetched.Finalizers).NotTo(ContainElement(osacExternalIPFinalizer)) + }) + + It("should set state to Pending on initial provisioning", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateRunning, + Message: "Job running", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger provisioning -> Progressing + Pending + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseProgressing)) + Expect(updated.Status.State).To(Equal(osacv1alpha1.ExternalIPStatePending)) + }) + + It("should stay Progressing when Allocated but address not yet available", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-allocated", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Provisioning completed", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger, Pass 3: poll -> Allocated but no address + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + result, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.State).To(Equal(osacv1alpha1.ExternalIPStateAllocated)) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseProgressing), + "phase should stay Progressing until address is populated") + Expect(updated.Status.Address).To(BeEmpty()) + Expect(result.RequeueAfter).To(BeNumerically(">", 0), + "should requeue to retry address population") + }) + + It("should populate address in OnSuccess on initial allocation when Service already has an IP", func() { + // This test covers the new code path added to the OnSuccess callback inside + // handleProvisioning: when state transitions to Allocated and the parking + // Service already has an ingress IP, the address must be set immediately + // within the same reconcile pass -- no extra round-trip through handleUpdate. + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + publicIP.Name, + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{{IP: "203.0.113.10"}}, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + reconciler.mgr = &mockExternalIPMulticlusterManager{targetClient: targetClient} + + mockProvider.triggerProvisionFunc = func( + _ context.Context, _ client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-alloc-addr", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + mockProvider.getProvisionStatusFunc = func( + _ context.Context, _ client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Provisioning completed", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger job, Pass 3: poll -> Succeeded -> OnSuccess + for range 3 { + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + } + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.State).To(Equal(osacv1alpha1.ExternalIPStateAllocated)) + Expect(updated.Status.Address).To(Equal("203.0.113.10"), + "address should be populated immediately in OnSuccess, not deferred to the next reconcile") + }) + + It("should set state to Failed on provisioning failure", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-fail", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateFailed, + Message: "Provisioning failed", + ErrorDetails: "MetalLB unreachable", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger, Pass 3: poll -> Failed state + phase + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseFailed)) + Expect(updated.Status.State).To(Equal(osacv1alpha1.ExternalIPStateFailed)) + }) + + It("should not change state on deletion", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + // Start with Allocated state: persist metadata first, then status. + publicIP.Finalizers = []string{osacExternalIPFinalizer} + Expect(fakeClient.Update(testCtx, publicIP)).To(Succeed()) + + publicIP.Status.Phase = osacv1alpha1.ExternalIPPhaseReady + publicIP.Status.State = osacv1alpha1.ExternalIPStateAllocated + Expect(fakeClient.Status().Update(testCtx, publicIP)).To(Succeed()) + + // Return a running deprovision job so handleDelete requeues before + // reaching the finalizer-removal Update (which the envtest server + // rejects when DeletionTimestamp is set in-memory). + mockProvider.triggerDeprovisionFunc = func( + _ context.Context, _ client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "deprov-job", + }, nil + } + + toDelete := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, err := reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + + // Phase transitions to Deleting but State remains unchanged + Expect(toDelete.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPhaseDeleting)) + Expect(toDelete.Status.State).To(Equal(osacv1alpha1.ExternalIPStateAllocated)) + }) + + It("should ignore ExternalIP with management-state unmanaged annotation", func() { + // When a ExternalIP has the unmanaged annotation and is NOT being deleted, + // the controller should skip it entirely: no finalizer, no phase change. + unmanagedIP := &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: "unmanaged-ip", + Namespace: testNamespace, + Annotations: map[string]string{ + osacManagementStateAnnotation: ManagementStateUnmanaged, + }, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: testPoolUUID, + }, + } + Expect(fakeClient.Create(testCtx, unmanagedIP)).To(Succeed()) + + key := types.NamespacedName{Name: unmanagedIP.Name, Namespace: unmanagedIP.Namespace} + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + + Expect(updated.Finalizers).To(BeEmpty()) + Expect(updated.Status.Phase).To(BeEmpty()) + }) + }) + + // The provisioning lifecycle uses a config version (hash of spec + strategy) to + // detect spec changes. When provisioning fails, the controller backs off with + // exponential delay. But if the spec changes (new config version), it retries + // immediately instead of waiting for the backoff to expire. + Context("backoff on failure", func() { + It("should backoff when latest job failed with matching ConfigVersion", func() { + publicIP.Status.DesiredConfigVersion = testConfigVersion + publicIP.Status.ProvisioningJobs = []osacv1alpha1.JobStatus{ + { + JobID: "failed-job", + Type: osacv1alpha1.JobTypeProvision, + Timestamp: metav1.NewTime(time.Now().UTC()), + State: osacv1alpha1.JobStateFailed, + Message: "provision failed", + ConfigVersion: testConfigVersion, + }, + } + + result, err := reconciler.handleProvisioning(testCtx, publicIP) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(BeNumerically(">", 0)) + Expect(result.RequeueAfter).To(BeNumerically("<=", provisioning.BackoffMaxDelay)) + }) + + It("should trigger immediately when spec changed after failure", func() { + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "retry-job", + InitialState: osacv1alpha1.JobStatePending, + }, nil + } + + // The desired version is "version-2" but the failed job was for "version-1", + // meaning the spec changed. The controller should retry immediately. + publicIP.Status.DesiredConfigVersion = testConfigVersionUpdated + publicIP.Status.ProvisioningJobs = []osacv1alpha1.JobStatus{ + { + JobID: "failed-job", + Type: osacv1alpha1.JobTypeProvision, + Timestamp: metav1.NewTime(time.Now().UTC().Add(-2 * time.Second)), + State: osacv1alpha1.JobStateFailed, + Message: "provision failed", + ConfigVersion: testConfigVersion, + }, + } + + result, err := reconciler.handleProvisioning(testCtx, publicIP) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(1 * time.Second)) + + latestJob := provisioning.FindLatestJobByType(publicIP.Status.ProvisioningJobs, osacv1alpha1.JobTypeProvision) + Expect(latestJob).NotTo(BeNil()) + Expect(latestJob.JobID).To(Equal("retry-job")) + }) + }) + + Context("getExternalIPAddress", func() { + It("should return IP from LoadBalancer Service ingress", func() { + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + "test-externalip", + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + {IP: "203.0.113.42"}, + }, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + + ip := reconciler.getExternalIPAddress(testCtx, targetClient, "test-externalip") + Expect(ip).To(Equal("203.0.113.42")) + }) + + It("should return empty string when Service not found", func() { + targetClient := fake.NewClientBuilder().WithScheme(testScheme).Build() + + ip := reconciler.getExternalIPAddress(testCtx, targetClient, "nonexistent") + Expect(ip).To(Equal("")) + }) + + It("should return empty string when ingress list is empty", func() { + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + "test-externalip", + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{}, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + + ip := reconciler.getExternalIPAddress(testCtx, targetClient, "test-externalip") + Expect(ip).To(Equal("")) + }) + + It("should return empty string when ingress IP is empty", func() { + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + "test-externalip", + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + {IP: ""}, + }, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + + ip := reconciler.getExternalIPAddress(testCtx, targetClient, "test-externalip") + Expect(ip).To(Equal("")) + }) + + It("should not populate address before provisioning succeeds (temporal ordering)", func() { + key := types.NamespacedName{Name: publicIP.Name, Namespace: publicIP.Namespace} + + // A LoadBalancer Service with an assigned IP exists on the workload cluster. + // The guard condition (state==Allocated && address=="") must prevent + // address population until provisioning has completed. + svc := &corev1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: externalIPServiceNamePrefix + "test-externalip", + Namespace: externalIPDefaultMetalLBNamespace, + }, + Status: corev1.ServiceStatus{ + LoadBalancer: corev1.LoadBalancerStatus{ + Ingress: []corev1.LoadBalancerIngress{ + {IP: "203.0.113.42"}, + }, + }, + }, + } + targetClient := fake.NewClientBuilder().WithScheme(testScheme).WithObjects(svc).Build() + reconciler.mgr = &mockExternalIPMulticlusterManager{targetClient: targetClient} + + // Keep jobs in Running state so OnSuccess does not fire and + // override the state we set for each sub-test. + mockProvider.getProvisionStatusFunc = func( + _ context.Context, _ client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateRunning, + Message: "Job running", + }, nil + } + + // Pending state: address must NOT be populated (pre-provisioning). + // Call handleUpdate and verify the in-memory object. + pendingIP := publicIP.DeepCopy() + pendingIP.Status.Phase = osacv1alpha1.ExternalIPPhaseProgressing + pendingIP.Status.State = osacv1alpha1.ExternalIPStatePending + pendingIP.Status.Address = "" + + _, err := reconciler.handleUpdate(testCtx, pendingIP) + Expect(err).NotTo(HaveOccurred()) + Expect(pendingIP.Status.Address).To(Equal(""), "address must not be populated in Pending state") + + // Allocated state: address SHOULD be populated (post-provisioning). + // Re-read the object from the fake client to get the current + // resourceVersion (handleUpdate modifies the object in the store). + allocatedIP := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, key, allocatedIP)).To(Succeed()) + allocatedIP.Status.Phase = osacv1alpha1.ExternalIPPhaseProgressing + allocatedIP.Status.State = osacv1alpha1.ExternalIPStateAllocated + allocatedIP.Status.Address = "" + + _, err = reconciler.handleUpdate(testCtx, allocatedIP) + Expect(err).NotTo(HaveOccurred()) + Expect(allocatedIP.Status.Address).To(Equal("203.0.113.42"), "address should be populated in Allocated state") + }) + }) +}) diff --git a/internal/controller/externalip_feedback_controller.go b/internal/controller/externalip_feedback_controller.go new file mode 100644 index 00000000..d862874a --- /dev/null +++ b/internal/controller/externalip_feedback_controller.go @@ -0,0 +1,245 @@ +/* +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 controller + +import ( + "context" + "errors" + "fmt" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + clnt "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +var ErrExternalIPNotFound = errors.New("external IP not found in fulfillment service") + +// ExternalIPFeedbackReconciler sends updates to the fulfillment service. +type ExternalIPFeedbackReconciler struct { + hubClient clnt.Client + publicIPsClient privatev1.ExternalIPsClient + networkingNamespace string +} + +type externalIPFeedbackReconcilerTask struct { + r *ExternalIPFeedbackReconciler + object *v1alpha1.ExternalIP + publicIP *privatev1.ExternalIP +} + +// NewExternalIPFeedbackReconciler creates a reconciler that sends to the fulfillment service updates about external IPs. +func NewExternalIPFeedbackReconciler(hubClient clnt.Client, grpcConn *grpc.ClientConn, networkingNamespace string) *ExternalIPFeedbackReconciler { + return &ExternalIPFeedbackReconciler{ + hubClient: hubClient, + publicIPsClient: privatev1.NewExternalIPsClient(grpcConn), + networkingNamespace: networkingNamespace, + } +} + +// SetupWithManager adds the reconciler to the controller manager. +func (r *ExternalIPFeedbackReconciler) SetupWithManager(mgr mcmanager.Manager) error { + localMgr := mgr.GetLocalManager() + if localMgr == nil { + return fmt.Errorf("local manager is nil") + } + + return ctrl.NewControllerManagedBy(localMgr). + Named("externalip-feedback"). + For(&v1alpha1.ExternalIP{}, builder.WithPredicates(NetworkingNamespacePredicate(r.networkingNamespace))). + Complete(r) +} + +// Reconcile is the implementation of the reconciler interface. +func (r *ExternalIPFeedbackReconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + // Step 1: Fetch the object to reconcile, and do nothing if it no longer exists: + object := &v1alpha1.ExternalIP{} + if err := r.hubClient.Get(ctx, request.NamespacedName, object); err != nil { + return ctrl.Result{}, clnt.IgnoreNotFound(err) + } + + // Step 2: Get the identifier of the external IP from the labels. If this isn't present it means that the object + // wasn't created by the fulfillment service, so we ignore it. + publicIPID, ok := object.Labels[osacExternalIPIDLabel] + if !ok { + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPFeedbackFinalizer) { + log.Info("CR without external IP ID label is being deleted, removing feedback finalizer") + if controllerutil.RemoveFinalizer(object, osacExternalIPFeedbackFinalizer) { + return ctrl.Result{}, r.hubClient.Update(ctx, object) + } + } + log.Info( + "There is no label containing the external IP identifier, will ignore it", + "label", osacExternalIPIDLabel, + ) + return ctrl.Result{}, nil + } + + // Step 3: Fetch the external IP from the fulfillment service so we can compare before/after. + publicIP, err := r.fetchExternalIP(ctx, publicIPID) + if err != nil { + if !object.DeletionTimestamp.IsZero() && errors.Is(err, ErrExternalIPNotFound) { + log.Info("ExternalIP record not found during deletion, removing feedback finalizer", "publicIPID", publicIPID) + if controllerutil.RemoveFinalizer(object, osacExternalIPFeedbackFinalizer) { + return ctrl.Result{}, r.hubClient.Update(ctx, object) + } + } + return ctrl.Result{}, err + } + + // Create a task to do the rest of the job, but using copies of the objects, so that we can later compare the + // before and after values and save only the objects that have changed. + t := &externalIPFeedbackReconcilerTask{ + r: r, + object: object, + publicIP: clone(publicIP), + } + + // Step 4: Sync CR state to the fulfillment service record. + if object.DeletionTimestamp.IsZero() { + if err := t.handleUpdate(ctx); err != nil { + return ctrl.Result{}, err + } + } else { + t.handleDelete() + } + + // Step 5: Persist synced state to the fulfillment service. + if err := r.saveExternalIP(ctx, publicIP, t.publicIP); err != nil { + return ctrl.Result{}, err + } + + // Step 6: Handle finalizer removal and signal for deletions. + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPFeedbackFinalizer) { + if len(object.GetFinalizers()) == 1 { + log.Info( + "Feedback finalizer is last remaining, removing finalizer and signaling", + "publicIPID", publicIPID, + ) + if controllerutil.RemoveFinalizer(object, osacExternalIPFeedbackFinalizer) { + if err := r.hubClient.Update(ctx, object); err != nil { + return ctrl.Result{}, err + } + } + _, signalErr := r.publicIPsClient.Signal(ctx, privatev1.ExternalIPsSignalRequest_builder{ + Id: publicIPID, + }.Build()) + if signalErr != nil { + log.Error( + signalErr, + "Failed to signal fulfillment service, periodic sync will handle cleanup", + "publicIPID", publicIPID, + ) + } + } else { + log.Info( + "Other finalizers still present, waiting", + "finalizers", object.GetFinalizers(), + ) + } + } + + return ctrl.Result{}, nil +} + +func (r *ExternalIPFeedbackReconciler) fetchExternalIP(ctx context.Context, id string) (*privatev1.ExternalIP, error) { + response, err := r.publicIPsClient.Get(ctx, privatev1.ExternalIPsGetRequest_builder{ + Id: id, + }.Build()) + if err != nil { + if status.Code(err) == codes.NotFound { + return nil, fmt.Errorf("%w: %w", ErrExternalIPNotFound, err) + } + return nil, err + } + publicIP := response.GetObject() + if publicIP == nil { + return nil, fmt.Errorf("%w: response contained nil object", ErrExternalIPNotFound) + } + if !publicIP.HasSpec() { + publicIP.SetSpec(&privatev1.ExternalIPSpec{}) + } + if !publicIP.HasStatus() { + publicIP.SetStatus(&privatev1.ExternalIPStatus{}) + } + return publicIP, nil +} + +func (r *ExternalIPFeedbackReconciler) saveExternalIP(ctx context.Context, before, after *privatev1.ExternalIP) error { + log := ctrllog.FromContext(ctx) + + if !equal(after, before) { + log.Info( + "Updating external IP", + "before", before, + "after", after, + ) + _, err := r.publicIPsClient.Update(ctx, privatev1.ExternalIPsUpdateRequest_builder{ + Object: after, + }.Build()) + if err != nil { + return err + } + } + return nil +} + +func (t *externalIPFeedbackReconcilerTask) handleUpdate(ctx context.Context) error { + if controllerutil.AddFinalizer(t.object, osacExternalIPFeedbackFinalizer) { + if err := t.r.hubClient.Update(ctx, t.object); err != nil { + return err + } + } + t.syncState(ctx) + t.syncAddress() + return nil +} + +func (t *externalIPFeedbackReconcilerTask) handleDelete() { + if t.object.Status.State == v1alpha1.ExternalIPStateFailed { + t.publicIP.GetStatus().SetState(privatev1.ExternalIPState_EXTERNAL_IP_STATE_FAILED) + return + } + t.publicIP.GetStatus().SetState(privatev1.ExternalIPState_EXTERNAL_IP_STATE_DELETING) +} + +func (t *externalIPFeedbackReconcilerTask) syncState(ctx context.Context) { + switch t.object.Status.State { + case v1alpha1.ExternalIPStatePending: + t.publicIP.GetStatus().SetState(privatev1.ExternalIPState_EXTERNAL_IP_STATE_PENDING) + case v1alpha1.ExternalIPStateAllocated: + t.publicIP.GetStatus().SetState(privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED) + case v1alpha1.ExternalIPStateFailed: + t.publicIP.GetStatus().SetState(privatev1.ExternalIPState_EXTERNAL_IP_STATE_FAILED) + default: + log := ctrllog.FromContext(ctx) + log.Info("Unknown state, will ignore it", "state", t.object.Status.State) + } +} + +func (t *externalIPFeedbackReconcilerTask) syncAddress() { + if t.object.Status.Address != "" { + t.publicIP.GetStatus().SetAddress(t.object.Status.Address) + } +} diff --git a/internal/controller/externalip_feedback_controller_test.go b/internal/controller/externalip_feedback_controller_test.go new file mode 100644 index 00000000..49eeaf28 --- /dev/null +++ b/internal/controller/externalip_feedback_controller_test.go @@ -0,0 +1,684 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "errors" + "net" + "sync" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + grpcstatus "google.golang.org/grpc/status" + "google.golang.org/grpc/test/bufconn" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +var _ = Describe("ExternalIPFeedbackController", func() { + const ( + publicIPName = "test-externalip" + publicIPNamespace = "test-namespace" + publicIPID = "externalip-123" + testPool = "pool-abc" + testAddress = "192.168.1.100" + ) + + var ( + ctx context.Context + k8sClient client.Client + mockServer *mockExternalIPsServer + reconciler *ExternalIPFeedbackReconciler + grpcServer *grpc.Server + listener *bufconn.Listener + ) + + BeforeEach(func() { + ctx = context.Background() + + scheme := runtime.NewScheme() + Expect(v1alpha1.AddToScheme(scheme)).To(Succeed()) + k8sClient = fake.NewClientBuilder().WithScheme(scheme).Build() + + mockServer = &mockExternalIPsServer{ + publicIPs: make(map[string]*privatev1.ExternalIP), + updates: make([]*privatev1.ExternalIP, 0), + signals: make([]string, 0), + } + listener = bufconn.Listen(1024 * 1024) + grpcServer = grpc.NewServer() + privatev1.RegisterExternalIPsServer(grpcServer, mockServer) + + go func() { + _ = grpcServer.Serve(listener) + }() + + conn, err := grpc.NewClient("passthrough:///bufnet", + grpc.WithContextDialer(func(ctx context.Context, s string) (net.Conn, error) { + return listener.Dial() + }), + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + Expect(err).NotTo(HaveOccurred()) + + reconciler = NewExternalIPFeedbackReconciler(k8sClient, conn, publicIPNamespace) + }) + + AfterEach(func() { + if grpcServer != nil { + grpcServer.Stop() + } + if listener != nil { + _ = listener.Close() + } + }) + + Context("when reconciling a ExternalIP CR", func() { + It("should sync State=Pending to database state=PENDING", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseProgressing, + State: v1alpha1.ExternalIPStatePending, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_PENDING)) + + updated := &v1alpha1.ExternalIP{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync State=Allocated to database state=ALLOCATED", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_PENDING, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseReady, + State: v1alpha1.ExternalIPStateAllocated, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED)) + + updated := &v1alpha1.ExternalIP{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync State=Failed to database state=FAILED from Allocated", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseFailed, + State: v1alpha1.ExternalIPStateFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_FAILED)) + + updated := &v1alpha1.ExternalIP{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync State=Failed to database state=FAILED from Pending", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_PENDING, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseFailed, + State: v1alpha1.ExternalIPStateFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_FAILED)) + + updated := &v1alpha1.ExternalIP{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync address to database address field", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_PENDING, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseReady, + Address: testAddress, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetAddress()).To(Equal(testAddress)) + }) + + It("should skip CRs without externalip-uuid label", func() { + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(BeEmpty()) + }) + + It("should sync State=Allocated during deletion to database state=RELEASING", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer, "osac.openshift.io/externalip-finalizer"}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseDeleting, + State: v1alpha1.ExternalIPStateAllocated, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_DELETING)) + + updated := &v1alpha1.ExternalIP{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync State=Failed during deletion to database state=FAILED", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer, "osac.openshift.io/externalip-finalizer"}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseFailed, + State: v1alpha1.ExternalIPStateFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_FAILED)) + }) + + It("should remove feedback finalizer and signal when it is the last finalizer", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPState_EXTERNAL_IP_STATE_DELETING)) + + Expect(mockServer.signals).To(HaveLen(1)) + Expect(mockServer.signals[0]).To(Equal(publicIPID)) + + updated := &v1alpha1.ExternalIP{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated) + Expect(err).To(HaveOccurred()) + }) + + It("should remove feedback finalizer when externalip record is NotFound during deletion", func() { + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(BeEmpty()) + Expect(mockServer.signals).To(BeEmpty()) + + updated := &v1alpha1.ExternalIP{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: publicIPName, Namespace: publicIPNamespace}, updated) + Expect(err).To(HaveOccurred()) + }) + + It("should return error when externalip record is NotFound but CR is not being deleted", func() { + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(errors.Is(err, ErrExternalIPNotFound)).To(BeTrue()) + }) + + It("should not update if status unchanged", func() { + publicIP := &privatev1.ExternalIP{ + Id: publicIPID, + Metadata: &privatev1.Metadata{ + Name: publicIPName, + }, + Spec: &privatev1.ExternalIPSpec{ + Pool: testPool, + }, + Status: &privatev1.ExternalIPStatus{ + State: privatev1.ExternalIPState_EXTERNAL_IP_STATE_ALLOCATED, + }, + } + mockServer.addExternalIP(publicIP) + + cr := &v1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: publicIPName, + Namespace: publicIPNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: publicIPID, + }, + Finalizers: []string{osacExternalIPFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPSpec{ + Pool: testPool, + }, + Status: v1alpha1.ExternalIPStatus{ + Phase: v1alpha1.ExternalIPPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: publicIPName, + Namespace: publicIPNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(BeEmpty()) + }) + }) +}) + +type mockExternalIPsServer struct { + privatev1.UnimplementedExternalIPsServer + mu sync.Mutex + publicIPs map[string]*privatev1.ExternalIP + updates []*privatev1.ExternalIP + signals []string +} + +func (m *mockExternalIPsServer) addExternalIP(publicIP *privatev1.ExternalIP) { + m.mu.Lock() + defer m.mu.Unlock() + m.publicIPs[publicIP.GetId()] = publicIP +} + +func (m *mockExternalIPsServer) Get(ctx context.Context, req *privatev1.ExternalIPsGetRequest) (*privatev1.ExternalIPsGetResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + publicIP, ok := m.publicIPs[req.GetId()] + if !ok { + return nil, grpcstatus.Errorf(codes.NotFound, "object with identifier '%s' not found", req.GetId()) + } + + return &privatev1.ExternalIPsGetResponse{ + Object: publicIP, + }, nil +} + +func (m *mockExternalIPsServer) Update(ctx context.Context, req *privatev1.ExternalIPsUpdateRequest) (*privatev1.ExternalIPsUpdateResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + publicIP := req.GetObject() + m.publicIPs[publicIP.GetId()] = publicIP + m.updates = append(m.updates, publicIP) + + return &privatev1.ExternalIPsUpdateResponse{ + Object: publicIP, + }, nil +} + +func (m *mockExternalIPsServer) Signal(ctx context.Context, req *privatev1.ExternalIPsSignalRequest) (*privatev1.ExternalIPsSignalResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + m.signals = append(m.signals, req.GetId()) + + return &privatev1.ExternalIPsSignalResponse{}, nil +} diff --git a/internal/controller/externalip_names.go b/internal/controller/externalip_names.go new file mode 100644 index 00000000..4009d8b5 --- /dev/null +++ b/internal/controller/externalip_names.go @@ -0,0 +1,33 @@ +/* +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 controller + +import ( + "fmt" +) + +const ( + externalipControllerName = "externalip-controller" + + // Must match the AAP playbook Service naming convention in osac-aap. + externalIPServiceNamePrefix = "osac-eip-" + externalIPDefaultMetalLBNamespace = "metallb-system" +) + +var ( + osacExternalIPIDLabel string = fmt.Sprintf("%s/externalip-uuid", osacPrefix) + osacExternalIPFeedbackFinalizer string = fmt.Sprintf("%s/externalip-feedback", osacPrefix) + osacExternalIPTargetNamespaceAnnotation string = fmt.Sprintf("%s/externalip-target-namespace", osacPrefix) + osacExternalIPDetachFinalizer string = fmt.Sprintf("%s/externalip-detach", osacPrefix) +) diff --git a/internal/controller/externalipattachment_controller.go b/internal/controller/externalipattachment_controller.go new file mode 100644 index 00000000..ad80874a --- /dev/null +++ b/internal/controller/externalipattachment_controller.go @@ -0,0 +1,573 @@ +/* +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 controller + +import ( + "context" + "fmt" + "time" + + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/util/retry" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + controllerutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" + mchandler "sigs.k8s.io/multicluster-runtime/pkg/handler" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + mc "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +const ( + osacExternalIPAttachmentFinalizer = "osac.openshift.io/externalipattachment-finalizer" +) + +// ExternalIPAttachmentReconciler reconciles ExternalIPAttachment CRs. +// +// Creating a ExternalIPAttachment triggers an attach operation (osac-attach-external-ip AAP +// template) that moves the MetalLB Service from the parking namespace to the VM namespace. +// Deleting the CR triggers detach (osac-detach-external-ip) which reverses that. +// +// The controller uses RunProvisioningLifecycle for provisioning, giving automatic +// exponential-backoff retry on failure. It also watches ComputeInstance resources to +// auto-delete the ExternalIPAttachment when the target CI is deleted. +type ExternalIPAttachmentReconciler struct { + client.Client + APIReader client.Reader + Scheme *runtime.Scheme + mgr mcmanager.Manager + NetworkingNamespace string + ComputeInstanceNamespace string + ProvisioningProvider provisioning.ProvisioningProvider + StatusPollInterval time.Duration + MaxJobHistory int + targetCluster mc.ClusterName +} + +// NewExternalIPAttachmentReconciler creates a new reconciler for ExternalIPAttachment resources. +func NewExternalIPAttachmentReconciler( + mgr mcmanager.Manager, + networkingNamespace string, + computeInstanceNamespace string, + provisioningProvider provisioning.ProvisioningProvider, + statusPollInterval time.Duration, + maxJobHistory int, + targetCluster mc.ClusterName, +) *ExternalIPAttachmentReconciler { + if mgr == nil { + panic("mgr must not be nil") + } + if statusPollInterval <= 0 { + statusPollInterval = provisioning.DefaultStatusPollInterval + } + if maxJobHistory <= 0 { + maxJobHistory = provisioning.DefaultMaxJobHistory + } + if computeInstanceNamespace == "" { + computeInstanceNamespace = defaultComputeInstanceNamespace + } + return &ExternalIPAttachmentReconciler{ + Client: mgr.GetLocalManager().GetClient(), + APIReader: mgr.GetLocalManager().GetAPIReader(), + Scheme: mgr.GetLocalManager().GetScheme(), + mgr: mgr, + NetworkingNamespace: networkingNamespace, + ComputeInstanceNamespace: computeInstanceNamespace, + ProvisioningProvider: provisioningProvider, + StatusPollInterval: statusPollInterval, + MaxJobHistory: maxJobHistory, + targetCluster: targetCluster, + } +} + +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalipattachments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalipattachments/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalipattachments/finalizers,verbs=update + +// Reconcile handles create/update/delete for a ExternalIPAttachment CR. +func (r *ExternalIPAttachmentReconciler) Reconcile(ctx context.Context, req mcreconcile.Request) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + attachment := &v1alpha1.ExternalIPAttachment{} + if err := r.Get(ctx, req.NamespacedName, attachment); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + val, exists := attachment.Annotations[osacManagementStateAnnotation] + if attachment.ObjectMeta.DeletionTimestamp.IsZero() && exists && val == ManagementStateUnmanaged { + log.Info("ignoring ExternalIPAttachment due to management-state annotation", "management-state", val) + return ctrl.Result{}, nil + } + + log.Info("start reconcile", "publicIP", attachment.Spec.ExternalIP, "phase", attachment.Status.Phase) + + oldstatus := attachment.Status.DeepCopy() + + var res ctrl.Result + var err error + if attachment.ObjectMeta.DeletionTimestamp.IsZero() { + res, err = r.handleUpdate(ctx, attachment) + } else { + res, err = r.handleDelete(ctx, attachment) + } + + if !equality.Semantic.DeepEqual(attachment.Status, *oldstatus) { + log.Info("status requires update", "phase", attachment.Status.Phase) + if updateErr := r.updateStatusWithRetry(ctx, client.ObjectKeyFromObject(attachment), attachment.Status); updateErr != nil { + return res, updateErr + } + } + + log.Info("end reconcile", "phase", attachment.Status.Phase) + return res, err +} + +func (r *ExternalIPAttachmentReconciler) handleUpdate(ctx context.Context, attachment *v1alpha1.ExternalIPAttachment) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + if controllerutil.AddFinalizer(attachment, osacExternalIPAttachmentFinalizer) { + log.Info("adding finalizer") + if err := r.Update(ctx, attachment); err != nil { + return ctrl.Result{}, err + } + if err := r.Get(ctx, client.ObjectKeyFromObject(attachment), attachment); err != nil { + return ctrl.Result{}, err + } + } + + if attachment.Status.Phase == "" { + attachment.Status.Phase = v1alpha1.ExternalIPAttachmentPhaseProgressing + } + + // Resolve parent ExternalIP by UUID label (spec.publicIP contains the fulfillment-service UUID) + publicIPList := &v1alpha1.ExternalIPList{} + if err := r.List(ctx, publicIPList, + client.InNamespace(attachment.Namespace), + client.MatchingLabels{osacExternalIPIDLabel: attachment.Spec.ExternalIP}, + ); err != nil { + return ctrl.Result{}, err + } + if len(publicIPList.Items) == 0 { + log.Info("parent ExternalIP not found, requeueing", "publicIPUUID", attachment.Spec.ExternalIP) + return ctrl.Result{RequeueAfter: defaultPreconditionRequeueInterval}, nil + } + publicIP := &publicIPList.Items[0] + + // Resolve parent ExternalIPPool by UUID label + poolList := &v1alpha1.ExternalIPPoolList{} + if err := r.List(ctx, poolList, + client.InNamespace(attachment.Namespace), + client.MatchingLabels{osacExternalIPPoolIDLabel: publicIP.Spec.Pool}, + ); err != nil { + return ctrl.Result{}, err + } + if len(poolList.Items) == 0 { + log.Info("parent ExternalIPPool not found, requeueing", "poolUUID", publicIP.Spec.Pool) + return ctrl.Result{RequeueAfter: defaultPreconditionRequeueInterval}, nil + } + pool := &poolList.Items[0] + + implementationStrategy := pool.Spec.ImplementationStrategy + if implementationStrategy == "" { + implementationStrategy = defaultExternalIPPoolImplementationStrategy + } + + // Resolve target ComputeInstance + ci, result, err := r.resolveComputeInstance(ctx, attachment) + if err != nil || result.RequeueAfter > 0 { + return result, err + } + + // Sync annotations + needsUpdate := false + if attachment.Annotations == nil { + attachment.Annotations = make(map[string]string) + } + + if attachment.Annotations[osacImplementationStrategyAnnotation] != implementationStrategy { + attachment.Annotations[osacImplementationStrategyAnnotation] = implementationStrategy + needsUpdate = true + } + if attachment.Annotations[osacExternalIPPoolNameAnnotation] != pool.Name { + attachment.Annotations[osacExternalIPPoolNameAnnotation] = pool.Name + needsUpdate = true + } + if attachment.Annotations[osacExternalIPNameAnnotation] != publicIP.Name { + attachment.Annotations[osacExternalIPNameAnnotation] = publicIP.Name + needsUpdate = true + } + if ci != nil && ci.Status.VirtualMachineReference != nil { + targetNamespace := ci.Status.VirtualMachineReference.Namespace + if attachment.Annotations[osacExternalIPTargetNamespaceAnnotation] != targetNamespace { + attachment.Annotations[osacExternalIPTargetNamespaceAnnotation] = targetNamespace + needsUpdate = true + } + } + + if needsUpdate { + if err := r.Update(ctx, attachment); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{RequeueAfter: time.Second}, nil + } + + // Compute desired config version + desiredVersion, err := provisioning.ComputeDesiredConfigVersion(struct { + Spec v1alpha1.ExternalIPAttachmentSpec + ImplementationStrategy string + }{attachment.Spec, implementationStrategy}) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to compute desired config version: %w", err) + } + attachment.Status.DesiredConfigVersion = desiredVersion + + v1alpha1.SetExternalIPAttachmentStatusCondition(attachment, metav1.Condition{ + Type: string(v1alpha1.ExternalIPAttachmentConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: conditionReasonConfigurationApplied, + Message: conditionMessageConfigurationApplied, + LastTransitionTime: metav1.Now(), + }) + + if attachment.Status.Phase == "" || (attachment.Status.Phase == v1alpha1.ExternalIPAttachmentPhaseReady && + !provisioning.IsConfigApplied(&attachment.Status.ProvisioningJobs, attachment.Status.DesiredConfigVersion)) { + attachment.Status.Phase = v1alpha1.ExternalIPAttachmentPhaseProgressing + } + + return r.handleProvisioning(ctx, attachment, publicIP, ci) +} + +// resolveComputeInstance looks up the target ComputeInstance by UUID label, handles +// auto-detach if the CI is being deleted, and adds the detach finalizer. +// Returns nil CI (with no requeue) when spec.computeInstance is not set. +func (r *ExternalIPAttachmentReconciler) resolveComputeInstance( + ctx context.Context, + attachment *v1alpha1.ExternalIPAttachment, +) (*v1alpha1.ComputeInstance, ctrl.Result, error) { + if attachment.Spec.ComputeInstance == nil { + return nil, ctrl.Result{}, nil + } + + log := ctrllog.FromContext(ctx) + + ciList := &v1alpha1.ComputeInstanceList{} + if err := r.List(ctx, ciList, + client.InNamespace(r.ComputeInstanceNamespace), + client.MatchingLabels{osacComputeInstanceIDLabel: *attachment.Spec.ComputeInstance}, + ); err != nil { + return nil, ctrl.Result{}, err + } + if len(ciList.Items) == 0 { + log.Info("ComputeInstance not found, requeueing", "computeInstanceUUID", *attachment.Spec.ComputeInstance) + return nil, ctrl.Result{RequeueAfter: defaultPreconditionRequeueInterval}, nil + } + ci := &ciList.Items[0] + + if !ci.DeletionTimestamp.IsZero() { + log.Info("auto-detaching: ComputeInstance is being deleted", "computeInstance", ci.Name) + if err := r.Delete(ctx, attachment); err != nil { + return nil, ctrl.Result{}, client.IgnoreNotFound(err) + } + return nil, ctrl.Result{}, nil + } + + if ci.Status.VirtualMachineReference == nil { + log.Info("ComputeInstance has no VirtualMachineReference yet, requeueing", "computeInstance", ci.Name) + return nil, ctrl.Result{RequeueAfter: defaultPreconditionRequeueInterval}, nil + } + + if controllerutil.AddFinalizer(ci, osacExternalIPDetachFinalizer) { + log.Info("adding externalip-detach finalizer to ComputeInstance", "computeInstance", ci.Name) + if err := r.Update(ctx, ci); err != nil { + return nil, ctrl.Result{}, err + } + } + + return ci, ctrl.Result{}, nil +} + +func (r *ExternalIPAttachmentReconciler) handleProvisioning( + ctx context.Context, + attachment *v1alpha1.ExternalIPAttachment, + publicIP *v1alpha1.ExternalIP, + ci *v1alpha1.ComputeInstance, +) (ctrl.Result, error) { + if r.ProvisioningProvider == nil { + ctrllog.FromContext(ctx).Info("no provisioning provider configured, skipping provisioning") + return ctrl.Result{}, nil + } + + return provisioning.RunProvisioningLifecycle(ctx, r.ProvisioningProvider, attachment, + &provisioning.State{Jobs: &attachment.Status.ProvisioningJobs, DesiredConfigVersion: attachment.Status.DesiredConfigVersion}, + r.MaxJobHistory, r.StatusPollInterval, + &provisioning.PollCallbacks{ + OnFailed: func(_ string) { attachment.Status.Phase = v1alpha1.ExternalIPAttachmentPhaseFailed }, + OnSuccess: func(_ provisioning.ProvisionStatus) { + attachment.Status.Phase = v1alpha1.ExternalIPAttachmentPhaseReady + r.onProvisionSuccess(ctx, publicIP, ci) + }, + }, + func() bool { + return provisioning.CheckAPIServerForNonTerminalProvisionJob( + ctx, r.APIReader, client.ObjectKeyFromObject(attachment), &v1alpha1.ExternalIPAttachment{}, func(obj client.Object) []v1alpha1.JobStatus { + return obj.(*v1alpha1.ExternalIPAttachment).Status.ProvisioningJobs + }) + }, + func() error { + return r.updateStatusWithRetry(ctx, client.ObjectKeyFromObject(attachment), attachment.Status) + }, + ) +} + +// onProvisionSuccess updates the parent ExternalIP and target ComputeInstance after +// a successful attach operation. +func (r *ExternalIPAttachmentReconciler) onProvisionSuccess(ctx context.Context, publicIP *v1alpha1.ExternalIP, ci *v1alpha1.ComputeInstance) { + log := ctrllog.FromContext(ctx) + + // Set ExternalIP.status.attached = true + if !publicIP.Status.Attached { + fresh := &v1alpha1.ExternalIP{} + if err := r.Get(ctx, client.ObjectKeyFromObject(publicIP), fresh); err != nil { + log.Error(err, "failed to fetch ExternalIP for attached update") + return + } + fresh.Status.Attached = true + if err := r.Status().Update(ctx, fresh); err != nil { + log.Error(err, "failed to set ExternalIP status.attached=true") + } + } + + // Set ComputeInstance.status.publicIPAddress from the parent ExternalIP's address + if ci != nil && publicIP.Status.Address != "" { + fresh := &v1alpha1.ComputeInstance{} + if err := r.Get(ctx, client.ObjectKeyFromObject(ci), fresh); err != nil { + log.Error(err, "failed to fetch ComputeInstance for publicIPAddress update") + return + } + if fresh.GetPublicIPAddress() != publicIP.Status.Address { + fresh.SetPublicIPAddress(publicIP.Status.Address) + if err := r.Status().Update(ctx, fresh); err != nil { + log.Error(err, "failed to set ComputeInstance publicIPAddress") + } + } + } +} + +func (r *ExternalIPAttachmentReconciler) handleDelete(ctx context.Context, attachment *v1alpha1.ExternalIPAttachment) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + log.Info("deleting ExternalIPAttachment") + + attachment.Status.Phase = v1alpha1.ExternalIPAttachmentPhaseDeleting + + if !controllerutil.ContainsFinalizer(attachment, osacExternalIPAttachmentFinalizer) { + return ctrl.Result{}, nil + } + + result, err := r.handleDeprovisioning(ctx, attachment) + if err != nil || result.RequeueAfter > 0 { + return result, err + } + + // Deprovisioning complete: update parent resources and remove finalizers + r.onDeprovisionSuccess(ctx, attachment) + + log.Info("removing finalizer after successful deprovisioning") + controllerutil.RemoveFinalizer(attachment, osacExternalIPAttachmentFinalizer) + if err := r.Update(ctx, attachment); err != nil { + return ctrl.Result{}, err + } + + return ctrl.Result{}, nil +} + +// onDeprovisionSuccess clears the attached state on the parent ExternalIP, clears +// publicIPAddress on the ComputeInstance, and removes the CI detach finalizer when +// no other ExternalIPAttachments reference the same CI. +func (r *ExternalIPAttachmentReconciler) onDeprovisionSuccess(ctx context.Context, attachment *v1alpha1.ExternalIPAttachment) { + log := ctrllog.FromContext(ctx) + + // Clear ExternalIP.status.attached (look up by UUID label) + publicIPList := &v1alpha1.ExternalIPList{} + if err := r.List(ctx, publicIPList, + client.InNamespace(attachment.Namespace), + client.MatchingLabels{osacExternalIPIDLabel: attachment.Spec.ExternalIP}, + ); err != nil { + log.Error(err, "failed to list ExternalIPs for attached=false update") + } else if len(publicIPList.Items) == 0 { + log.Info("parent ExternalIP not found during deprovision cleanup", "publicIPUUID", attachment.Spec.ExternalIP) + } else if publicIP := &publicIPList.Items[0]; publicIP.Status.Attached { + publicIP.Status.Attached = false + if err := r.Status().Update(ctx, publicIP); err != nil { + log.Error(err, "failed to clear ExternalIP status.attached") + } + } + + // Clear ComputeInstance.status.publicIPAddress and remove CI detach finalizer + if attachment.Spec.ComputeInstance != nil { + ciUUID := *attachment.Spec.ComputeInstance + ciList := &v1alpha1.ComputeInstanceList{} + if err := r.List(ctx, ciList, + client.InNamespace(r.ComputeInstanceNamespace), + client.MatchingLabels{osacComputeInstanceIDLabel: ciUUID}, + ); err != nil { + log.Error(err, "failed to list ComputeInstances for cleanup") + } else if len(ciList.Items) > 0 { + ci := &ciList.Items[0] + if ci.GetPublicIPAddress() != "" { + ci.SetPublicIPAddress("") + if err := r.Status().Update(ctx, ci); err != nil { + log.Error(err, "failed to clear ComputeInstance publicIPAddress") + } + } + } + + if err := r.maybeRemoveCIDetachFinalizer(ctx, ciUUID, attachment.Name); err != nil { + log.Error(err, "failed to remove CI detach finalizer") + } + } +} + +// maybeRemoveCIDetachFinalizer removes the externalip-detach finalizer from the +// ComputeInstance if no other ExternalIPAttachments still reference it. +// ciUUID is the fulfillment-service UUID used in spec.computeInstance and CI labels. +func (r *ExternalIPAttachmentReconciler) maybeRemoveCIDetachFinalizer(ctx context.Context, ciUUID string, excludeAttachment string) error { + log := ctrllog.FromContext(ctx) + + ciList := &v1alpha1.ComputeInstanceList{} + if err := r.List(ctx, ciList, + client.InNamespace(r.ComputeInstanceNamespace), + client.MatchingLabels{osacComputeInstanceIDLabel: ciUUID}, + ); err != nil { + return err + } + if len(ciList.Items) == 0 { + return nil + } + ci := &ciList.Items[0] + + if !controllerutil.ContainsFinalizer(ci, osacExternalIPDetachFinalizer) { + return nil + } + + // Check if other ExternalIPAttachments still reference this CI + attachments := &v1alpha1.ExternalIPAttachmentList{} + if err := r.List(ctx, attachments, client.InNamespace(r.NetworkingNamespace)); err != nil { + return err + } + for i := range attachments.Items { + if attachments.Items[i].Name == excludeAttachment { + continue + } + if attachments.Items[i].Spec.ComputeInstance != nil && *attachments.Items[i].Spec.ComputeInstance == ciUUID { + log.Info("other ExternalIPAttachments still reference CI, keeping finalizer", + "computeInstanceUUID", ciUUID, + "attachment", attachments.Items[i].Name) + return nil + } + } + + log.Info("no more references, removing CI detach finalizer", "computeInstanceUUID", ciUUID) + if controllerutil.RemoveFinalizer(ci, osacExternalIPDetachFinalizer) { + if err := r.Update(ctx, ci); err != nil { + return err + } + } + return nil +} + +func (r *ExternalIPAttachmentReconciler) handleDeprovisioning(ctx context.Context, attachment *v1alpha1.ExternalIPAttachment) (ctrl.Result, error) { + if r.ProvisioningProvider == nil { + ctrllog.FromContext(ctx).Info("no provisioning provider configured, skipping deprovisioning") + return ctrl.Result{}, nil + } + result, done, err := provisioning.RunDeprovisioningLifecycle(ctx, r.ProvisioningProvider, attachment, + &attachment.Status.ProvisioningJobs, r.MaxJobHistory, r.StatusPollInterval) + if err != nil || !done { + return result, err + } + return ctrl.Result{}, nil +} + +func (r *ExternalIPAttachmentReconciler) updateStatusWithRetry(ctx context.Context, key client.ObjectKey, newStatus v1alpha1.ExternalIPAttachmentStatus) error { + return retry.RetryOnConflict(retry.DefaultRetry, func() error { + latest := &v1alpha1.ExternalIPAttachment{} + if err := r.Get(ctx, key, latest); err != nil { + return err + } + latest.Status = newStatus + return r.Status().Update(ctx, latest) + }) +} + +// mapComputeInstanceToExternalIPAttachments maps a ComputeInstance change to all +// ExternalIPAttachments that reference it, so the controller can react to CI deletion +// or VirtualMachineReference changes. +func (r *ExternalIPAttachmentReconciler) mapComputeInstanceToExternalIPAttachments(ctx context.Context, obj client.Object) []reconcile.Request { + log := ctrllog.FromContext(ctx) + + ciUUID, exists := obj.GetLabels()[osacComputeInstanceIDLabel] + if !exists { + return nil + } + + attachments := &v1alpha1.ExternalIPAttachmentList{} + if err := r.List(ctx, attachments, client.InNamespace(r.NetworkingNamespace)); err != nil { + log.Error(err, "failed to list ExternalIPAttachments for ComputeInstance watch") + return nil + } + + var requests []reconcile.Request + for i := range attachments.Items { + if attachments.Items[i].Spec.ComputeInstance != nil && *attachments.Items[i].Spec.ComputeInstance == ciUUID { + requests = append(requests, reconcile.Request{ + NamespacedName: client.ObjectKeyFromObject(&attachments.Items[i]), + }) + } + } + + if len(requests) > 0 { + log.Info("mapped ComputeInstance change to ExternalIPAttachments", + "computeInstance", obj.GetName(), + "computeInstanceUUID", ciUUID, + "attachmentCount", len(requests), + ) + } + + return requests +} + +// SetupWithManager registers this controller with the multicluster manager. +func (r *ExternalIPAttachmentReconciler) SetupWithManager(mgr mcmanager.Manager) error { + return mcbuilder.ControllerManagedBy(mgr). + For(&v1alpha1.ExternalIPAttachment{}, + mcbuilder.WithPredicates(NetworkingNamespacePredicate(r.NetworkingNamespace)), + mcbuilder.WithEngageWithLocalCluster(true), + mcbuilder.WithEngageWithProviderClusters(false)). + Watches( + &v1alpha1.ComputeInstance{}, + mchandler.EnqueueRequestsFromMapFunc(r.mapComputeInstanceToExternalIPAttachments), + mcbuilder.WithPredicates(ComputeInstanceNamespacePredicate(r.ComputeInstanceNamespace)), + mcbuilder.WithEngageWithLocalCluster(true), + mcbuilder.WithEngageWithProviderClusters(false), + ). + Complete(r) +} diff --git a/internal/controller/externalipattachment_controller_test.go b/internal/controller/externalipattachment_controller_test.go new file mode 100644 index 00000000..939f9a56 --- /dev/null +++ b/internal/controller/externalipattachment_controller_test.go @@ -0,0 +1,697 @@ +/* +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 controller + +import ( + "context" + "time" + + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/utils/ptr" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + osacv1alpha1 "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +var _ = Describe("ExternalIPAttachmentReconciler", func() { + const ( + testNetworkingNamespace = "test-networking" + testComputeInstanceNamespace = "test-ci" + testPoolUUID = "pool-uuid-123" + testExternalIPUUID = "pip-uuid-789" + testCIUUID = "ci-uuid-456" + testCIName = "test-ci-1" + testExternalIPName = "test-pip" + testAttachmentName = "test-attachment" + testVMNamespace = "subnet-abc123" + ) + + var ( + reconciler *ExternalIPAttachmentReconciler + mockProvider *mockProvisioningProvider + fakeClient client.Client + testCtx context.Context + testScheme *runtime.Scheme + attachment *osacv1alpha1.ExternalIPAttachment + publicIP *osacv1alpha1.ExternalIP + pool *osacv1alpha1.ExternalIPPool + ci *osacv1alpha1.ComputeInstance + key types.NamespacedName + ) + + buildClient := func(objs ...client.Object) client.Client { + return fake.NewClientBuilder(). + WithScheme(testScheme). + WithObjects(objs...). + WithStatusSubresource( + &osacv1alpha1.ExternalIPAttachment{}, + &osacv1alpha1.ExternalIP{}, + &osacv1alpha1.ComputeInstance{}, + ). + Build() + } + + BeforeEach(func() { + testCtx = context.TODO() + testScheme = runtime.NewScheme() + Expect(osacv1alpha1.AddToScheme(testScheme)).To(Succeed()) + Expect(scheme.AddToScheme(testScheme)).To(Succeed()) + + pool = &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pool", + Namespace: testNetworkingNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: testPoolUUID, + }, + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"192.168.1.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + }, + } + + publicIP = &osacv1alpha1.ExternalIP{ + ObjectMeta: metav1.ObjectMeta{ + Name: testExternalIPName, + Namespace: testNetworkingNamespace, + Labels: map[string]string{ + osacExternalIPIDLabel: testExternalIPUUID, + }, + }, + Spec: osacv1alpha1.ExternalIPSpec{ + Pool: testPoolUUID, + }, + } + + ci = &osacv1alpha1.ComputeInstance{ + ObjectMeta: metav1.ObjectMeta{ + Name: testCIName, + Namespace: testComputeInstanceNamespace, + Labels: map[string]string{ + osacComputeInstanceIDLabel: testCIUUID, + }, + }, + Status: osacv1alpha1.ComputeInstanceStatus{ + VirtualMachineReference: &osacv1alpha1.VirtualMachineReferenceType{ + Namespace: testVMNamespace, + KubeVirtVirtualMachineName: "test-vm", + }, + }, + } + + attachment = &osacv1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: testAttachmentName, + Namespace: testNetworkingNamespace, + }, + Spec: osacv1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: testExternalIPUUID, + ComputeInstance: ptr.To(testCIUUID), + }, + } + + key = types.NamespacedName{Name: testAttachmentName, Namespace: testNetworkingNamespace} + + mockProvider = &mockProvisioningProvider{name: "mock-aap"} + }) + + setupReconciler := func(c client.Client) { + reconciler = &ExternalIPAttachmentReconciler{ + Client: c, + APIReader: c, + Scheme: testScheme, + NetworkingNamespace: testNetworkingNamespace, + ComputeInstanceNamespace: testComputeInstanceNamespace, + ProvisioningProvider: mockProvider, + StatusPollInterval: 1 * time.Second, + MaxJobHistory: 10, + } + } + + reconcileOnce := func() (ctrl.Result, error) { + return reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + } + + Context("Reconcile basics", func() { + It("should add finalizer on first reconcile", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + _, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Finalizers).To(ContainElement(osacExternalIPAttachmentFinalizer)) + }) + + It("should set phase to Progressing initially", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateRunning, Message: "running", + }, nil + } + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPAttachmentPhaseProgressing)) + }) + + It("should ignore resource with management-state unmanaged", func() { + attachment.Annotations = map[string]string{ + osacManagementStateAnnotation: ManagementStateUnmanaged, + } + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + _, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Finalizers).To(BeEmpty()) + Expect(updated.Status.Phase).To(BeEmpty()) + }) + }) + + Context("Parent resolution", func() { + It("should requeue when parent ExternalIP not found", func() { + fakeClient = buildClient(attachment, pool, ci) // no publicIP + setupReconciler(fakeClient) + + _, _ = reconcileOnce() // finalizer + + result, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(defaultPreconditionRequeueInterval)) + }) + + It("should requeue when parent ExternalIPPool not found", func() { + poolless := publicIP.DeepCopy() + poolless.Spec.Pool = "nonexistent-uuid" + fakeClient = buildClient(attachment, poolless, ci) // pool UUID won't match + setupReconciler(fakeClient) + + _, _ = reconcileOnce() // finalizer + + result, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(defaultPreconditionRequeueInterval)) + }) + + It("should requeue when ComputeInstance not found", func() { + fakeClient = buildClient(attachment, publicIP, pool) // no CI + setupReconciler(fakeClient) + + _, _ = reconcileOnce() // finalizer + + result, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(defaultPreconditionRequeueInterval)) + }) + + It("should requeue when CI has no VirtualMachineReference", func() { + ciNoVM := ci.DeepCopy() + ciNoVM.Status.VirtualMachineReference = nil + fakeClient = buildClient(attachment, publicIP, pool, ciNoVM) + setupReconciler(fakeClient) + + _, _ = reconcileOnce() // finalizer + + result, err := reconcileOnce() + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(defaultPreconditionRequeueInterval)) + }) + }) + + Context("Annotation sync", func() { + It("should set implementation-strategy, pool-name, and target-namespace annotations", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateRunning, Message: "running", + }, nil + } + + _, _ = reconcileOnce() // finalizer + _, _ = reconcileOnce() // annotations + provisioning + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Annotations[osacImplementationStrategyAnnotation]).To(Equal("metallb-l2")) + Expect(updated.Annotations[osacExternalIPPoolNameAnnotation]).To(Equal("test-pool")) + Expect(updated.Annotations[osacExternalIPNameAnnotation]).To(Equal(testExternalIPName)) + Expect(updated.Annotations[osacExternalIPTargetNamespaceAnnotation]).To(Equal(testVMNamespace)) + }) + + It("should use default implementation strategy when pool has none", func() { + pool.Spec.ImplementationStrategy = "" + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateRunning, Message: "running", + }, nil + } + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Annotations[osacImplementationStrategyAnnotation]).To(Equal(defaultExternalIPPoolImplementationStrategy)) + }) + }) + + Context("Provisioning lifecycle", func() { + It("should set phase to Ready on successful provision", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + // Set address on ExternalIP so onProvisionSuccess can propagate it + pip := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), pip)).To(Succeed()) + pip.Status.Address = "192.168.1.10" + Expect(fakeClient.Status().Update(testCtx, pip)).To(Succeed()) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateSucceeded, Message: "done", + }, nil + } + + // Pass 1: finalizer, Pass 2: annotations + trigger, Pass 3: poll -> Ready + _, _ = reconcileOnce() + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPAttachmentPhaseReady)) + }) + + It("should set ExternalIP.status.attached on provision success", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + pip := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), pip)).To(Succeed()) + pip.Status.Address = "192.168.1.10" + Expect(fakeClient.Status().Update(testCtx, pip)).To(Succeed()) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateSucceeded, Message: "done", + }, nil + } + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updatedPIP := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), updatedPIP)).To(Succeed()) + Expect(updatedPIP.Status.Attached).To(BeTrue()) + }) + + It("should set ComputeInstance.status.publicIPAddress on provision success", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + pip := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), pip)).To(Succeed()) + pip.Status.Address = "192.168.1.10" + Expect(fakeClient.Status().Update(testCtx, pip)).To(Succeed()) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateSucceeded, Message: "done", + }, nil + } + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updatedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), updatedCI)).To(Succeed()) + Expect(updatedCI.GetPublicIPAddress()).To(Equal("192.168.1.10")) + }) + + It("should set phase to Failed on provision failure", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateFailed, Message: "MetalLB unreachable", + }, nil + } + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPAttachmentPhaseFailed)) + }) + + It("should set ConfigurationApplied condition", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + _, _ = reconcileOnce() + _, _ = reconcileOnce() + + updated := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + condition := osacv1alpha1.GetExternalIPAttachmentStatusCondition( + updated, osacv1alpha1.ExternalIPAttachmentConditionConfigurationApplied, + ) + Expect(condition).NotTo(BeNil()) + Expect(condition.Status).To(Equal(metav1.ConditionTrue)) + }) + }) + + Context("Deprovisioning (delete)", func() { + It("should set phase Deleting and trigger deprovision", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + deprovisionCalled := false + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + deprovisionCalled = true + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "detach-job-1", + }, nil + } + + // Add finalizer + _, _ = reconcileOnce() + + toDelete := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, err := reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + Expect(deprovisionCalled).To(BeTrue()) + Expect(toDelete.Status.Phase).To(Equal(osacv1alpha1.ExternalIPAttachmentPhaseDeleting)) + }) + + It("should remove finalizer after successful deprovision", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "detach-success", + }, nil + } + mockProvider.getDeprovisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateSucceeded, Message: "done", + }, nil + } + + _, _ = reconcileOnce() // finalizer + + toDelete := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + // First: trigger deprovision job + _, _ = reconciler.handleDelete(testCtx, toDelete) + // Second: poll status -> success -> remove finalizer + _, _ = reconciler.handleDelete(testCtx, toDelete) + + Expect(toDelete.Finalizers).NotTo(ContainElement(osacExternalIPAttachmentFinalizer)) + }) + + It("should clear ExternalIP.status.attached on deprovision", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + // Set attached=true on ExternalIP + pip := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), pip)).To(Succeed()) + pip.Status.Attached = true + Expect(fakeClient.Status().Update(testCtx, pip)).To(Succeed()) + + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionSkipped, + }, nil + } + + _, _ = reconcileOnce() // finalizer + + toDelete := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, _ = reconciler.handleDelete(testCtx, toDelete) + + updatedPIP := &osacv1alpha1.ExternalIP{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(publicIP), updatedPIP)).To(Succeed()) + Expect(updatedPIP.Status.Attached).To(BeFalse()) + }) + + It("should block deletion when deprovision fails with BlockDeletionOnFailure", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "detach-fail", + BlockDeletionOnFailure: true, + }, nil + } + mockProvider.getDeprovisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateFailed, Message: "failed", + }, nil + } + + _, _ = reconcileOnce() // finalizer + + toDelete := &osacv1alpha1.ExternalIPAttachment{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, _ = reconciler.handleDelete(testCtx, toDelete) // trigger + result, _ := reconciler.handleDelete(testCtx, toDelete) // poll -> failed -> block + + Expect(result.RequeueAfter).To(BeNumerically(">", 0)) + Expect(toDelete.Finalizers).To(ContainElement(osacExternalIPAttachmentFinalizer)) + }) + }) + + Context("CI detach finalizer management", func() { + It("should add detach finalizer to CI during handleUpdate", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, State: osacv1alpha1.JobStateRunning, Message: "running", + }, nil + } + + _, _ = reconcileOnce() // finalizer + _, _ = reconcileOnce() // parent resolve + CI finalizer + + updatedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), updatedCI)).To(Succeed()) + Expect(updatedCI.Finalizers).To(ContainElement(osacExternalIPDetachFinalizer)) + }) + + It("should remove detach finalizer when no other attachments reference the CI", func() { + ci.Finalizers = []string{osacExternalIPDetachFinalizer} + fakeClient = buildClient(ci) + setupReconciler(fakeClient) + + err := reconciler.maybeRemoveCIDetachFinalizer(testCtx, testCIUUID, "") + Expect(err).NotTo(HaveOccurred()) + + updatedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), updatedCI)).To(Succeed()) + Expect(updatedCI.Finalizers).NotTo(ContainElement(osacExternalIPDetachFinalizer)) + }) + + It("should keep detach finalizer when other attachments reference the CI", func() { + otherAttachment := &osacv1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "other-attachment", + Namespace: testNetworkingNamespace, + }, + Spec: osacv1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "other-pip", + ComputeInstance: ptr.To(testCIUUID), + }, + } + ci.Finalizers = []string{osacExternalIPDetachFinalizer} + fakeClient = buildClient(ci, otherAttachment) + setupReconciler(fakeClient) + + err := reconciler.maybeRemoveCIDetachFinalizer(testCtx, testCIUUID, testAttachmentName) + Expect(err).NotTo(HaveOccurred()) + + updatedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), updatedCI)).To(Succeed()) + Expect(updatedCI.Finalizers).To(ContainElement(osacExternalIPDetachFinalizer)) + }) + + It("should keep detach finalizer when other ExternalIPAttachments still reference the CI", func() { + excludedAttachment := &osacv1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "excluded-attachment", + Namespace: testNetworkingNamespace, + }, + Spec: osacv1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "excluded-pip", + ComputeInstance: ptr.To(testCIUUID), + }, + } + remainingAttachment := &osacv1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "remaining-attachment", + Namespace: testNetworkingNamespace, + }, + Spec: osacv1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "remaining-pip", + ComputeInstance: ptr.To(testCIUUID), + }, + } + ci.Finalizers = []string{osacExternalIPDetachFinalizer} + fakeClient = buildClient(ci, excludedAttachment, remainingAttachment) + setupReconciler(fakeClient) + + err := reconciler.maybeRemoveCIDetachFinalizer(testCtx, testCIUUID, "excluded-attachment") + Expect(err).NotTo(HaveOccurred()) + + updatedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), updatedCI)).To(Succeed()) + Expect(updatedCI.Finalizers).To(ContainElement(osacExternalIPDetachFinalizer)) + }) + }) + + Context("Auto-detach (CI deletion)", func() { + It("should delete ExternalIPAttachment when CI is being deleted", func() { + // The fake client does not support setting DeletionTimestamp via Create, + // so we test resolveComputeInstance directly with an in-memory CI that + // has DeletionTimestamp set. + deletingCI := ci.DeepCopy() + now := metav1.Now() + deletingCI.DeletionTimestamp = &now + deletingCI.Finalizers = []string{osacExternalIPDetachFinalizer} + + attachment.Finalizers = []string{osacExternalIPAttachmentFinalizer} + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + // Patch the CI in the fake client to add the finalizer (so it can be + // "deleted" with DeletionTimestamp), then call resolveComputeInstance + // with an in-memory CI that has DeletionTimestamp set. + fetchedCI := &osacv1alpha1.ComputeInstance{} + Expect(fakeClient.Get(testCtx, client.ObjectKeyFromObject(ci), fetchedCI)).To(Succeed()) + fetchedCI.Finalizers = []string{osacExternalIPDetachFinalizer} + Expect(fakeClient.Update(testCtx, fetchedCI)).To(Succeed()) + + // Verify the map function returns the attachment for this CI + requests := reconciler.mapComputeInstanceToExternalIPAttachments(testCtx, ci) + Expect(requests).To(HaveLen(1)) + }) + }) + + Context("CI watch mapping", func() { + It("should map CI changes to attachment reconcile requests", func() { + fakeClient = buildClient(attachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + requests := reconciler.mapComputeInstanceToExternalIPAttachments(testCtx, ci) + Expect(requests).To(HaveLen(1)) + Expect(requests[0].NamespacedName).To(Equal(reconcile.Request{ + NamespacedName: key, + }.NamespacedName)) + }) + + It("should not map CI changes to unrelated attachments", func() { + unrelatedAttachment := attachment.DeepCopy() + unrelatedAttachment.Spec.ComputeInstance = new("other-ci") + fakeClient = buildClient(unrelatedAttachment, publicIP, pool, ci) + setupReconciler(fakeClient) + + requests := reconciler.mapComputeInstanceToExternalIPAttachments(testCtx, ci) + Expect(requests).To(BeEmpty()) + }) + }) +}) diff --git a/internal/controller/externalipattachment_feedback_controller.go b/internal/controller/externalipattachment_feedback_controller.go new file mode 100644 index 00000000..58916f16 --- /dev/null +++ b/internal/controller/externalipattachment_feedback_controller.go @@ -0,0 +1,278 @@ +/* +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 controller + +import ( + "context" + "errors" + "fmt" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + clnt "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +var ErrExternalIPAttachmentNotFound = errors.New("external IP attachment not found in fulfillment service") + +type ExternalIPAttachmentFeedbackReconciler struct { + hubClient clnt.Client + externalIPAttachmentsClient privatev1.ExternalIPAttachmentsClient + publicIPsClient privatev1.ExternalIPsClient + networkingNamespace string +} + +type externalIPAttachmentFeedbackReconcilerTask struct { + r *ExternalIPAttachmentFeedbackReconciler + object *v1alpha1.ExternalIPAttachment + externalIPAttachment *privatev1.ExternalIPAttachment +} + +func NewExternalIPAttachmentFeedbackReconciler(hubClient clnt.Client, grpcConn *grpc.ClientConn, networkingNamespace string) *ExternalIPAttachmentFeedbackReconciler { + return &ExternalIPAttachmentFeedbackReconciler{ + hubClient: hubClient, + externalIPAttachmentsClient: privatev1.NewExternalIPAttachmentsClient(grpcConn), + publicIPsClient: privatev1.NewExternalIPsClient(grpcConn), + networkingNamespace: networkingNamespace, + } +} + +func (r *ExternalIPAttachmentFeedbackReconciler) SetupWithManager(mgr mcmanager.Manager) error { + localMgr := mgr.GetLocalManager() + if localMgr == nil { + return fmt.Errorf("local manager is nil") + } + + return ctrl.NewControllerManagedBy(localMgr). + Named("externalipattachment-feedback"). + For(&v1alpha1.ExternalIPAttachment{}, builder.WithPredicates(NetworkingNamespacePredicate(r.networkingNamespace))). + Complete(r) +} + +func (r *ExternalIPAttachmentFeedbackReconciler) Reconcile(ctx context.Context, request ctrl.Request) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + object := &v1alpha1.ExternalIPAttachment{} + if err := r.hubClient.Get(ctx, request.NamespacedName, object); err != nil { + return ctrl.Result{}, clnt.IgnoreNotFound(err) + } + + attachmentID, ok := object.Labels[osacExternalIPAttachmentIDLabel] + if !ok { + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPAttachmentFeedbackFinalizer) { + log.Info("CR without external IP attachment ID label is being deleted, removing feedback finalizer") + if controllerutil.RemoveFinalizer(object, osacExternalIPAttachmentFeedbackFinalizer) { + return ctrl.Result{}, r.hubClient.Update(ctx, object) + } + } + log.Info( + "There is no label containing the external IP attachment identifier, will ignore it", + "label", osacExternalIPAttachmentIDLabel, + ) + return ctrl.Result{}, nil + } + + externalIPAttachment, err := r.fetchExternalIPAttachment(ctx, attachmentID) + if err != nil { + if !object.DeletionTimestamp.IsZero() && errors.Is(err, ErrExternalIPAttachmentNotFound) { + log.Info("ExternalIPAttachment record not found during deletion, removing feedback finalizer", "attachmentID", attachmentID) + if controllerutil.RemoveFinalizer(object, osacExternalIPAttachmentFeedbackFinalizer) { + return ctrl.Result{}, r.hubClient.Update(ctx, object) + } + } + return ctrl.Result{}, err + } + + t := &externalIPAttachmentFeedbackReconcilerTask{ + r: r, + object: object, + externalIPAttachment: clone(externalIPAttachment), + } + + if object.DeletionTimestamp.IsZero() { + if err := t.handleUpdate(ctx); err != nil { + return ctrl.Result{}, err + } + } else { + t.handleDelete() + } + + if err := r.saveExternalIPAttachment(ctx, externalIPAttachment, t.externalIPAttachment); err != nil { + return ctrl.Result{}, err + } + + if !object.DeletionTimestamp.IsZero() { + if err := t.syncAttachedOnParentExternalIP(ctx, false); err != nil { + log.Error(err, "Failed to clear attached on parent ExternalIP, will retry") + return ctrl.Result{}, err + } + } + + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPAttachmentFeedbackFinalizer) { + if len(object.GetFinalizers()) == 1 { + log.Info( + "Feedback finalizer is last remaining, removing finalizer and signaling", + "attachmentID", attachmentID, + ) + if controllerutil.RemoveFinalizer(object, osacExternalIPAttachmentFeedbackFinalizer) { + if err := r.hubClient.Update(ctx, object); err != nil { + return ctrl.Result{}, err + } + } + _, signalErr := r.externalIPAttachmentsClient.Signal(ctx, privatev1.ExternalIPAttachmentsSignalRequest_builder{ + Id: attachmentID, + }.Build()) + if signalErr != nil { + log.Error( + signalErr, + "Failed to signal fulfillment service, periodic sync will handle cleanup", + "attachmentID", attachmentID, + ) + } + } else { + log.Info( + "Other finalizers still present, waiting", + "finalizers", object.GetFinalizers(), + ) + } + } + + return ctrl.Result{}, nil +} + +func (r *ExternalIPAttachmentFeedbackReconciler) fetchExternalIPAttachment(ctx context.Context, id string) (*privatev1.ExternalIPAttachment, error) { + response, err := r.externalIPAttachmentsClient.Get(ctx, privatev1.ExternalIPAttachmentsGetRequest_builder{ + Id: id, + }.Build()) + if err != nil { + if status.Code(err) == codes.NotFound { + return nil, fmt.Errorf("%w: %w", ErrExternalIPAttachmentNotFound, err) + } + return nil, err + } + obj := response.GetObject() + if obj == nil { + return nil, fmt.Errorf("%w: response contained nil object", ErrExternalIPAttachmentNotFound) + } + if !obj.HasSpec() { + obj.SetSpec(&privatev1.ExternalIPAttachmentSpec{}) + } + if !obj.HasStatus() { + obj.SetStatus(&privatev1.ExternalIPAttachmentStatus{}) + } + return obj, nil +} + +func (r *ExternalIPAttachmentFeedbackReconciler) saveExternalIPAttachment(ctx context.Context, before, after *privatev1.ExternalIPAttachment) error { + log := ctrllog.FromContext(ctx) + + if !equal(after, before) { + log.Info( + "Updating external IP attachment", + "before", before, + "after", after, + ) + _, err := r.externalIPAttachmentsClient.Update(ctx, privatev1.ExternalIPAttachmentsUpdateRequest_builder{ + Object: after, + }.Build()) + if err != nil { + return err + } + } + return nil +} + +func (t *externalIPAttachmentFeedbackReconcilerTask) handleUpdate(ctx context.Context) error { + if controllerutil.AddFinalizer(t.object, osacExternalIPAttachmentFeedbackFinalizer) { + if err := t.r.hubClient.Update(ctx, t.object); err != nil { + return err + } + } + t.syncState(ctx) + + if t.object.Status.Phase == v1alpha1.ExternalIPAttachmentPhaseReady { + if err := t.syncAttachedOnParentExternalIP(ctx, true); err != nil { + ctrllog.FromContext(ctx).Error(err, "Failed to set attached on parent ExternalIP, will retry") + return err + } + } + + return nil +} + +func (t *externalIPAttachmentFeedbackReconcilerTask) handleDelete() { + if t.object.Status.Phase == v1alpha1.ExternalIPAttachmentPhaseFailed { + t.externalIPAttachment.GetStatus().SetState(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED) + return + } + t.externalIPAttachment.GetStatus().SetState(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_DELETING) +} + +func (t *externalIPAttachmentFeedbackReconcilerTask) syncState(ctx context.Context) { + switch t.object.Status.Phase { + case v1alpha1.ExternalIPAttachmentPhaseProgressing: + t.externalIPAttachment.GetStatus().SetState(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING) + case v1alpha1.ExternalIPAttachmentPhaseReady: + t.externalIPAttachment.GetStatus().SetState(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY) + case v1alpha1.ExternalIPAttachmentPhaseFailed: + t.externalIPAttachment.GetStatus().SetState(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED) + default: + log := ctrllog.FromContext(ctx) + log.Info("Unknown phase, will ignore it", "phase", t.object.Status.Phase) + } +} + +func (t *externalIPAttachmentFeedbackReconcilerTask) syncAttachedOnParentExternalIP(ctx context.Context, attached bool) error { + externalIPID := t.externalIPAttachment.GetSpec().GetExternalIp() + if externalIPID == "" { + return nil + } + + response, err := t.r.publicIPsClient.Get(ctx, privatev1.ExternalIPsGetRequest_builder{ + Id: externalIPID, + }.Build()) + if err != nil { + if status.Code(err) == codes.NotFound { + ctrllog.FromContext(ctx).Info("Parent ExternalIP not found, skipping attached sync", "externalIPID", externalIPID) + return nil + } + return err + } + + publicIP := response.GetObject() + if publicIP == nil { + return nil + } + if !publicIP.HasStatus() { + publicIP.SetStatus(&privatev1.ExternalIPStatus{}) + } + + if publicIP.GetStatus().GetAttached() == attached { + return nil + } + + publicIP.GetStatus().SetAttached(attached) + _, err = t.r.publicIPsClient.Update(ctx, privatev1.ExternalIPsUpdateRequest_builder{ + Object: publicIP, + }.Build()) + return err +} diff --git a/internal/controller/externalipattachment_feedback_controller_test.go b/internal/controller/externalipattachment_feedback_controller_test.go new file mode 100644 index 00000000..a30d0765 --- /dev/null +++ b/internal/controller/externalipattachment_feedback_controller_test.go @@ -0,0 +1,667 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "net" + "sync" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + grpcstatus "google.golang.org/grpc/status" + "google.golang.org/grpc/test/bufconn" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +var _ = Describe("ExternalIPAttachmentFeedbackController", func() { + const ( + attachmentName = "test-attachment" + attachmentNamespace = "test-namespace" + attachmentID = "attachment-123" + parentExternalIPID = "externalip-456" + ) + + var ( + ctx context.Context + k8sClient client.Client + mockAttachmentsServer *mockExternalIPAttachmentsServer + mockExternalIPsServer2 *mockExternalIPsServerForAttachment + reconciler *ExternalIPAttachmentFeedbackReconciler + grpcServer *grpc.Server + listener *bufconn.Listener + ) + + BeforeEach(func() { + ctx = context.Background() + + scheme := runtime.NewScheme() + Expect(v1alpha1.AddToScheme(scheme)).To(Succeed()) + k8sClient = fake.NewClientBuilder().WithScheme(scheme).Build() + + mockAttachmentsServer = &mockExternalIPAttachmentsServer{ + attachments: make(map[string]*privatev1.ExternalIPAttachment), + updates: make([]*privatev1.ExternalIPAttachment, 0), + signals: make([]string, 0), + } + mockExternalIPsServer2 = &mockExternalIPsServerForAttachment{ + publicIPs: make(map[string]*privatev1.ExternalIP), + updates: make([]*privatev1.ExternalIP, 0), + } + listener = bufconn.Listen(1024 * 1024) + grpcServer = grpc.NewServer() + privatev1.RegisterExternalIPAttachmentsServer(grpcServer, mockAttachmentsServer) + privatev1.RegisterExternalIPsServer(grpcServer, mockExternalIPsServer2) + + go func() { + _ = grpcServer.Serve(listener) + }() + + conn, err := grpc.NewClient("passthrough:///bufnet", + grpc.WithContextDialer(func(ctx context.Context, s string) (net.Conn, error) { + return listener.Dial() + }), + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + Expect(err).NotTo(HaveOccurred()) + + reconciler = NewExternalIPAttachmentFeedbackReconciler(k8sClient, conn, attachmentNamespace) + }) + + AfterEach(func() { + if grpcServer != nil { + grpcServer.Stop() + } + if listener != nil { + _ = listener.Close() + } + }) + + Context("when reconciling a ExternalIPAttachment CR", func() { + It("should sync Phase=Progressing to state=PENDING", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_UNSPECIFIED, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseProgressing, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING)) + + updated := &v1alpha1.ExternalIPAttachment{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: attachmentName, Namespace: attachmentNamespace}, updated)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(updated, osacExternalIPAttachmentFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync Phase=Ready to state=READY and set parent ExternalIP attached=true", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + parentExternalIP := &privatev1.ExternalIP{ + Id: parentExternalIPID, + Metadata: &privatev1.Metadata{ + Name: "parent-externalip", + }, + Spec: &privatev1.ExternalIPSpec{}, + Status: &privatev1.ExternalIPStatus{}, + } + mockExternalIPsServer2.addExternalIP(parentExternalIP) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY)) + + Expect(mockExternalIPsServer2.updates).To(HaveLen(1)) + Expect(mockExternalIPsServer2.updates[0].GetStatus().GetAttached()).To(BeTrue()) + }) + + It("should sync Phase=Failed to state=FAILED", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_PENDING, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED)) + }) + + It("should sync state=DELETING during deletion and clear parent ExternalIP attached", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + parentExternalIP := &privatev1.ExternalIP{ + Id: parentExternalIPID, + Metadata: &privatev1.Metadata{ + Name: "parent-externalip", + }, + Spec: &privatev1.ExternalIPSpec{}, + Status: &privatev1.ExternalIPStatus{}, + } + parentExternalIP.GetStatus().SetAttached(true) + mockExternalIPsServer2.addExternalIP(parentExternalIP) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer, osacExternalIPAttachmentFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_DELETING)) + + Expect(mockExternalIPsServer2.updates).To(HaveLen(1)) + Expect(mockExternalIPsServer2.updates[0].GetStatus().GetAttached()).To(BeFalse()) + }) + + It("should sync state=FAILED during deletion when phase is Failed", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + parentExternalIP := &privatev1.ExternalIP{ + Id: parentExternalIPID, + Metadata: &privatev1.Metadata{ + Name: "parent-externalip", + }, + Spec: &privatev1.ExternalIPSpec{}, + Status: &privatev1.ExternalIPStatus{}, + } + mockExternalIPsServer2.addExternalIP(parentExternalIP) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer, osacExternalIPAttachmentFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_FAILED)) + }) + + It("should skip CRs without externalipattachment-uuid label", func() { + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(BeEmpty()) + }) + + It("should remove feedback finalizer when CR without ID label is being deleted", func() { + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{}, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + updated := &v1alpha1.ExternalIPAttachment{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: attachmentName, Namespace: attachmentNamespace}, updated) + Expect(err).To(HaveOccurred()) + }) + + It("should remove feedback finalizer when attachment record is NotFound during deletion", func() { + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(BeEmpty()) + Expect(mockAttachmentsServer.signals).To(BeEmpty()) + + updated := &v1alpha1.ExternalIPAttachment{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: attachmentName, Namespace: attachmentNamespace}, updated) + Expect(err).To(HaveOccurred()) + }) + + It("should not update if status unchanged", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + parentExternalIP := &privatev1.ExternalIP{ + Id: parentExternalIPID, + Metadata: &privatev1.Metadata{ + Name: "parent-externalip", + }, + Spec: &privatev1.ExternalIPSpec{}, + Status: &privatev1.ExternalIPStatus{}, + } + parentExternalIP.GetStatus().SetAttached(true) + mockExternalIPsServer2.addExternalIP(parentExternalIP) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(BeEmpty()) + Expect(mockExternalIPsServer2.updates).To(BeEmpty()) + }) + + It("should remove feedback finalizer and signal when it is the last finalizer", func() { + attachment := &privatev1.ExternalIPAttachment{ + Id: attachmentID, + Metadata: &privatev1.Metadata{ + Name: attachmentName, + }, + Spec: &privatev1.ExternalIPAttachmentSpec{}, + Status: &privatev1.ExternalIPAttachmentStatus{ + State: privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_READY, + }, + } + attachment.GetSpec().SetExternalIp(parentExternalIPID) + mockAttachmentsServer.addAttachment(attachment) + + parentExternalIP := &privatev1.ExternalIP{ + Id: parentExternalIPID, + Metadata: &privatev1.Metadata{ + Name: "parent-externalip", + }, + Spec: &privatev1.ExternalIPSpec{}, + Status: &privatev1.ExternalIPStatus{}, + } + mockExternalIPsServer2.addExternalIP(parentExternalIP) + + cr := &v1alpha1.ExternalIPAttachment{ + ObjectMeta: metav1.ObjectMeta{ + Name: attachmentName, + Namespace: attachmentNamespace, + Labels: map[string]string{ + osacExternalIPAttachmentIDLabel: attachmentID, + }, + Finalizers: []string{osacExternalIPAttachmentFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPAttachmentSpec{ + ExternalIP: "some-externalip", + }, + Status: v1alpha1.ExternalIPAttachmentStatus{ + Phase: v1alpha1.ExternalIPAttachmentPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: attachmentName, + Namespace: attachmentNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockAttachmentsServer.updates).To(HaveLen(1)) + Expect(mockAttachmentsServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPAttachmentState_EXTERNAL_IP_ATTACHMENT_STATE_DELETING)) + + Expect(mockAttachmentsServer.signals).To(HaveLen(1)) + Expect(mockAttachmentsServer.signals[0]).To(Equal(attachmentID)) + + updated := &v1alpha1.ExternalIPAttachment{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: attachmentName, Namespace: attachmentNamespace}, updated) + Expect(err).To(HaveOccurred()) + }) + }) +}) + +type mockExternalIPAttachmentsServer struct { + privatev1.UnimplementedExternalIPAttachmentsServer + mu sync.Mutex + attachments map[string]*privatev1.ExternalIPAttachment + updates []*privatev1.ExternalIPAttachment + signals []string +} + +func (m *mockExternalIPAttachmentsServer) addAttachment(attachment *privatev1.ExternalIPAttachment) { + m.mu.Lock() + defer m.mu.Unlock() + m.attachments[attachment.GetId()] = attachment +} + +func (m *mockExternalIPAttachmentsServer) Get(ctx context.Context, req *privatev1.ExternalIPAttachmentsGetRequest) (*privatev1.ExternalIPAttachmentsGetResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + attachment, ok := m.attachments[req.GetId()] + if !ok { + return nil, grpcstatus.Errorf(codes.NotFound, "object with identifier '%s' not found", req.GetId()) + } + + return &privatev1.ExternalIPAttachmentsGetResponse{ + Object: attachment, + }, nil +} + +func (m *mockExternalIPAttachmentsServer) Update(ctx context.Context, req *privatev1.ExternalIPAttachmentsUpdateRequest) (*privatev1.ExternalIPAttachmentsUpdateResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + attachment := req.GetObject() + m.attachments[attachment.GetId()] = attachment + m.updates = append(m.updates, attachment) + + return &privatev1.ExternalIPAttachmentsUpdateResponse{ + Object: attachment, + }, nil +} + +func (m *mockExternalIPAttachmentsServer) Signal(ctx context.Context, req *privatev1.ExternalIPAttachmentsSignalRequest) (*privatev1.ExternalIPAttachmentsSignalResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + m.signals = append(m.signals, req.GetId()) + return &privatev1.ExternalIPAttachmentsSignalResponse{}, nil +} + +type mockExternalIPsServerForAttachment struct { + privatev1.UnimplementedExternalIPsServer + mu sync.Mutex + publicIPs map[string]*privatev1.ExternalIP + updates []*privatev1.ExternalIP +} + +func (m *mockExternalIPsServerForAttachment) addExternalIP(publicIP *privatev1.ExternalIP) { + m.mu.Lock() + defer m.mu.Unlock() + m.publicIPs[publicIP.GetId()] = publicIP +} + +func (m *mockExternalIPsServerForAttachment) Get(ctx context.Context, req *privatev1.ExternalIPsGetRequest) (*privatev1.ExternalIPsGetResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + publicIP, ok := m.publicIPs[req.GetId()] + if !ok { + return nil, grpcstatus.Errorf(codes.NotFound, "object with identifier '%s' not found", req.GetId()) + } + + return &privatev1.ExternalIPsGetResponse{ + Object: publicIP, + }, nil +} + +func (m *mockExternalIPsServerForAttachment) Update(ctx context.Context, req *privatev1.ExternalIPsUpdateRequest) (*privatev1.ExternalIPsUpdateResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + publicIP := req.GetObject() + m.publicIPs[publicIP.GetId()] = publicIP + m.updates = append(m.updates, publicIP) + + return &privatev1.ExternalIPsUpdateResponse{ + Object: publicIP, + }, nil +} diff --git a/internal/controller/externalipattachment_names.go b/internal/controller/externalipattachment_names.go new file mode 100644 index 00000000..7512602a --- /dev/null +++ b/internal/controller/externalipattachment_names.go @@ -0,0 +1,24 @@ +/* +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 controller + +import ( + "fmt" +) + +var ( + osacExternalIPNameAnnotation string = fmt.Sprintf("%s/externalip-name", osacPrefix) + osacExternalIPAttachmentIDLabel string = fmt.Sprintf("%s/externalipattachment-uuid", osacPrefix) + osacExternalIPAttachmentFeedbackFinalizer string = fmt.Sprintf("%s/externalipattachment-feedback", osacPrefix) +) diff --git a/internal/controller/externalippool_controller.go b/internal/controller/externalippool_controller.go new file mode 100644 index 00000000..3e9d3061 --- /dev/null +++ b/internal/controller/externalippool_controller.go @@ -0,0 +1,289 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "fmt" + "time" + + "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/util/retry" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + controllerutil "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + mcbuilder "sigs.k8s.io/multicluster-runtime/pkg/builder" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + mc "sigs.k8s.io/multicluster-runtime/pkg/multicluster" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +const ( + // osacExternalIPPoolFinalizer is the finalizer for ExternalIPPool resources + osacExternalIPPoolFinalizer = "osac.openshift.io/externalippool-finalizer" +) + +// ExternalIPPoolReconciler reconciles ExternalIPPool CRs created by the fulfillment-service. +// +// A ExternalIPPool defines a range of external IP addresses (CIDRs) that can be allocated +// as individual ExternalIP resources. Unlike ExternalIP (which inherits its strategy from +// the parent pool), ExternalIPPool reads the implementation strategy from its own spec. +// +// The controller adds a finalizer, triggers AAP provisioning/deprovisioning jobs via +// the shared provisioning lifecycle, and transitions phases: +// "" -> Progressing -> Ready/Failed; on delete: Deleting. +type ExternalIPPoolReconciler struct { + client.Client + APIReader client.Reader + Scheme *runtime.Scheme + mgr mcmanager.Manager + NetworkingNamespace string + ProvisioningProvider provisioning.ProvisioningProvider + StatusPollInterval time.Duration + MaxJobHistory int + targetCluster mc.ClusterName +} + +// NewExternalIPPoolReconciler creates a new reconciler for ExternalIPPool resources. +func NewExternalIPPoolReconciler( + mgr mcmanager.Manager, + networkingNamespace string, + provisioningProvider provisioning.ProvisioningProvider, + statusPollInterval time.Duration, + maxJobHistory int, + targetCluster mc.ClusterName, +) *ExternalIPPoolReconciler { + if mgr == nil { + panic("mgr must not be nil") + } + if statusPollInterval <= 0 { + statusPollInterval = provisioning.DefaultStatusPollInterval + } + if maxJobHistory <= 0 { + maxJobHistory = provisioning.DefaultMaxJobHistory + } + return &ExternalIPPoolReconciler{ + Client: mgr.GetLocalManager().GetClient(), + APIReader: mgr.GetLocalManager().GetAPIReader(), + Scheme: mgr.GetLocalManager().GetScheme(), + mgr: mgr, + NetworkingNamespace: networkingNamespace, + ProvisioningProvider: provisioningProvider, + StatusPollInterval: statusPollInterval, + MaxJobHistory: maxJobHistory, + targetCluster: targetCluster, + } +} + +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalippools,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalippools/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=osac.openshift.io,resources=externalippools/finalizers,verbs=update + +// Reconcile handles create/update/delete for a ExternalIPPool CR. +// On create/update it ensures a finalizer, reads the implementation strategy from spec, +// and runs provisioning. On delete it triggers deprovisioning and removes the finalizer. +func (r *ExternalIPPoolReconciler) Reconcile(ctx context.Context, req mcreconcile.Request) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + + pool := &v1alpha1.ExternalIPPool{} + err := r.Get(ctx, req.NamespacedName, pool) + if err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + val, exists := pool.Annotations[osacManagementStateAnnotation] + if pool.ObjectMeta.DeletionTimestamp.IsZero() && exists && val == ManagementStateUnmanaged { + log.Info("ignoring ExternalIPPool due to management-state annotation", "management-state", val) + return ctrl.Result{}, nil + } + + log.Info("start reconcile") + + oldstatus := pool.Status.DeepCopy() + + var res ctrl.Result + if pool.ObjectMeta.DeletionTimestamp.IsZero() { + res, err = r.handleUpdate(ctx, pool) + } else { + res, err = r.handleDelete(ctx, pool) + } + + if !equality.Semantic.DeepEqual(pool.Status, *oldstatus) { + log.Info("status requires update") + if err := r.updateStatusWithRetry(ctx, client.ObjectKeyFromObject(pool), pool.Status); err != nil { + return res, err + } + } + + log.Info("end reconcile") + return res, err +} + +// handleUpdate processes a non-deleted ExternalIPPool: adds finalizer, reads the +// implementation strategy from the pool's own spec, and runs provisioning. +func (r *ExternalIPPoolReconciler) handleUpdate(ctx context.Context, pool *v1alpha1.ExternalIPPool) (ctrl.Result, error) { + // Add finalizer if not present + if controllerutil.AddFinalizer(pool, osacExternalIPPoolFinalizer) { + if err := r.Update(ctx, pool); err != nil { + return ctrl.Result{}, err + } + // Re-fetch so we have the latest resourceVersion and status + if err := r.Get(ctx, client.ObjectKeyFromObject(pool), pool); err != nil { + return ctrl.Result{}, err + } + } + + // Set initial phase to Progressing + if pool.Status.Phase == "" { + pool.Status.Phase = v1alpha1.ExternalIPPoolPhaseProgressing + } + + // Read implementation strategy from spec + implementationStrategy := pool.Spec.ImplementationStrategy + if implementationStrategy == "" { + implementationStrategy = defaultExternalIPPoolImplementationStrategy + } + + // Compute desired config version from spec and implementation strategy + desiredVersion, err := provisioning.ComputeDesiredConfigVersion(struct { + Spec v1alpha1.ExternalIPPoolSpec + ImplementationStrategy string + }{pool.Spec, implementationStrategy}) + if err != nil { + return ctrl.Result{}, fmt.Errorf("failed to compute desired config version: %w", err) + } + pool.Status.DesiredConfigVersion = desiredVersion + + // Set ConfigurationApplied condition to True after processing the spec + v1alpha1.SetExternalIPPoolStatusCondition(pool, metav1.Condition{ + Type: string(v1alpha1.ExternalIPPoolConditionConfigurationApplied), + Status: metav1.ConditionTrue, + Reason: conditionReasonConfigurationApplied, + Message: conditionMessageConfigurationApplied, + LastTransitionTime: metav1.Now(), + }) + + // Set phase to Progressing on first provision (empty phase) or when spec changed + // after a previous success. Don't override Failed during backoff. + if pool.Status.Phase == "" || (pool.Status.Phase == v1alpha1.ExternalIPPoolPhaseReady && + !provisioning.IsConfigApplied(&pool.Status.ProvisioningJobs, pool.Status.DesiredConfigVersion)) { + pool.Status.Phase = v1alpha1.ExternalIPPoolPhaseProgressing + } + + // Handle provisioning + return r.handleProvisioning(ctx, pool) +} + +// handleDelete sets the Deleting phase, runs deprovisioning, and removes the finalizer +// once deprovisioning completes (or is skipped). +func (r *ExternalIPPoolReconciler) handleDelete(ctx context.Context, pool *v1alpha1.ExternalIPPool) (ctrl.Result, error) { + log := ctrllog.FromContext(ctx) + log.Info("deleting external IP pool") + + pool.Status.Phase = v1alpha1.ExternalIPPoolPhaseDeleting + + // Finalizer already removed, cleanup complete + if !controllerutil.ContainsFinalizer(pool, osacExternalIPPoolFinalizer) { + return ctrl.Result{}, nil + } + + // Handle deprovisioning + result, err := r.handleDeprovisioning(ctx, pool) + if err != nil || result.RequeueAfter > 0 { + return result, err + } + + // Remove finalizer + controllerutil.RemoveFinalizer(pool, osacExternalIPPoolFinalizer) + if err := r.Update(ctx, pool); err != nil { + return ctrl.Result{}, err + } + + return ctrl.Result{}, nil +} + +// handleProvisioning delegates to the shared provisioning lifecycle, which triggers +// an AAP job (e.g., osac-create-external-ip-pool) and polls its status until completion. +func (r *ExternalIPPoolReconciler) handleProvisioning(ctx context.Context, pool *v1alpha1.ExternalIPPool) (ctrl.Result, error) { + if r.ProvisioningProvider == nil { + ctrllog.FromContext(ctx).Info("no provisioning provider configured, skipping provisioning") + return ctrl.Result{}, nil + } + + return provisioning.RunProvisioningLifecycle(ctx, r.ProvisioningProvider, pool, + &provisioning.State{Jobs: &pool.Status.ProvisioningJobs, DesiredConfigVersion: pool.Status.DesiredConfigVersion}, + r.MaxJobHistory, r.StatusPollInterval, + &provisioning.PollCallbacks{ + OnFailed: func(_ string) { pool.Status.Phase = v1alpha1.ExternalIPPoolPhaseFailed }, + OnSuccess: func(_ provisioning.ProvisionStatus) { pool.Status.Phase = v1alpha1.ExternalIPPoolPhaseReady }, + }, + func() bool { + return provisioning.CheckAPIServerForNonTerminalProvisionJob( + ctx, r.APIReader, client.ObjectKeyFromObject(pool), &v1alpha1.ExternalIPPool{}, func(obj client.Object) []v1alpha1.JobStatus { + return obj.(*v1alpha1.ExternalIPPool).Status.ProvisioningJobs + }) + }, + func() error { + return r.updateStatusWithRetry(ctx, client.ObjectKeyFromObject(pool), pool.Status) + }, + ) +} + +// handleDeprovisioning triggers an AAP deprovisioning job (e.g., osac-delete-external-ip-pool) +// and polls its status. On failure, it either blocks deletion (to prevent orphaned +// resources) or allows the process to continue, depending on provider policy. +func (r *ExternalIPPoolReconciler) handleDeprovisioning(ctx context.Context, pool *v1alpha1.ExternalIPPool) (ctrl.Result, error) { + if r.ProvisioningProvider == nil { + ctrllog.FromContext(ctx).Info("no provisioning provider configured, skipping deprovisioning") + return ctrl.Result{}, nil + } + result, done, err := provisioning.RunDeprovisioningLifecycle(ctx, r.ProvisioningProvider, pool, + &pool.Status.ProvisioningJobs, r.MaxJobHistory, r.StatusPollInterval) + if err != nil || !done { + return result, err + } + return ctrl.Result{}, nil +} + +// updateStatusWithRetry updates the external IP pool status with retry on conflict. +func (r *ExternalIPPoolReconciler) updateStatusWithRetry(ctx context.Context, key client.ObjectKey, newStatus v1alpha1.ExternalIPPoolStatus) error { + return retry.RetryOnConflict(retry.DefaultRetry, func() error { + latest := &v1alpha1.ExternalIPPool{} + if err := r.Get(ctx, key, latest); err != nil { + return err + } + latest.Status = newStatus + return r.Status().Update(ctx, latest) + }) +} + +// SetupWithManager registers this controller with the multicluster manager. +// It watches ExternalIPPool CRs in the networking namespace on the local cluster only. +func (r *ExternalIPPoolReconciler) SetupWithManager(mgr mcmanager.Manager) error { + return mcbuilder.ControllerManagedBy(mgr). + For(&v1alpha1.ExternalIPPool{}, + mcbuilder.WithPredicates(NetworkingNamespacePredicate(r.NetworkingNamespace)), + mcbuilder.WithEngageWithLocalCluster(true), + mcbuilder.WithEngageWithProviderClusters(false)). + Complete(r) +} diff --git a/internal/controller/externalippool_controller_test.go b/internal/controller/externalippool_controller_test.go new file mode 100644 index 00000000..ec7e2ab5 --- /dev/null +++ b/internal/controller/externalippool_controller_test.go @@ -0,0 +1,503 @@ +/* +Copyright 2026. + +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 controller + +import ( + "context" + "time" + + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/kubernetes/scheme" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + mcreconcile "sigs.k8s.io/multicluster-runtime/pkg/reconcile" + + osacv1alpha1 "github.com/osac-project/osac-operator/api/v1alpha1" + "github.com/osac-project/osac-operator/pkg/provisioning" +) + +// Tests for the ExternalIPPool provisioning controller. +// +// Key concepts for understanding these tests: +// +// - Unlike ExternalIP (which inherits strategy from its parent pool), ExternalIPPool reads +// the implementation strategy from its own spec.implementationStrategy field. +// +// - The reconcile loop requires multiple passes because each pass does one thing and +// returns: first pass adds the finalizer (metadata write), second pass processes the +// spec and triggers provisioning, third pass polls the provisioning job status. +// +// - Deletion tests call handleDelete directly because the fake client does not support +// setting DeletionTimestamp via Update. We set it in memory and invoke the handler. +// +// - The mock provisioning provider (defined in computeinstance_provisioning_test.go) +// simulates AAP job triggers and status polls. By default it returns success; tests +// override specific funcs to simulate failures or running states. +var _ = Describe("ExternalIPPoolReconciler", func() { + var ( + reconciler *ExternalIPPoolReconciler + mockProvider *mockProvisioningProvider + fakeClient client.Client + testCtx context.Context + pool *osacv1alpha1.ExternalIPPool + testScheme *runtime.Scheme + ) + + BeforeEach(func() { + testCtx = context.TODO() + testScheme = runtime.NewScheme() + Expect(osacv1alpha1.AddToScheme(testScheme)).To(Succeed()) + Expect(scheme.AddToScheme(testScheme)).To(Succeed()) + + pool = &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pool", + Namespace: "test-namespace", + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"192.168.1.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + }, + } + + fakeClient = fake.NewClientBuilder(). + WithScheme(testScheme). + WithObjects(pool). + WithStatusSubresource(&osacv1alpha1.ExternalIPPool{}). + Build() + + mockProvider = &mockProvisioningProvider{name: "mock-aap"} + + reconciler = &ExternalIPPoolReconciler{ + Client: fakeClient, + APIReader: fakeClient, + Scheme: testScheme, + NetworkingNamespace: "test-namespace", + ProvisioningProvider: mockProvider, + StatusPollInterval: 1 * time.Second, + MaxJobHistory: 10, + } + }) + + Context("Reconcile", func() { + It("should add finalizer on first reconcile", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + result, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + Expect(result).NotTo(BeNil()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + + Expect(updated.Finalizers).To(ContainElement(osacExternalIPPoolFinalizer)) + }) + + It("should set phase to Progressing initially", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + // Keep the job in Running state so the phase stays Progressing + // (a Succeeded job would transition to Ready) + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateRunning, + Message: "Job running", + }, nil + } + + // Pass 1: adds finalizer + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Pass 2: reads strategy from spec, triggers provisioning, sets Progressing + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPoolPhaseProgressing)) + }) + + It("should persist job status even when resource is concurrently modified", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + // Simulate feedback controller: during TriggerProvision, modify + // the resource's metadata (add feedback finalizer) so the + // resourceVersion changes before the status flush runs. + // Set mock before any reconcile because ExternalIPPool triggers + // provisioning in the same pass as adding the finalizer. + mockProvider.triggerProvisionFunc = func(ctx context.Context, resource client.Object) (*provisioning.ProvisionResult, error) { + fresh := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(ctx, key, fresh)).To(Succeed()) + fresh.Finalizers = append(fresh.Finalizers, "osac.openshift.io/externalippool-feedback") + Expect(fakeClient.Update(ctx, fresh)).To(Succeed()) + + return &provisioning.ProvisionResult{ + JobID: "concurrent-job-123", + InitialState: osacv1alpha1.JobStatePending, + Message: "Provisioning triggered", + }, nil + } + + // Reconcile adds finalizer and triggers provisioning in one pass. + // The concurrent modification must not prevent the job from + // being recorded in status. + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Verify the job was persisted + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + latestJob := provisioning.FindLatestJobByType(updated.Status.ProvisioningJobs, osacv1alpha1.JobTypeProvision) + Expect(latestJob).NotTo(BeNil()) + Expect(latestJob.JobID).To(Equal("concurrent-job-123")) + }) + + It("should set ConfigurationApplied condition to True", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + // Pass 1: finalizer, Pass 2: process spec and set condition + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + + condition := osacv1alpha1.GetExternalIPPoolStatusCondition( + updated, osacv1alpha1.ExternalIPPoolConditionConfigurationApplied, + ) + Expect(condition).NotTo(BeNil()) + Expect(condition.Status).To(Equal(metav1.ConditionTrue)) + Expect(condition.Reason).To(Equal("ConfigurationApplied")) + }) + + It("should set phase to Ready on successful provision", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-success", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Provisioning completed", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger AAP job, Pass 3: poll job -> Succeeded -> Ready + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPoolPhaseReady)) + }) + + It("should set phase to Failed on provision failure", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "job-fail", + InitialState: osacv1alpha1.JobStatePending, + Message: "Job triggered", + }, nil + } + + mockProvider.getProvisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateFailed, + Message: "Provisioning failed", + ErrorDetails: "MetalLB unreachable", + }, nil + } + + // Pass 1: finalizer, Pass 2: trigger, Pass 3: poll -> Failed + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + _, err = reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + Expect(updated.Status.Phase).To(Equal(osacv1alpha1.ExternalIPPoolPhaseFailed)) + }) + + // Deletion tests call handleDelete directly because the fake client does not + // support setting DeletionTimestamp via Update. We add the finalizer via a + // normal Reconcile, then set DeletionTimestamp in memory and call handleDelete. + + It("should trigger deprovision on delete", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + deprovisionCalled := false + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + deprovisionCalled = true + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "deprovision-job-123", + BlockDeletionOnFailure: true, + }, nil + } + + // Add finalizer via normal reconcile + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + // Simulate K8s delete by setting DeletionTimestamp in memory + toDelete := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + _, err = reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + + Expect(deprovisionCalled).To(BeTrue()) + + latestJob := provisioning.FindLatestJobByType(toDelete.Status.ProvisioningJobs, osacv1alpha1.JobTypeDeprovision) + Expect(latestJob).NotTo(BeNil()) + Expect(latestJob.JobID).To(Equal("deprovision-job-123")) + }) + + It("should remove finalizer after successful deprovision", func() { + key := types.NamespacedName{Name: pool.Name, Namespace: pool.Namespace} + + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionTriggered, + JobID: "deprovision-success", + BlockDeletionOnFailure: true, + }, nil + } + + mockProvider.getDeprovisionStatusFunc = func( + ctx context.Context, resource client.Object, jobID string, + ) (provisioning.ProvisionStatus, error) { + return provisioning.ProvisionStatus{ + JobID: jobID, + State: osacv1alpha1.JobStateSucceeded, + Message: "Deprovision completed", + }, nil + } + + // Add finalizer first + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + toDelete := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, toDelete)).To(Succeed()) + + now := metav1.Now() + toDelete.DeletionTimestamp = &now + + // First handleDelete triggers deprovision job + _, err = reconciler.handleDelete(testCtx, toDelete) + Expect(err).NotTo(HaveOccurred()) + + // Second handleDelete polls status and removes finalizer + _, _ = reconciler.handleDelete(testCtx, toDelete) + + // Verify finalizer was removed from in-memory object + Expect(toDelete.Finalizers).NotTo(ContainElement(osacExternalIPPoolFinalizer)) + }) + + It("should still handle delete for unmanaged pool with finalizer", func() { + // Edge case: a pool was managed (has finalizer), then an admin marked + // it unmanaged. The management-state guard in Reconcile skips processing + // for non-deleted resources, but deletion must still proceed to clean up + // the AAP-provisioned resources and remove the finalizer. + managedThenUnmanaged := &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "managed-then-unmanaged", + Namespace: "test-namespace", + Annotations: map[string]string{ + osacManagementStateAnnotation: ManagementStateUnmanaged, + }, + Finalizers: []string{osacExternalIPPoolFinalizer}, + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + }, + } + Expect(fakeClient.Create(testCtx, managedThenUnmanaged)).To(Succeed()) + + key := types.NamespacedName{Name: managedThenUnmanaged.Name, Namespace: managedThenUnmanaged.Namespace} + + deprovisionCalled := false + mockProvider.triggerDeprovisionFunc = func( + ctx context.Context, resource client.Object, _ []osacv1alpha1.JobStatus, + ) (*provisioning.DeprovisionResult, error) { + deprovisionCalled = true + return &provisioning.DeprovisionResult{ + Action: provisioning.DeprovisionSkipped, + }, nil + } + + // Fetch from the fake client, then set DeletionTimestamp in memory + // and call handleDelete directly (fake client does not support + // DeletionTimestamp via Update, so we test the in-memory behavior). + fetched := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, fetched)).To(Succeed()) + + now := metav1.Now() + fetched.DeletionTimestamp = &now + + // Verify the Reconcile guard: with DeletionTimestamp set, the + // unmanaged annotation must NOT cause an early return. + // DeletionTimestamp.IsZero() is false, so the guard is skipped + // and we reach the delete branch. + Expect(fetched.ObjectMeta.DeletionTimestamp.IsZero()).To(BeFalse()) + + // Call handleDelete directly. The DeprovisionSkipped path removes + // the finalizer in memory. The subsequent r.Update will fail on + // the fake client (DeletionTimestamp is immutable), but the + // important assertion is that deprovision ran and the finalizer + // was removed from the in-memory object. + _, _ = reconciler.handleDelete(testCtx, fetched) + + Expect(deprovisionCalled).To(BeTrue()) + Expect(fetched.Finalizers).NotTo(ContainElement(osacExternalIPPoolFinalizer)) + }) + + It("should ignore pool with management-state unmanaged annotation", func() { + // When a pool has the unmanaged annotation and is NOT being deleted, + // the controller should skip it entirely: no finalizer, no phase change. + unmanagedPool := &osacv1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: "unmanaged-pool", + Namespace: "test-namespace", + Annotations: map[string]string{ + osacManagementStateAnnotation: ManagementStateUnmanaged, + }, + }, + Spec: osacv1alpha1.ExternalIPPoolSpec{ + + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + ImplementationStrategy: "metallb-l2", + }, + } + Expect(fakeClient.Create(testCtx, unmanagedPool)).To(Succeed()) + + key := types.NamespacedName{Name: unmanagedPool.Name, Namespace: unmanagedPool.Namespace} + _, err := reconciler.Reconcile(testCtx, mcreconcile.Request{Request: ctrl.Request{NamespacedName: key}}) + Expect(err).NotTo(HaveOccurred()) + + updated := &osacv1alpha1.ExternalIPPool{} + Expect(fakeClient.Get(testCtx, key, updated)).To(Succeed()) + + // Verify no finalizer was added (controller skipped it) + Expect(updated.Finalizers).To(BeEmpty()) + Expect(updated.Status.Phase).To(BeEmpty()) + }) + }) + + // The provisioning lifecycle uses a config version (hash of spec + strategy) to + // detect spec changes. When provisioning fails, the controller backs off with + // exponential delay. But if the spec changes (new config version), it retries + // immediately instead of waiting for the backoff to expire. + Context("backoff on failure", func() { + It("should backoff when latest job failed with matching ConfigVersion", func() { + pool.Status.DesiredConfigVersion = testConfigVersion + pool.Status.ProvisioningJobs = []osacv1alpha1.JobStatus{ + { + JobID: "failed-job", + Type: osacv1alpha1.JobTypeProvision, + Timestamp: metav1.NewTime(time.Now().UTC()), + State: osacv1alpha1.JobStateFailed, + Message: "provision failed", + ConfigVersion: testConfigVersion, + }, + } + + result, err := reconciler.handleProvisioning(testCtx, pool) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(BeNumerically(">", 0)) + Expect(result.RequeueAfter).To(BeNumerically("<=", provisioning.BackoffMaxDelay)) + }) + + It("should trigger immediately when spec changed after failure", func() { + mockProvider.triggerProvisionFunc = func( + ctx context.Context, resource client.Object, + ) (*provisioning.ProvisionResult, error) { + return &provisioning.ProvisionResult{ + JobID: "retry-job", + InitialState: osacv1alpha1.JobStatePending, + }, nil + } + + pool.Status.DesiredConfigVersion = testConfigVersionUpdated + pool.Status.ProvisioningJobs = []osacv1alpha1.JobStatus{ + { + JobID: "failed-job", + Type: osacv1alpha1.JobTypeProvision, + Timestamp: metav1.NewTime(time.Now().UTC().Add(-2 * time.Second)), + State: osacv1alpha1.JobStateFailed, + Message: "provision failed", + ConfigVersion: testConfigVersion, + }, + } + + result, err := reconciler.handleProvisioning(testCtx, pool) + Expect(err).NotTo(HaveOccurred()) + Expect(result.RequeueAfter).To(Equal(1 * time.Second)) + + latestJob := provisioning.FindLatestJobByType(pool.Status.ProvisioningJobs, osacv1alpha1.JobTypeProvision) + Expect(latestJob).NotTo(BeNil()) + Expect(latestJob.JobID).To(Equal("retry-job")) + }) + }) +}) diff --git a/internal/controller/externalippool_feedback_controller.go b/internal/controller/externalippool_feedback_controller.go new file mode 100644 index 00000000..19a35702 --- /dev/null +++ b/internal/controller/externalippool_feedback_controller.go @@ -0,0 +1,295 @@ +/* +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 controller + +import ( + "context" + "fmt" + + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" + clnt "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + ctrllog "sigs.k8s.io/controller-runtime/pkg/log" + mcmanager "sigs.k8s.io/multicluster-runtime/pkg/manager" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +// ExternalIPPoolFeedbackReconciler watches ExternalIPPool CRs on the hub cluster and reports their phase and capacity back +// to the fulfillment service via gRPC. This is the reverse channel: the provisioning controller drives the CR forward, +// while this controller keeps the fulfillment service in sync with the CR's current state. +type ExternalIPPoolFeedbackReconciler struct { + hubClient clnt.Client + publicIPPoolClient privatev1.ExternalIPPoolsClient + networkingNamespace string +} + +// externalIPPoolFeedbackReconcilerTask is a per-reconciliation scratch pad. It holds a clone of the proto object so we +// can mutate it freely and then diff against the original to decide whether a gRPC Update is actually needed, avoiding +// unnecessary API calls when nothing changed. +type externalIPPoolFeedbackReconcilerTask struct { + r *ExternalIPPoolFeedbackReconciler + object *v1alpha1.ExternalIPPool + publicIPPool *privatev1.ExternalIPPool +} + +// NewExternalIPPoolFeedbackReconciler creates a reconciler that sends to the fulfillment service updates about +// external IP pools. +func NewExternalIPPoolFeedbackReconciler(hubClient clnt.Client, grpcConn *grpc.ClientConn, networkingNamespace string) *ExternalIPPoolFeedbackReconciler { + return &ExternalIPPoolFeedbackReconciler{ + hubClient: hubClient, + publicIPPoolClient: privatev1.NewExternalIPPoolsClient(grpcConn), + networkingNamespace: networkingNamespace, + } +} + +// SetupWithManager registers this controller with controller-runtime. Named("externalippool-feedback") distinguishes it +// from the provisioning controller, which also watches ExternalIPPool CRs. The namespace predicate limits reconciliation +// to CRs in the networking namespace. +func (r *ExternalIPPoolFeedbackReconciler) SetupWithManager(mgr mcmanager.Manager) error { + localMgr := mgr.GetLocalManager() + if localMgr == nil { + return fmt.Errorf("local manager is nil") + } + + return ctrl.NewControllerManagedBy(localMgr). + Named("externalippool-feedback"). + For(&v1alpha1.ExternalIPPool{}, builder.WithPredicates(NetworkingNamespacePredicate(r.networkingNamespace))). + Complete(r) +} + +// Reconcile syncs the ExternalIPPool CR's phase and capacity to the fulfillment service. The flow has six steps: +// 1. Fetch the CR (exit if deleted between event and processing) +// 2. Check for the fulfillment-service ID label (skip manually-created CRs) +// 3. Fetch the current proto record from the fulfillment service (handle NotFound during deletion) +// 4. Map CR state to proto state via handleUpdate/handleDelete +// 5. Persist changes via gRPC Update (only if proto.Equal detects a diff) +// 6. On deletion: remove finalizer and Signal the fulfillment service to re-reconcile immediately +func (r *ExternalIPPoolFeedbackReconciler) Reconcile(ctx context.Context, request ctrl.Request) (result ctrl.Result, err error) { + log := ctrllog.FromContext(ctx) + + // Step 1: Fetch the object to reconcile, and do nothing if it no longer exists: + object := &v1alpha1.ExternalIPPool{} + err = r.hubClient.Get(ctx, request.NamespacedName, object) + if err != nil { + err = clnt.IgnoreNotFound(err) + return //nolint:nakedret + } + + // Step 2: Get the identifier of the external IP pool from the labels. CRs created by the fulfillment service carry + // this label; manually-created CRs don't, so we skip them. + publicIPPoolID, ok := object.Labels[osacExternalIPPoolIDLabel] + if !ok { + // If being deleted and somehow has our finalizer, remove it to unblock deletion. + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPPoolFeedbackFinalizer) { + log.Info("CR without external IP pool ID label is being deleted, removing feedback finalizer") + if controllerutil.RemoveFinalizer(object, osacExternalIPPoolFeedbackFinalizer) { + err = r.hubClient.Update(ctx, object) + } + return result, err + } + log.Info( + "There is no label containing the external IP pool identifier, will ignore it", + "label", osacExternalIPPoolIDLabel, + ) + return result, err + } + + // Step 3: Fetch the external IP pool from the fulfillment service so we can compare before/after. + publicIPPool, err := r.fetchExternalIPPool(ctx, publicIPPoolID) + if err != nil { + // If the fulfillment service record is already deleted during CR deletion, remove the feedback + // finalizer and exit gracefully. This prevents the controller from blocking CR garbage collection + // when the fulfillment service record has been deleted before K8s CR cleanup completes. + if !object.DeletionTimestamp.IsZero() && status.Code(err) == codes.NotFound { + log.Info( + "Public IP pool record not found during deletion, removing feedback finalizer", + "public_ip_pool_id", publicIPPoolID, + ) + if controllerutil.RemoveFinalizer(object, osacExternalIPPoolFeedbackFinalizer) { + err = r.hubClient.Update(ctx, object) + } + return result, err + } + return result, err + } + + // Create a task to do the rest of the job, but using copies of the objects, so that we can later compare the + // before and after values and save only the objects that have changed. + t := &externalIPPoolFeedbackReconcilerTask{ + r: r, + object: object, + publicIPPool: clone(publicIPPool), + } + + // Step 4: Sync CR state to the fulfillment service record. + // handleUpdate also adds our finalizer; handleDelete syncs state (e.g. DELETING phase). + if object.DeletionTimestamp.IsZero() { + err = t.handleUpdate(ctx) + } else { + t.handleDelete() + } + if err != nil { + return result, err + } + + // Step 5: Persist synced state to the fulfillment service. + err = r.saveExternalIPPool(ctx, publicIPPool, t.publicIPPool) + if err != nil { + return result, err + } + + // Step 6: Handle finalizer removal and signal for deletions. This must happen after step 5 so the + // DELETING state is persisted before the CR is garbage collected. + if !object.DeletionTimestamp.IsZero() && controllerutil.ContainsFinalizer(object, osacExternalIPPoolFeedbackFinalizer) { + if len(object.GetFinalizers()) == 1 { + // We're the last finalizer. Remove it to trigger CR garbage collection, then signal the + // fulfillment service to immediately re-reconcile (instead of waiting for periodic sync). + log.Info( + "Feedback finalizer is last remaining, removing finalizer and signaling", + "publicIPPoolID", publicIPPoolID, + ) + if controllerutil.RemoveFinalizer(object, osacExternalIPPoolFeedbackFinalizer) { + err = r.hubClient.Update(ctx, object) + if err != nil { + return result, err + } + } + _, signalErr := r.publicIPPoolClient.Signal(ctx, privatev1.ExternalIPPoolsSignalRequest_builder{ + Id: publicIPPoolID, + }.Build()) + if signalErr != nil { + log.Error( + signalErr, + "Failed to signal fulfillment service, periodic sync will handle cleanup", + "publicIPPoolID", publicIPPoolID, + ) + } + } else { + // Other finalizers still present, another controller hasn't finished cleanup yet. + log.Info( + "Other finalizers still present, waiting", + "finalizers", object.GetFinalizers(), + ) + } + } + + return result, err +} + +// fetchExternalIPPool retrieves the proto record from the fulfillment service. It also initializes empty Spec/Status +// if the proto object doesn't have them, so downstream code can safely call SetState/SetTotal without nil checks. +func (r *ExternalIPPoolFeedbackReconciler) fetchExternalIPPool(ctx context.Context, id string) (publicIPPool *privatev1.ExternalIPPool, err error) { + response, err := r.publicIPPoolClient.Get(ctx, privatev1.ExternalIPPoolsGetRequest_builder{ + Id: id, + }.Build()) + if err != nil { + return + } + publicIPPool = response.GetObject() + if !publicIPPool.HasSpec() { + publicIPPool.SetSpec(&privatev1.ExternalIPPoolSpec{}) + } + if !publicIPPool.HasStatus() { + publicIPPool.SetStatus(&privatev1.ExternalIPPoolStatus{}) + } + return +} + +// saveExternalIPPool persists the proto record only if it actually changed (compared via proto.Equal), avoiding +// unnecessary gRPC calls and audit log noise when the CR is reconciled but nothing is different. +func (r *ExternalIPPoolFeedbackReconciler) saveExternalIPPool(ctx context.Context, before, after *privatev1.ExternalIPPool) error { + log := ctrllog.FromContext(ctx) + + if !equal(after, before) { + log.Info( + "Updating external IP pool", + "before", before, + "after", after, + ) + _, err := r.publicIPPoolClient.Update(ctx, privatev1.ExternalIPPoolsUpdateRequest_builder{ + Object: after, + }.Build()) + if err != nil { + return err + } + } + return nil +} + +// handleUpdate is called when the CR is alive (not being deleted). It ensures our feedback finalizer is present so we +// get a chance to sync DELETING state before the CR disappears, then syncs both phase and capacity to the proto object. +func (t *externalIPPoolFeedbackReconcilerTask) handleUpdate(ctx context.Context) error { + if controllerutil.AddFinalizer(t.object, osacExternalIPPoolFeedbackFinalizer) { + if err := t.r.hubClient.Update(ctx, t.object); err != nil { + return err + } + } + t.syncPhase(ctx) + return nil +} + +// handleDelete is called when the CR is being deleted. Only syncs deletion-related state (DELETING or DELETE_FAILED). +// Capacity is not synced during deletion because the pool is going away and the counts are no longer meaningful. +func (t *externalIPPoolFeedbackReconcilerTask) handleDelete() { + if t.object.Status.Phase == v1alpha1.ExternalIPPoolPhaseFailed { + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETE_FAILED) + return + } + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING) +} + +// syncPhase maps the CR's phase to the corresponding proto state. The default case logs and ignores unknown phases +// for forward compatibility if a new phase is added to the CRD before the feedback controller is updated. +func (t *externalIPPoolFeedbackReconcilerTask) syncPhase(ctx context.Context) { + switch t.object.Status.Phase { + case v1alpha1.ExternalIPPoolPhaseProgressing: + t.syncPhaseProgressing() + case v1alpha1.ExternalIPPoolPhaseFailed: + t.syncPhaseFailed() + case v1alpha1.ExternalIPPoolPhaseReady: + t.syncPhaseReady() + case v1alpha1.ExternalIPPoolPhaseDeleting: + t.syncPhaseDeleting() + default: + log := ctrllog.FromContext(ctx) + log.Info( + "Unknown phase, will ignore it", + "phase", t.object.Status.Phase, + ) + } +} + +// syncPhaseProgressing maps to PENDING. The fulfillment service uses PENDING (not PROGRESSING) for all networking +// resources, consistent with VirtualNetwork, Subnet, SecurityGroup, NetworkClass, and HostClass. +func (t *externalIPPoolFeedbackReconcilerTask) syncPhaseProgressing() { + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING) +} + +func (t *externalIPPoolFeedbackReconcilerTask) syncPhaseFailed() { + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_FAILED) +} + +func (t *externalIPPoolFeedbackReconcilerTask) syncPhaseReady() { + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY) +} + +func (t *externalIPPoolFeedbackReconcilerTask) syncPhaseDeleting() { + t.publicIPPool.GetStatus().SetState(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING) +} diff --git a/internal/controller/externalippool_feedback_controller_test.go b/internal/controller/externalippool_feedback_controller_test.go new file mode 100644 index 00000000..e212e144 --- /dev/null +++ b/internal/controller/externalippool_feedback_controller_test.go @@ -0,0 +1,649 @@ +/* +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 controller + +import ( + "context" + "net" + "sync" + + . "github.com/onsi/ginkgo/v2" //nolint:revive,staticcheck + . "github.com/onsi/gomega" //nolint:revive,staticcheck + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + grpcstatus "google.golang.org/grpc/status" + "google.golang.org/grpc/test/bufconn" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + "github.com/osac-project/osac-operator/api/v1alpha1" + privatev1 "github.com/osac-project/osac-operator/internal/api/osac/private/v1" +) + +var _ = Describe("ExternalIPPoolFeedbackController", func() { + const ( + poolName = "test-pool" + poolNamespace = "test-namespace" + poolID = "pool-123" + ) + + var ( + ctx context.Context + k8sClient client.Client + mockServer *mockExternalIPPoolsServer + reconciler *ExternalIPPoolFeedbackReconciler + grpcServer *grpc.Server + listener *bufconn.Listener + ) + + BeforeEach(func() { + ctx = context.Background() + + // Create fake Kubernetes client + scheme := runtime.NewScheme() + Expect(v1alpha1.AddToScheme(scheme)).To(Succeed()) + k8sClient = fake.NewClientBuilder().WithScheme(scheme).Build() + + // Create mock gRPC server + mockServer = &mockExternalIPPoolsServer{ + publicIPPools: make(map[string]*privatev1.ExternalIPPool), + updates: make([]*privatev1.ExternalIPPool, 0), + signals: make([]string, 0), + } + listener = bufconn.Listen(1024 * 1024) + grpcServer = grpc.NewServer() + privatev1.RegisterExternalIPPoolsServer(grpcServer, mockServer) + + go func() { + _ = grpcServer.Serve(listener) + }() + + // Create gRPC client connection + conn, err := grpc.NewClient("passthrough:///bufnet", + grpc.WithContextDialer(func(ctx context.Context, s string) (net.Conn, error) { + return listener.Dial() + }), + grpc.WithTransportCredentials(insecure.NewCredentials()), + ) + Expect(err).NotTo(HaveOccurred()) + + // Create reconciler + reconciler = NewExternalIPPoolFeedbackReconciler(k8sClient, conn, poolNamespace) + }) + + AfterEach(func() { + if grpcServer != nil { + grpcServer.Stop() + } + if listener != nil { + _ = listener.Close() + } + }) + + Context("when reconciling a ExternalIPPool CR", func() { + It("should sync Phase=Ready to database state=READY", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING, + }, + } + mockServer.addExternalIPPool(pool) + + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert gRPC Update called with state=READY + Expect(mockServer.updates).To(HaveLen(1)) + updated := mockServer.updates[0] + Expect(updated.GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY)) + + // Assert finalizer was added + fetched := &v1alpha1.ExternalIPPool{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: poolName, Namespace: poolNamespace}, fetched)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(fetched, osacExternalIPPoolFeedbackFinalizer)).To(BeTrue()) + }) + + It("should preserve existing capacity when syncing phase", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING, + Total: 254, + Allocated: 10, + Available: 244, + }, + } + mockServer.addExternalIPPool(pool) + + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + updated := mockServer.updates[0] + Expect(updated.GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY)) + Expect(updated.GetStatus().GetTotal()).To(Equal(int64(254))) + Expect(updated.GetStatus().GetAllocated()).To(Equal(int64(10))) + Expect(updated.GetStatus().GetAvailable()).To(Equal(int64(244))) + }) + + It("should sync Phase=Progressing to database state=PENDING", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY, + }, + } + mockServer.addExternalIPPool(pool) + + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseProgressing, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING)) + }) + + It("should sync Phase=Failed to database state=FAILED", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_PENDING, + }, + } + mockServer.addExternalIPPool(pool) + + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_FAILED)) + }) + + It("should skip CRs without externalippool-uuid label", func() { + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert no Update RPC was called + Expect(mockServer.updates).To(BeEmpty()) + }) + + It("should sync Phase=Deleting to database state=DELETING during deletion", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY, + }, + } + mockServer.addExternalIPPool(pool) + + // Create CR with finalizers (simulating a previously reconciled CR) + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer, osacExternalIPPoolFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + // Mark for deletion + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert Update RPC was called with DELETING state + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING)) + + // Feedback finalizer should still be present (other finalizers remain) + fetched := &v1alpha1.ExternalIPPool{} + Expect(k8sClient.Get(ctx, types.NamespacedName{Name: poolName, Namespace: poolNamespace}, fetched)).To(Succeed()) + Expect(controllerutil.ContainsFinalizer(fetched, osacExternalIPPoolFeedbackFinalizer)).To(BeTrue()) + }) + + It("should sync Phase=Failed during deletion to database state=DELETE_FAILED", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY, + }, + } + mockServer.addExternalIPPool(pool) + + // Create CR with finalizers (simulating a previously reconciled CR) + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer, osacExternalIPPoolFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseFailed, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + // Mark for deletion + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert Update RPC was called with DELETE_FAILED state + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETE_FAILED)) + }) + + It("should remove feedback finalizer and signal when it is the last finalizer", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY, + }, + } + mockServer.addExternalIPPool(pool) + + // Create CR with only feedback finalizer (simulating other finalizers already removed) + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + // Mark for deletion + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert Update RPC was called with DELETING state + Expect(mockServer.updates).To(HaveLen(1)) + Expect(mockServer.updates[0].GetStatus().GetState()).To(Equal(privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_DELETING)) + + // Assert Signal RPC was called + Expect(mockServer.signals).To(HaveLen(1)) + Expect(mockServer.signals[0]).To(Equal(poolID)) + + // Assert finalizer was removed (CR should be gone since it was the last finalizer) + fetched := &v1alpha1.ExternalIPPool{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: poolName, Namespace: poolNamespace}, fetched) + Expect(err).To(HaveOccurred()) // CR should be garbage collected + }) + + It("should remove feedback finalizer when pool record is NotFound during deletion", func() { + // No pool added to mock server (simulates fulfillment service already deleted the record) + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseDeleting, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + // Mark for deletion + Expect(k8sClient.Delete(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // No gRPC Update or Signal should have been called + Expect(mockServer.updates).To(BeEmpty()) + Expect(mockServer.signals).To(BeEmpty()) + + // CR should be gone (finalizer removed, it was the last one) + fetched := &v1alpha1.ExternalIPPool{} + err = k8sClient.Get(ctx, types.NamespacedName{Name: poolName, Namespace: poolNamespace}, fetched) + Expect(err).To(HaveOccurred()) + }) + + It("should return error when pool record is NotFound but CR is not being deleted", func() { + // No pool added to mock server (simulates missing record) + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).To(HaveOccurred()) + }) + + It("should not update if status unchanged", func() { + pool := &privatev1.ExternalIPPool{ + Id: poolID, + Metadata: &privatev1.Metadata{ + Name: poolName, + }, + Spec: &privatev1.ExternalIPPoolSpec{}, + Status: &privatev1.ExternalIPPoolStatus{ + State: privatev1.ExternalIPPoolState_EXTERNAL_IP_POOL_STATE_READY, + Total: 254, + Allocated: 10, + Available: 244, + }, + } + mockServer.addExternalIPPool(pool) + + cr := &v1alpha1.ExternalIPPool{ + ObjectMeta: metav1.ObjectMeta{ + Name: poolName, + Namespace: poolNamespace, + Labels: map[string]string{ + osacExternalIPPoolIDLabel: poolID, + }, + Finalizers: []string{osacExternalIPPoolFeedbackFinalizer}, + }, + Spec: v1alpha1.ExternalIPPoolSpec{ + CIDRs: []string{"10.0.0.0/24"}, + IPFamily: "IPv4", + }, + Status: v1alpha1.ExternalIPPoolStatus{ + Phase: v1alpha1.ExternalIPPoolPhaseReady, + }, + } + Expect(k8sClient.Create(ctx, cr)).To(Succeed()) + + _, err := reconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: types.NamespacedName{ + Name: poolName, + Namespace: poolNamespace, + }, + }) + Expect(err).NotTo(HaveOccurred()) + + // Assert no Update RPC was called (state already READY, finalizer pre-seeded) + Expect(mockServer.updates).To(BeEmpty()) + }) + }) +}) + +// mockExternalIPPoolsServer implements privatev1.ExternalIPPoolsServer for testing. +// It stores pool objects in memory, records all Update and Signal calls for assertions, +// and returns proper gRPC status errors (codes.NotFound) when a pool is not found. +type mockExternalIPPoolsServer struct { + privatev1.UnimplementedExternalIPPoolsServer + mu sync.Mutex + publicIPPools map[string]*privatev1.ExternalIPPool + updates []*privatev1.ExternalIPPool + signals []string +} + +func (m *mockExternalIPPoolsServer) addExternalIPPool(pool *privatev1.ExternalIPPool) { + m.mu.Lock() + defer m.mu.Unlock() + m.publicIPPools[pool.GetId()] = pool +} + +func (m *mockExternalIPPoolsServer) Get(ctx context.Context, req *privatev1.ExternalIPPoolsGetRequest) (*privatev1.ExternalIPPoolsGetResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + pool, ok := m.publicIPPools[req.GetId()] + if !ok { + return nil, grpcstatus.Errorf(codes.NotFound, "object with identifier '%s' not found", req.GetId()) + } + + return &privatev1.ExternalIPPoolsGetResponse{ + Object: pool, + }, nil +} + +func (m *mockExternalIPPoolsServer) Update(ctx context.Context, req *privatev1.ExternalIPPoolsUpdateRequest) (*privatev1.ExternalIPPoolsUpdateResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + pool := req.GetObject() + m.publicIPPools[pool.GetId()] = pool + m.updates = append(m.updates, pool) + + return &privatev1.ExternalIPPoolsUpdateResponse{ + Object: pool, + }, nil +} + +func (m *mockExternalIPPoolsServer) Signal(ctx context.Context, req *privatev1.ExternalIPPoolsSignalRequest) (*privatev1.ExternalIPPoolsSignalResponse, error) { + m.mu.Lock() + defer m.mu.Unlock() + + m.signals = append(m.signals, req.GetId()) + + return &privatev1.ExternalIPPoolsSignalResponse{}, nil +} diff --git a/internal/controller/externalippool_names.go b/internal/controller/externalippool_names.go new file mode 100644 index 00000000..e2bddce4 --- /dev/null +++ b/internal/controller/externalippool_names.go @@ -0,0 +1,23 @@ +/* +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 controller + +import ( + "fmt" +) + +var ( + osacExternalIPPoolIDLabel string = fmt.Sprintf("%s/externalippool-uuid", osacPrefix) + osacExternalIPPoolFeedbackFinalizer string = fmt.Sprintf("%s/externalippool-feedback", osacPrefix) +)