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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion api/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

73 changes: 73 additions & 0 deletions api/v1beta1/serviceexport_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
Copyright (c) Microsoft Corporation.
Licensed under the MIT license.
*/

package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// ServiceExportConditionType identifies a specific condition on a ServiceExport.
type ServiceExportConditionType string

const (
// ServiceExportValid means that the service referenced by this service export has been recognized as valid.
// This will be false if the service is found to be unexportable (e.g. ExternalName, not found).
ServiceExportValid ServiceExportConditionType = "Valid"
// ServiceExportConflict means that there is a conflict between two exports for the same Service.
// When "True", the condition message should contain enough information to diagnose the conflict:
// field(s) under contention, which cluster won, and why.
// Users should not expect detailed per-cluster information in the conflict message.
ServiceExportConflict ServiceExportConditionType = "Conflict"
)

// ServiceExportStatus contains the current status of an export.
type ServiceExportStatus struct {
// +optional
// +patchStrategy=merge
// +patchMergeKey=type
// +listType=map
// +listMapKey=type
Conditions []metav1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type"`
}

// +kubebuilder:object:root=true
// +kubebuilder:storageversion
// +kubebuilder:resource:scope=Namespaced,categories={fleet-networking},shortName=svcexport
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:JSONPath=`.status.conditions[?(@.type=='Valid')].status`,name="Is-Valid",type=string
// +kubebuilder:printcolumn:JSONPath=`.status.conditions[?(@.type=='Conflict')].status`,name="Is-Conflicted",type=string
// +kubebuilder:printcolumn:JSONPath=`.metadata.creationTimestamp`,name="Age",type=date

// ServiceExport declares that the associated service should be exported to other clusters.
// The annotation "networking.fleet.azure.com/weight" specifies the proportion of requests forwarded to the cluster
// within a serviceImport.
// The actual value is the ceiling value of a number computed as weight/(sum of all weights in the serviceImport).
// If weight is set to 0, no traffic should be forwarded for this entry.
// If unspecified, weight defaults to 1.
// The value should be in the range [0, 1000].
// +kubebuilder:validation:XValidation:rule="size(self.metadata.name) < 64",message="metadata.name max length is 63"
type ServiceExport struct {
metav1.TypeMeta `json:",inline"`
// +optional
metav1.ObjectMeta `json:"metadata,omitempty"`
// +optional
Status ServiceExportStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// ServiceExportList contains a list of ServiceExport.
type ServiceExportList struct {
metav1.TypeMeta `json:",inline"`
// +optional
metav1.ListMeta `json:"metadata,omitempty"`
// +listType=set
Items []ServiceExport `json:"items"`
}

func init() {
SchemeBuilder.Register(&ServiceExport{}, &ServiceExportList{})
}
82 changes: 81 additions & 1 deletion api/v1beta1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions cmd/mcs-controller-manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import (
fleetv1alpha1 "go.goms.io/fleet/apis/v1alpha1"

fleetnetv1alpha1 "go.goms.io/fleet-networking/api/v1alpha1"
fleetnetv1beta1 "go.goms.io/fleet-networking/api/v1beta1"
"go.goms.io/fleet-networking/pkg/common/hubconfig"
imcv1alpha1 "go.goms.io/fleet-networking/pkg/controllers/member/internalmembercluster/v1alpha1"
imcv1beta1 "go.goms.io/fleet-networking/pkg/controllers/member/internalmembercluster/v1beta1"
Expand Down Expand Up @@ -69,6 +70,7 @@ func init() {

utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(fleetnetv1alpha1.AddToScheme(scheme))
utilruntime.Must(fleetnetv1beta1.AddToScheme(scheme))
utilruntime.Must(fleetv1alpha1.AddToScheme(scheme))
utilruntime.Must(clusterv1beta1.AddToScheme(scheme))

Expand Down
2 changes: 2 additions & 0 deletions cmd/member-net-controller-manager/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import (
"go.goms.io/fleet/pkg/utils/cloudconfig/azure"

fleetnetv1alpha1 "go.goms.io/fleet-networking/api/v1alpha1"
fleetnetv1beta1 "go.goms.io/fleet-networking/api/v1beta1"
"go.goms.io/fleet-networking/pkg/common/env"
"go.goms.io/fleet-networking/pkg/common/hubconfig"
"go.goms.io/fleet-networking/pkg/controllers/member/endpointslice"
Expand Down Expand Up @@ -83,6 +84,7 @@ func init() {

utilruntime.Must(clientgoscheme.AddToScheme(scheme))
utilruntime.Must(fleetnetv1alpha1.AddToScheme(scheme))
utilruntime.Must(fleetnetv1beta1.AddToScheme(scheme))
utilruntime.Must(fleetv1alpha1.AddToScheme(scheme))
utilruntime.Must(clusterv1beta1.AddToScheme(scheme))

Expand Down
110 changes: 110 additions & 0 deletions config/crd/bases/networking.fleet.azure.com_serviceexports.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,116 @@ spec:
- message: metadata.name max length is 63
rule: size(self.metadata.name) < 64
served: true
storage: false
subresources:
status: {}
- additionalPrinterColumns:
- jsonPath: .status.conditions[?(@.type=='Valid')].status
name: Is-Valid
type: string
- jsonPath: .status.conditions[?(@.type=='Conflict')].status
name: Is-Conflicted
type: string
- jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1beta1
schema:
openAPIV3Schema:
description: |-
ServiceExport declares that the associated service should be exported to other clusters.
The annotation "networking.fleet.azure.com/weight" specifies the proportion of requests forwarded to the cluster
within a serviceImport.
The actual value is the ceiling value of a number computed as weight/(sum of all weights in the serviceImport).
If weight is set to 0, no traffic should be forwarded for this entry.
If unspecified, weight defaults to 1.
The value should be in the range [0, 1000].
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
status:
description: ServiceExportStatus contains the current status of an export.
properties:
conditions:
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
x-kubernetes-list-map-keys:
- type
x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
- message: metadata.name max length is 63
rule: size(self.metadata.name) < 64
served: true
storage: true
subresources:
status: {}
5 changes: 3 additions & 2 deletions pkg/common/condition/condition.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"k8s.io/apimachinery/pkg/types"

fleetnetv1alpha1 "go.goms.io/fleet-networking/api/v1alpha1"
fleetnetv1beta1 "go.goms.io/fleet-networking/api/v1beta1"
)

const (
Expand Down Expand Up @@ -73,7 +74,7 @@ func UnconflictedServiceExportConflictCondition(internalServiceExport fleetnetv1
Name: internalServiceExport.Spec.ServiceReference.Name,
}
return metav1.Condition{
Type: string(fleetnetv1alpha1.ServiceExportConflict),
Type: string(fleetnetv1beta1.ServiceExportConflict),
Status: metav1.ConditionFalse,
Reason: conditionReasonNoConflictFound,
ObservedGeneration: internalServiceExport.Generation,
Expand All @@ -88,7 +89,7 @@ func ConflictedServiceExportConflictCondition(internalServiceExport fleetnetv1al
Name: internalServiceExport.Spec.ServiceReference.Name,
}
return metav1.Condition{
Type: string(fleetnetv1alpha1.ServiceExportConflict),
Type: string(fleetnetv1beta1.ServiceExportConflict),
Status: metav1.ConditionTrue,
Reason: conditionReasonConflictFound,
ObservedGeneration: internalServiceExport.Generation,
Expand Down
5 changes: 3 additions & 2 deletions pkg/common/condition/condition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"k8s.io/apimachinery/pkg/util/intstr"

fleetnetv1alpha1 "go.goms.io/fleet-networking/api/v1alpha1"
fleetnetv1beta1 "go.goms.io/fleet-networking/api/v1beta1"
)

var (
Expand Down Expand Up @@ -267,7 +268,7 @@ func TestUnconflictedServiceExportConflictCondition(t *testing.T) {
},
}
want := metav1.Condition{
Type: string(fleetnetv1alpha1.ServiceExportConflict),
Type: string(fleetnetv1beta1.ServiceExportConflict),
Status: metav1.ConditionFalse,
Reason: conditionReasonNoConflictFound,
ObservedGeneration: 456,
Expand Down Expand Up @@ -312,7 +313,7 @@ func TestConflictedServiceExportConflictCondition(t *testing.T) {
},
}
want := metav1.Condition{
Type: string(fleetnetv1alpha1.ServiceExportConflict),
Type: string(fleetnetv1beta1.ServiceExportConflict),
Status: metav1.ConditionTrue,
Reason: conditionReasonConflictFound,
ObservedGeneration: 123,
Expand Down
4 changes: 2 additions & 2 deletions pkg/common/objectmeta/objectmeta.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import (

"k8s.io/klog/v2"

fleetnetv1alpha1 "go.goms.io/fleet-networking/api/v1alpha1"
fleetnetv1beta1 "go.goms.io/fleet-networking/api/v1beta1"
)

const (
Expand Down Expand Up @@ -81,7 +81,7 @@ var (
)

// ExtractWeightFromServiceExport gets the weight from the serviceExport annotation and validates it.
func ExtractWeightFromServiceExport(svcExport *fleetnetv1alpha1.ServiceExport) (int64, error) {
func ExtractWeightFromServiceExport(svcExport *fleetnetv1beta1.ServiceExport) (int64, error) {
serviceKObj := klog.KObj(svcExport)
// Setup the weightAnno for the exported service on the hub cluster.
weightAnno, found := svcExport.Annotations[ServiceExportAnnotationWeight]
Expand Down
Loading
Loading