Skip to content

Commit 456ce7c

Browse files
authored
feat: add new OverlayExtensionConfig CRD (#2892)
1 parent 68ede66 commit 456ce7c

File tree

10 files changed

+399
-0
lines changed

10 files changed

+399
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.DEFAULT_GOAL = all
2+
3+
REPO_ROOT = $(shell git rev-parse --show-toplevel)
4+
TOOLS_DIR = $(REPO_ROOT)/build/tools
5+
TOOLS_BIN_DIR = $(REPO_ROOT)/build/tools/bin
6+
CONTROLLER_GEN = $(TOOLS_BIN_DIR)/controller-gen
7+
8+
all: generate manifests
9+
10+
generate: $(CONTROLLER_GEN)
11+
$(CONTROLLER_GEN) object paths="./..."
12+
13+
.PHONY: manifests
14+
manifests: $(CONTROLLER_GEN)
15+
mkdir -p manifests
16+
$(CONTROLLER_GEN) crd paths="./..." output:crd:artifacts:config=manifests/
17+
18+
$(CONTROLLER_GEN):
19+
@make -C $(REPO_ROOT) $(CONTROLLER_GEN)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
List of included CRDs
2+
3+
# OverlayExtensionConfig CRD
4+
5+
OverlayExtensionConfig CRD defines an IP address range (usually an Azure subnet) from which it is possible to reach routing domain IPs (usually pods running in Azure CNI Overlay cluster).
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//go:build !ignore_uncovered
2+
// +build !ignore_uncovered
3+
4+
// Package v1alpha1 contains API Schema definitions for the acn v1alpha1 API group
5+
// +kubebuilder:object:generate=true
6+
// +groupName=acn.azure.com
7+
package v1alpha1
8+
9+
import (
10+
"k8s.io/apimachinery/pkg/runtime/schema"
11+
"sigs.k8s.io/controller-runtime/pkg/scheme"
12+
)
13+
14+
var (
15+
// GroupVersion is group version used to register these objects
16+
GroupVersion = schema.GroupVersion{Group: "acn.azure.com", Version: "v1alpha1"}
17+
18+
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
19+
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
20+
21+
// AddToScheme adds the types in this group-version to the given scheme.
22+
AddToScheme = SchemeBuilder.AddToScheme
23+
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//go:build !ignore_uncovered
2+
// +build !ignore_uncovered
3+
4+
package v1alpha1
5+
6+
import (
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
// OverlayExtensionConfig is the Schema for the overlayextensionconfigs API
11+
// +kubebuilder:object:root=true
12+
// +kubebuilder:subresource:status
13+
// +kubebuilder:resource:scope=Namespaced
14+
// +kubebuilder:resource:shortName=oec
15+
// +kubebuilder:printcolumn:name="OverlayExtensionConfig IP range",type=string,priority=1,JSONPath=`.spec.extensionIPRange`
16+
type OverlayExtensionConfig struct {
17+
metav1.TypeMeta `json:",inline"`
18+
metav1.ObjectMeta `json:"metadata,omitempty"`
19+
20+
Spec OverlayExtensionConfigSpec `json:"spec,omitempty"`
21+
Status OverlayExtensionConfigStatus `json:"status,omitempty"`
22+
}
23+
24+
// +kubebuilder:object:root=true
25+
26+
// OverlayExtensionConfigList contains a list of OverlayExtensionConfig
27+
type OverlayExtensionConfigList struct {
28+
metav1.TypeMeta `json:",inline"`
29+
metav1.ListMeta `json:"metadata,omitempty"`
30+
Items []OverlayExtensionConfig `json:"items"`
31+
}
32+
33+
// OverlayExtensionConfigSpec defines the desired state of OverlayExtensionConfig.
34+
type OverlayExtensionConfigSpec struct {
35+
// ExtensionIPRange field defines a CIDR that should be able to reach routing domain ip addresses.
36+
// +kubebuilder:validation:Optional
37+
ExtensionIPRange string `json:"extensionIPRange,omitempty"`
38+
}
39+
40+
type OECState string
41+
42+
const (
43+
None OECState = "None"
44+
Pending OECState = "Pending"
45+
Succeeded OECState = "Succeeded"
46+
Failed OECState = "Failed"
47+
)
48+
49+
// OverlayExtensionConfigStatus defines the observed state of OverlayExtensionConfig
50+
type OverlayExtensionConfigStatus struct {
51+
// +kubebuilder:validation:Enum=None;Pending;Succeeded;Failed
52+
// +kubebuilder:default="None"
53+
State OECState `json:"state,omitempty"`
54+
Message string `json:"message,omitempty"`
55+
}
56+
57+
func init() {
58+
SchemeBuilder.Register(&OverlayExtensionConfig{}, &OverlayExtensionConfigList{})
59+
}

crd/overlayextensionconfig/api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 98 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package overlayextensionconfig
2+
3+
import (
4+
"context"
5+
"reflect"
6+
7+
"github.com/Azure/azure-container-networking/crd"
8+
"github.com/Azure/azure-container-networking/crd/overlayextensionconfig/api/v1alpha1"
9+
"github.com/pkg/errors"
10+
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
11+
typedv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
12+
apierrors "k8s.io/apimachinery/pkg/api/errors"
13+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/runtime"
15+
"k8s.io/client-go/kubernetes/scheme"
16+
"k8s.io/client-go/rest"
17+
)
18+
19+
// Scheme is a runtime scheme containing the client-go scheme and the OverlayExtensionConfig scheme.
20+
var Scheme = runtime.NewScheme()
21+
22+
func init() {
23+
_ = scheme.AddToScheme(Scheme)
24+
_ = v1alpha1.AddToScheme(Scheme)
25+
}
26+
27+
// Installer provides methods to manage the lifecycle of the OverlayExtensionConfig resource definition.
28+
type Installer struct {
29+
cli typedv1.CustomResourceDefinitionInterface
30+
}
31+
32+
func NewInstaller(c *rest.Config) (*Installer, error) {
33+
cli, err := crd.NewCRDClientFromConfig(c)
34+
if err != nil {
35+
return nil, errors.Wrap(err, "failed to init crd client")
36+
}
37+
return &Installer{
38+
cli: cli,
39+
}, nil
40+
}
41+
42+
func (i *Installer) create(ctx context.Context, res *v1.CustomResourceDefinition) (*v1.CustomResourceDefinition, error) {
43+
res, err := i.cli.Create(ctx, res, metav1.CreateOptions{})
44+
if err != nil {
45+
return nil, errors.Wrap(err, "failed to create oec crd")
46+
}
47+
return res, nil
48+
}
49+
50+
// InstallOrUpdate installs the embedded OverlayExtensionConfig CRD definition in the cluster or updates it if present.
51+
func (i *Installer) InstallOrUpdate(ctx context.Context) (*v1.CustomResourceDefinition, error) {
52+
oec, err := GetOverlayExtensionConfigs()
53+
if err != nil {
54+
return nil, errors.Wrap(err, "failed to get embedded oec crd")
55+
}
56+
current, err := i.create(ctx, oec)
57+
if !apierrors.IsAlreadyExists(err) {
58+
return current, err
59+
}
60+
if current == nil {
61+
current, err = i.cli.Get(ctx, oec.Name, metav1.GetOptions{})
62+
if err != nil {
63+
return nil, errors.Wrap(err, "failed to get existing oec crd")
64+
}
65+
}
66+
if !reflect.DeepEqual(oec.Spec.Versions, current.Spec.Versions) {
67+
oec.SetResourceVersion(current.GetResourceVersion())
68+
previous := *current
69+
current, err = i.cli.Update(ctx, oec, metav1.UpdateOptions{})
70+
if err != nil {
71+
return &previous, errors.Wrap(err, "failed to update existing oec crd")
72+
}
73+
}
74+
return current, nil
75+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package overlayextensionconfig
2+
3+
import (
4+
_ "embed"
5+
6+
// import the manifests package so that caller of this package have the manifests compiled in as a side-effect.
7+
_ "github.com/Azure/azure-container-networking/crd/nodenetworkconfig/manifests"
8+
"github.com/pkg/errors"
9+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10+
"sigs.k8s.io/yaml"
11+
)
12+
13+
// OverlayExtensionConfigsYAML embeds the CRD YAML for downstream consumers.
14+
//
15+
//go:embed manifests/acn.azure.com_overlayextensionconfigs.yaml
16+
var OverlayExtensionConfigsYAML []byte
17+
18+
// GetOverlayExtensionConfigs parses the raw []byte NodeNetworkConfigs in
19+
// to a CustomResourceDefinition and returns it or an unmarshalling error.
20+
func GetOverlayExtensionConfigs() (*apiextensionsv1.CustomResourceDefinition, error) {
21+
overlayExtensionConfigs := &apiextensionsv1.CustomResourceDefinition{}
22+
if err := yaml.Unmarshal(OverlayExtensionConfigsYAML, &overlayExtensionConfigs); err != nil {
23+
return nil, errors.Wrap(err, "error unmarshalling embedded nnc")
24+
}
25+
return overlayExtensionConfigs, nil
26+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package overlayextensionconfig
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
const filename = "manifests/acn.azure.com_overlayextensionconfigs.yaml"
12+
13+
func TestEmbed(t *testing.T) {
14+
b, err := os.ReadFile(filename)
15+
require.NoError(t, err)
16+
assert.Equal(t, b, OverlayExtensionConfigsYAML)
17+
}
18+
19+
func TestGetOverlayExtensionConfigs(t *testing.T) {
20+
_, err := GetOverlayExtensionConfigs()
21+
require.NoError(t, err)
22+
}

0 commit comments

Comments
 (0)