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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ CONTROLLER_TOOLS_VERSION ?= v0.17.1
ENVTEST_VERSION ?= release-0.22
GOLANGCI_LINT_VERSION ?= v2.7.2
KAL_VERSION ?= v0.0.0-20250924094418-502783c08f9d
MOCKGEN_VERSION ?= v0.5.0
MOCKGEN_VERSION ?= v0.6.0
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Martin could give better feedback here, but I believe we should bump mockgen version on a separate PR to better track the changes, if it is really necessary.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, in this case we will need this separate PR to go in before this one, because Mokcing fails if the version is 0.6.0.

KUTTL_VERSION ?= v0.23.0
GOVULNCHECK_VERSION ?= v1.1.4
OPERATOR_SDK_VERSION ?= v1.41.1
Expand Down
8 changes: 8 additions & 0 deletions PROJECT
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,14 @@ resources:
kind: Subnet
path: github.com/k-orc/openstack-resource-controller/api/v1alpha1
version: v1alpha1
- api:
crdVersion: v1
namespaced: true
domain: k-orc.cloud
group: openstack
kind: Trunk
path: github.com/k-orc/openstack-resource-controller/api/v1alpha1
version: v1alpha1
- api:
crdVersion: v1
namespaced: true
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ kubectl delete -f $ORC_RELEASE
| server group | |||
| service | |||
| subnet | |||
| trunk | |||
| volume | |||
| volume type | |||

Expand Down
183 changes: 183 additions & 0 deletions api/v1alpha1/trunk_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
/*
Copyright 2025 The ORC Authors.

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
// TrunkSubportSpec represents a subport to attach to a trunk.
// It maps to gophercloud's trunks.Subport.
type TrunkSubportSpec struct {
// portRef is a reference to the ORC Port that will be attached as a subport.
// +required
PortRef KubernetesNameRef `json:"portRef"`

// segmentationID is the segmentation ID for the subport (e.g. VLAN ID).
// +required
// +kubebuilder:validation:Minimum:=1
// +kubebuilder:validation:Maximum:=4094
SegmentationID int32 `json:"segmentationID"`

// segmentationType is the segmentation type for the subport (e.g. vlan).
// +required
// +kubebuilder:validation:MinLength:=1
// +kubebuilder:validation:MaxLength:=32
// +kubebuilder:validation:Enum:=inherit;vlan
SegmentationType string `json:"segmentationType"`
}

// TrunkSubportStatus represents an attached subport on a trunk.
// It maps to gophercloud's trunks.Subport.
type TrunkSubportStatus struct {
// portID is the OpenStack ID of the Port attached as a subport.
// +kubebuilder:validation:MaxLength=1024
// +optional
PortID string `json:"portID,omitempty"`

// segmentationID is the segmentation ID for the subport (e.g. VLAN ID).
// +optional
SegmentationID int32 `json:"segmentationID,omitempty"`

// segmentationType is the segmentation type for the subport (e.g. vlan).
// +kubebuilder:validation:MaxLength=1024
// +optional
SegmentationType string `json:"segmentationType,omitempty"`
}

// TrunkResourceSpec contains the desired state of the resource.
type TrunkResourceSpec struct {
// name will be the name of the created resource. If not specified, the
// name of the ORC object will be used.
// +optional
Name *OpenStackName `json:"name,omitempty"`

// description is a human-readable description for the resource.
// +optional
Description *NeutronDescription `json:"description,omitempty"`

// portRef is a reference to the ORC Port which this resource is associated with.
// +required
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="portRef is immutable"
PortRef KubernetesNameRef `json:"portRef,omitempty"`

// projectRef is a reference to the ORC Project which this resource is associated with.
// +optional
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="projectRef is immutable"
ProjectRef *KubernetesNameRef `json:"projectRef,omitempty"`

// adminStateUp is the administrative state of the trunk. If false (down),
// the trunk does not forward packets.
// +optional
AdminStateUp *bool `json:"adminStateUp,omitempty"`

// subports is the list of ports to attach to the trunk.
//
// NOTE: ORC currently does not implement reconcile logic for subport updates
// (Neutron uses dedicated add/remove subport APIs). This field is immutable
// until that behavior is implemented in the controller.
// +optional
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="subports is immutable"
// +kubebuilder:validation:MaxItems:=1024
// +listType=atomic
Subports []TrunkSubportSpec `json:"subports,omitempty"`

// tags is a list of Neutron tags to apply to the trunk.
// +kubebuilder:validation:MaxItems:=64
// +listType=set
// +optional
Tags []NeutronTag `json:"tags,omitempty"`
}

// TrunkFilter defines an existing resource by its properties
// +kubebuilder:validation:MinProperties:=1
type TrunkFilter struct {
// name of the existing resource
// +optional
Name *OpenStackName `json:"name,omitempty"`

// description of the existing resource
// +optional
Description *NeutronDescription `json:"description,omitempty"`

// portRef is a reference to the ORC Port which this resource is associated with.
// +optional
PortRef *KubernetesNameRef `json:"portRef,omitempty"`

// projectRef is a reference to the ORC Project which this resource is associated with.
// +optional
ProjectRef *KubernetesNameRef `json:"projectRef,omitempty"`

// status indicates whether the trunk is currently operational. Possible values include
// `ACTIVE', `DOWN', `BUILD', `DEGRADED' or `ERROR'. Plug-ins might define additional values.
// +optional
// +kubebuilder:validation:MaxLength:=1024
Status *string `json:"status,omitempty"`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please set a maximum length here?

When you don't specify, CEL works by calculating the worst case for that validation, so we always try to set this value, even if it is an estimate. Here it is a talk that explore more about it (thanks Martin).


// adminStateUp is the administrative state of the trunk.
// +optional
AdminStateUp *bool `json:"adminStateUp,omitempty"`

FilterByNeutronTags `json:",inline"`
}

// TrunkResourceStatus represents the observed state of the resource.
type TrunkResourceStatus struct {
// name is a Human-readable name for the resource. Might not be unique.
// +kubebuilder:validation:MaxLength=1024
// +optional
Name string `json:"name,omitempty"`

// description is a human-readable description for the resource.
// +kubebuilder:validation:MaxLength=1024
// +optional
Description string `json:"description,omitempty"`

// portID is the ID of the Port to which the resource is associated.
// +kubebuilder:validation:MaxLength=1024
// +optional
PortID string `json:"portID,omitempty"`

// projectID is the ID of the Project to which the resource is associated.
// +kubebuilder:validation:MaxLength=1024
// +optional
ProjectID string `json:"projectID,omitempty"`

// tenantID is the project owner of the trunk (alias of projectID in some deployments).
// +kubebuilder:validation:MaxLength=1024
// +optional
TenantID string `json:"tenantID,omitempty"`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although tenant_id is for old Keystone APIs, I believe it won't gonna hurt to have it here.


// status indicates whether the trunk is currently operational.
// +kubebuilder:validation:MaxLength=1024
// +optional
Status string `json:"status,omitempty"`

// tags is the list of tags on the resource.
// +kubebuilder:validation:MaxItems=64
// +kubebuilder:validation:items:MaxLength=1024
// +listType=atomic
// +optional
Tags []string `json:"tags,omitempty"`

NeutronStatusMetadata `json:",inline"`

// adminStateUp is the administrative state of the trunk.
// +optional
AdminStateUp *bool `json:"adminStateUp,omitempty"`

// subports is a list of ports associated with the trunk.
// +kubebuilder:validation:MaxItems=1024
// +listType=atomic
// +optional
Subports []TrunkSubportStatus `json:"subports,omitempty"`
}
Loading
Loading