Skip to content

Commit 351ea4d

Browse files
authored
Merge branch 'master' into ankaggar/ankaggar/PNI-CRD
Signed-off-by: aggarwal0009 <[email protected]>
2 parents 8f8f455 + 3b7c365 commit 351ea4d

File tree

11 files changed

+435
-0
lines changed

11 files changed

+435
-0
lines changed

.github/workflows/crdgen.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ jobs:
2828
run: make -C crd/multitenantnetworkcontainer
2929
- name: Regenerate PodNetworkInstance CRD
3030
run: make -C crd/external/podnetworkinstance
31+
- name: Regenerate PodNetwork CRD
32+
run: make -C crd/external/podnetwork
3133
- name: Regenerate NodeInfo CRD
3234
run: make -C crd/nodeinfo
3335
- name: Regenerate MultitenantPodNetworkConfig CRD

crd/external/podnetwork/Makefile

+19
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)

crd/external/podnetwork/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# PodNetwork CRDs
2+
3+
This CRD is added to enable VNET multitenancy – which will be watched and managed by the control plane.
4+
5+
PodNetwork objects need to be created by Orchestrator in the subnet delegation flow.
6+
These represent a Cx subnet already delegated by the customer to the Orchestrator and locked with a Service Association Link (SAL) on network RP.
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 networking 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+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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+
// Important: Run "make" to regenerate code after modifying this file
11+
12+
// +kubebuilder:object:root=true
13+
14+
// PodNetwork is the Schema for the PodNetworks API
15+
// +kubebuilder:resource:scope=Namespaced
16+
// +kubebuilder:resource:shortName=pn
17+
// +kubebuilder:subresource:status
18+
// +kubebuilder:printcolumn:name="Status",type=string,priority=1,JSONPath=`.status.status`
19+
// +kubebuilder:printcolumn:name="Address Prefixes",type=string,priority=1,JSONPath=`.status.addressPrefixes`
20+
// +kubebuilder:printcolumn:name="Network",type=string,priority=1,JSONPath=`.spec.vnetGUID`
21+
// +kubebuilder:printcolumn:name="Subnet",type=string,priority=1,JSONPath=`.spec.subnetResourceID`
22+
type PodNetwork struct {
23+
metav1.TypeMeta `json:",inline"`
24+
metav1.ObjectMeta `json:"metadata,omitempty"`
25+
26+
Spec PodNetworkSpec `json:"spec,omitempty"`
27+
Status PodNetworkStatus `json:"status,omitempty"`
28+
}
29+
30+
// +kubebuilder:object:root=true
31+
32+
// PodNetworkList contains a list of PodNetwork
33+
type PodNetworkList struct {
34+
metav1.TypeMeta `json:",inline"`
35+
metav1.ListMeta `json:"metadata,omitempty"`
36+
Items []PodNetwork `json:"items"`
37+
}
38+
39+
// PodNetworkSpec defines the desired state of PodNetwork
40+
type PodNetworkSpec struct {
41+
// +kubebuilder:validation:Optional
42+
// customer vnet guid
43+
VnetGUID string `json:"vnetGUID,omitempty"`
44+
// customer subnet id
45+
SubnetResourceID string `json:"subnetResourceID,omitempty"`
46+
}
47+
48+
// Status indicates the status of PN
49+
// +kubebuilder:validation:Enum=Ready;InUse;SubnetNotDelegated
50+
type Status string
51+
52+
const (
53+
Ready Status = "Ready"
54+
InUse Status = "InUse"
55+
SubnetNotDelegated Status = "SubnetNotDelegated"
56+
)
57+
58+
// PodNetworkStatus defines the observed state of PodNetwork
59+
type PodNetworkStatus struct {
60+
// +kubebuilder:validation:Optional
61+
Status Status `json:"status,omitempty"`
62+
AddressPrefixes []string `json:"addressPrefixes,omitempty"`
63+
}
64+
65+
func init() {
66+
SchemeBuilder.Register(&PodNetwork{}, &PodNetworkList{})
67+
}

crd/external/podnetwork/api/v1alpha1/zz_generated.deepcopy.go

+104
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crd/external/podnetwork/client.go

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package podnetwork
2+
3+
import (
4+
"context"
5+
"reflect"
6+
7+
"github.com/Azure/azure-container-networking/crd"
8+
"github.com/Azure/azure-container-networking/crd/external/podnetwork/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 PodNetwork 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 PodNetwork 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 podnetwork crd")
46+
}
47+
return res, nil
48+
}
49+
50+
// Install installs the embedded PodNetwork CRD definition in the cluster.
51+
func (i *Installer) Install(ctx context.Context) (*v1.CustomResourceDefinition, error) {
52+
podnetwork, err := GetPodNetworks()
53+
if err != nil {
54+
return nil, errors.Wrap(err, "failed to get embedded podnetwork crd")
55+
}
56+
return i.create(ctx, podnetwork)
57+
}
58+
59+
// InstallOrUpdate installs the embedded PodNetwork CRD definition in the cluster or updates it if present.
60+
func (i *Installer) InstallOrUpdate(ctx context.Context) (*v1.CustomResourceDefinition, error) {
61+
podNetwork, err := GetPodNetworks()
62+
if err != nil {
63+
return nil, errors.Wrap(err, "failed to get embedded podnetwork crd")
64+
}
65+
current, err := i.create(ctx, podNetwork)
66+
if !apierrors.IsAlreadyExists(err) {
67+
return current, err
68+
}
69+
if current == nil {
70+
current, err = i.cli.Get(ctx, podNetwork.Name, metav1.GetOptions{})
71+
if err != nil {
72+
return nil, errors.Wrap(err, "failed to get existing podnetwork crd")
73+
}
74+
}
75+
if !reflect.DeepEqual(podNetwork.Spec.Versions, current.Spec.Versions) {
76+
podNetwork.SetResourceVersion(current.GetResourceVersion())
77+
previous := *current
78+
current, err = i.cli.Update(ctx, podNetwork, metav1.UpdateOptions{})
79+
if err != nil {
80+
return &previous, errors.Wrap(err, "failed to update existing podnetwork crd")
81+
}
82+
}
83+
return current, nil
84+
}

crd/external/podnetwork/embed.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package podnetwork
2+
3+
import (
4+
_ "embed"
5+
6+
"github.com/pkg/errors"
7+
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
8+
"sigs.k8s.io/yaml"
9+
)
10+
11+
// PodNetworkYAML embeds the CRD YAML for downstream consumers.
12+
//
13+
//go:embed manifests/acn.azure.com_podnetworks.yaml
14+
var PodNetworkYAML []byte
15+
16+
// GetPodNetworks parses the raw []byte PodNetwork in
17+
// to a CustomResourceDefinition and returns it or an unmarshalling error.
18+
func GetPodNetworks() (*apiextensionsv1.CustomResourceDefinition, error) {
19+
podNetworks := &apiextensionsv1.CustomResourceDefinition{}
20+
if err := yaml.Unmarshal(PodNetworkYAML, &podNetworks); err != nil {
21+
return nil, errors.Wrap(err, "error unmarshalling embedded PodNetwork")
22+
}
23+
return podNetworks, nil
24+
}

crd/external/podnetwork/embed_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package podnetwork
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
const filename = "manifests/acn.azure.com_podnetworks.yaml"
11+
12+
func TestEmbed(t *testing.T) {
13+
b, err := os.ReadFile(filename)
14+
assert.NoError(t, err)
15+
assert.Equal(t, b, PodNetworkYAML)
16+
}
17+
18+
func TestGetPodNetworks(t *testing.T) {
19+
_, err := GetPodNetworks()
20+
assert.NoError(t, err)
21+
}

0 commit comments

Comments
 (0)