Patch based on the make generate and fmt 51/4551/1
authorLe Yao <le.yao@intel.com>
Wed, 8 Dec 2021 05:58:45 +0000 (05:58 +0000)
committerLe Yao <le.yao@intel.com>
Wed, 8 Dec 2021 06:00:07 +0000 (06:00 +0000)
Signed-off-by: Le Yao <le.yao@intel.com>
Change-Id: I9c28b7eace19430988ce928ca43d13c6b81a3759

14 files changed:
platform/crd-ctrlr/src/api/v1alpha1/cnflocalservice_types.go
platform/crd-ctrlr/src/api/v1alpha1/cnfnat_types.go
platform/crd-ctrlr/src/api/v1alpha1/zz_generated.deepcopy.go
platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnflocalservices.yaml [new file with mode: 0644]
platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfnats.yaml [new file with mode: 0644]
platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfrouterules.yaml [new file with mode: 0644]
platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfstatuses.yaml
platform/crd-ctrlr/src/config/rbac/role.yaml
platform/crd-ctrlr/src/config/webhook/manifests.yaml
platform/crd-ctrlr/src/controllers/base_controller.go
platform/crd-ctrlr/src/controllers/cnflocalservice_controller.go
platform/crd-ctrlr/src/controllers/cnfnat_controller.go
platform/crd-ctrlr/src/main.go
platform/crd-ctrlr/src/openwrt/nat.go

index 23a2545..5c5498e 100644 (file)
@@ -1,78 +1,78 @@
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-package v1alpha1\r
-\r
-import (\r
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"\r
-)\r
-\r
-// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!\r
-// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.\r
-\r
-// CNFLocalServiceStatus defines the observed state of CNFLocalServiceStatus\r
-type CNFLocalServiceStatus struct {\r
-       // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster\r
-       // Important: Run "make" to regenerate code after modifying this file\r
-       // +optional\r
-       LocalIP      string `json:"localip,omitempty"`\r
-       // +optional\r
-       LocalPort     string `json:"localport,omitempty"`\r
-       // +optional\r
-       RemoteIPs    []string `json:"remoteips,omitempty"`\r
-       // +optional\r
-       RemotePort    string `json:"remoteport,omitempty"`\r
-       // +optional\r
-       Message      string `json:"message,omitempty"`\r
-}\r
-\r
-func (c *CNFLocalServiceStatus) IsEqual(s *CNFLocalServiceStatus) bool {\r
-       if c.LocalIP != s.LocalIP ||\r
-          c.LocalPort != s.LocalPort ||\r
-          c.RemotePort != s.RemotePort {\r
-               return false\r
-          }\r
-       if len(c.RemoteIPs) != len(s.RemoteIPs) {\r
-               return false\r
-       }\r
-\r
-       for i:=0; i<len(c.RemoteIPs); i++ {\r
-               if c.RemoteIPs[i] != s.RemoteIPs[i] {\r
-                       return false\r
-               }\r
-       }\r
-\r
-       return true\r
-}\r
-\r
-// CNFLocalServiceSpec defines the desired state of CNFService\r
-type CNFLocalServiceSpec struct {\r
-       LocalService string `json:"localservice,omitempty"`\r
-       LocalPort     string `json:"localport,omitempty"`\r
-       RemoteService string `json:"remoteservice,omitempty"`\r
-       RemotePort    string `json:"remoteport,omitempty"`\r
-}\r
-\r
-// +kubebuilder:object:root=true\r
-// +kubebuilder:subresource:status\r
-\r
-// CNFLocalService is the Schema for the cnflocalservices API\r
-type CNFLocalService struct {\r
-       metav1.TypeMeta   `json:",inline"`\r
-       metav1.ObjectMeta `json:"metadata,omitempty"`\r
-\r
-       Spec   CNFLocalServiceSpec `json:"spec,omitempty"`\r
-       Status CNFLocalServiceStatus   `json:"status,omitempty"`\r
-}\r
-\r
-// +kubebuilder:object:root=true\r
-\r
-// CNFLocalServiceList contains a list of CNFLocalServiceList\r
-type CNFLocalServiceList struct {\r
-       metav1.TypeMeta `json:",inline"`\r
-       metav1.ListMeta `json:"metadata,omitempty"`\r
-       Items           []CNFLocalService `json:"items"`\r
-}\r
-\r
-func init() {\r
-       SchemeBuilder.Register(&CNFLocalService{}, &CNFLocalServiceList{})\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+package v1alpha1
+
+import (
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
+// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.
+
+// CNFLocalServiceStatus defines the observed state of CNFLocalServiceStatus
+type CNFLocalServiceStatus struct {
+       // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
+       // Important: Run "make" to regenerate code after modifying this file
+       // +optional
+       LocalIP string `json:"localip,omitempty"`
+       // +optional
+       LocalPort string `json:"localport,omitempty"`
+       // +optional
+       RemoteIPs []string `json:"remoteips,omitempty"`
+       // +optional
+       RemotePort string `json:"remoteport,omitempty"`
+       // +optional
+       Message string `json:"message,omitempty"`
+}
+
+func (c *CNFLocalServiceStatus) IsEqual(s *CNFLocalServiceStatus) bool {
+       if c.LocalIP != s.LocalIP ||
+               c.LocalPort != s.LocalPort ||
+               c.RemotePort != s.RemotePort {
+               return false
+       }
+       if len(c.RemoteIPs) != len(s.RemoteIPs) {
+               return false
+       }
+
+       for i := 0; i < len(c.RemoteIPs); i++ {
+               if c.RemoteIPs[i] != s.RemoteIPs[i] {
+                       return false
+               }
+       }
+
+       return true
+}
+
+// CNFLocalServiceSpec defines the desired state of CNFService
+type CNFLocalServiceSpec struct {
+       LocalService  string `json:"localservice,omitempty"`
+       LocalPort     string `json:"localport,omitempty"`
+       RemoteService string `json:"remoteservice,omitempty"`
+       RemotePort    string `json:"remoteport,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+
+// CNFLocalService is the Schema for the cnflocalservices API
+type CNFLocalService struct {
+       metav1.TypeMeta   `json:",inline"`
+       metav1.ObjectMeta `json:"metadata,omitempty"`
+
+       Spec   CNFLocalServiceSpec   `json:"spec,omitempty"`
+       Status CNFLocalServiceStatus `json:"status,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// CNFLocalServiceList contains a list of CNFLocalServiceList
+type CNFLocalServiceList struct {
+       metav1.TypeMeta `json:",inline"`
+       metav1.ListMeta `json:"metadata,omitempty"`
+       Items           []CNFLocalService `json:"items"`
+}
+
+func init() {
+       SchemeBuilder.Register(&CNFLocalService{}, &CNFLocalServiceList{})
+}
index 3d5c2c6..98a83af 100644 (file)
@@ -1,53 +1,53 @@
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-package v1alpha1\r
-\r
-import (\r
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"\r
-)\r
-\r
-// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!\r
-// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.\r
-\r
-// CNFNATSpec defines the desired state of CNFNAT\r
-type CNFNATSpec struct {\r
-       // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster\r
-       // Important: Run "make" to regenerate code after modifying this file\r
-       Name     string `json:"name,omitempty"`\r
-       Src      string `json:"src,omitempty"`\r
-       SrcIp    string `json:"src_ip,omitempty"`\r
-       SrcDIp   string `json:"src_dip,omitempty"`\r
-       SrcPort  string `json:"src_port,omitempty"`\r
-       SrcDPort string `json:"src_dport,omitempty"`\r
-       Proto    string `json:"proto,omitempty"`\r
-       Dest     string `json:"dest,omitempty"`\r
-       DestIp   string `json:"dest_ip,omitempty"`\r
-       DestPort string `json:"dest_port,omitempty"`\r
-       Target   string `json:"target,omitempty"`\r
-       Index   string `json:"index,omitempty"`\r
-}\r
-\r
-// +kubebuilder:object:root=true\r
-// +kubebuilder:subresource:status\r
-\r
-// CNFNAT is the Schema for the cnfnats API\r
-type CNFNAT struct {\r
-       metav1.TypeMeta   `json:",inline"`\r
-       metav1.ObjectMeta `json:"metadata,omitempty"`\r
-\r
-       Spec   CNFNATSpec `json:"spec,omitempty"`\r
-       Status SdewanStatus     `json:"status,omitempty"`\r
-}\r
-\r
-// +kubebuilder:object:root=true\r
-\r
-// CNFNATList contains a list of CNFNAT\r
-type CNFNATList struct {\r
-       metav1.TypeMeta `json:",inline"`\r
-       metav1.ListMeta `json:"metadata,omitempty"`\r
-       Items           []CNFNAT `json:"items"`\r
-}\r
-\r
-func init() {\r
-       SchemeBuilder.Register(&CNFNAT{}, &CNFNATList{})\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+package v1alpha1
+
+import (
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// EDIT THIS FILE!  THIS IS SCAFFOLDING FOR YOU TO OWN!
+// NOTE: json tags are required.  Any new fields you add must have json tags for the fields to be serialized.
+
+// CNFNATSpec defines the desired state of CNFNAT
+type CNFNATSpec struct {
+       // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
+       // Important: Run "make" to regenerate code after modifying this file
+       Name     string `json:"name,omitempty"`
+       Src      string `json:"src,omitempty"`
+       SrcIp    string `json:"src_ip,omitempty"`
+       SrcDIp   string `json:"src_dip,omitempty"`
+       SrcPort  string `json:"src_port,omitempty"`
+       SrcDPort string `json:"src_dport,omitempty"`
+       Proto    string `json:"proto,omitempty"`
+       Dest     string `json:"dest,omitempty"`
+       DestIp   string `json:"dest_ip,omitempty"`
+       DestPort string `json:"dest_port,omitempty"`
+       Target   string `json:"target,omitempty"`
+       Index    string `json:"index,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
+
+// CNFNAT is the Schema for the cnfnats API
+type CNFNAT struct {
+       metav1.TypeMeta   `json:",inline"`
+       metav1.ObjectMeta `json:"metadata,omitempty"`
+
+       Spec   CNFNATSpec   `json:"spec,omitempty"`
+       Status SdewanStatus `json:"status,omitempty"`
+}
+
+// +kubebuilder:object:root=true
+
+// CNFNATList contains a list of CNFNAT
+type CNFNATList struct {
+       metav1.TypeMeta `json:",inline"`
+       metav1.ListMeta `json:"metadata,omitempty"`
+       Items           []CNFNAT `json:"items"`
+}
+
+func init() {
+       SchemeBuilder.Register(&CNFNAT{}, &CNFNATList{})
+}
index 685a559..3afb1e8 100644 (file)
@@ -56,6 +56,174 @@ func (in BucketPermission) DeepCopy() BucketPermission {
        return *out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CNFLocalService) DeepCopyInto(out *CNFLocalService) {
+       *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 CNFLocalService.
+func (in *CNFLocalService) DeepCopy() *CNFLocalService {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFLocalService)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *CNFLocalService) 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 *CNFLocalServiceList) DeepCopyInto(out *CNFLocalServiceList) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ListMeta.DeepCopyInto(&out.ListMeta)
+       if in.Items != nil {
+               in, out := &in.Items, &out.Items
+               *out = make([]CNFLocalService, len(*in))
+               for i := range *in {
+                       (*in)[i].DeepCopyInto(&(*out)[i])
+               }
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFLocalServiceList.
+func (in *CNFLocalServiceList) DeepCopy() *CNFLocalServiceList {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFLocalServiceList)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *CNFLocalServiceList) 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 *CNFLocalServiceSpec) DeepCopyInto(out *CNFLocalServiceSpec) {
+       *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFLocalServiceSpec.
+func (in *CNFLocalServiceSpec) DeepCopy() *CNFLocalServiceSpec {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFLocalServiceSpec)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CNFLocalServiceStatus) DeepCopyInto(out *CNFLocalServiceStatus) {
+       *out = *in
+       if in.RemoteIPs != nil {
+               in, out := &in.RemoteIPs, &out.RemoteIPs
+               *out = make([]string, len(*in))
+               copy(*out, *in)
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFLocalServiceStatus.
+func (in *CNFLocalServiceStatus) DeepCopy() *CNFLocalServiceStatus {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFLocalServiceStatus)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *CNFNAT) DeepCopyInto(out *CNFNAT) {
+       *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 CNFNAT.
+func (in *CNFNAT) DeepCopy() *CNFNAT {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFNAT)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *CNFNAT) 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 *CNFNATList) DeepCopyInto(out *CNFNATList) {
+       *out = *in
+       out.TypeMeta = in.TypeMeta
+       in.ListMeta.DeepCopyInto(&out.ListMeta)
+       if in.Items != nil {
+               in, out := &in.Items, &out.Items
+               *out = make([]CNFNAT, len(*in))
+               for i := range *in {
+                       (*in)[i].DeepCopyInto(&(*out)[i])
+               }
+       }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFNATList.
+func (in *CNFNATList) DeepCopy() *CNFNATList {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFNATList)
+       in.DeepCopyInto(out)
+       return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *CNFNATList) 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 *CNFNATSpec) DeepCopyInto(out *CNFNATSpec) {
+       *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFNATSpec.
+func (in *CNFNATSpec) DeepCopy() *CNFNATSpec {
+       if in == nil {
+               return nil
+       }
+       out := new(CNFNATSpec)
+       in.DeepCopyInto(out)
+       return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *CNFRoute) DeepCopyInto(out *CNFRoute) {
        *out = *in
diff --git a/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnflocalservices.yaml b/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnflocalservices.yaml
new file mode 100644 (file)
index 0000000..8d5d7b7
--- /dev/null
@@ -0,0 +1,78 @@
+
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: cnflocalservices.batch.sdewan.akraino.org
+spec:
+  group: batch.sdewan.akraino.org
+  names:
+    kind: CNFLocalService
+    listKind: CNFLocalServiceList
+    plural: cnflocalservices
+    singular: cnflocalservice
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: CNFLocalService is the Schema for the cnflocalservices 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: CNFLocalServiceSpec defines the desired state of CNFService
+          properties:
+            localport:
+              type: string
+            localservice:
+              type: string
+            remoteport:
+              type: string
+            remoteservice:
+              type: string
+          type: object
+        status:
+          description: CNFLocalServiceStatus defines the observed state of CNFLocalServiceStatus
+          properties:
+            localip:
+              description: 'INSERT ADDITIONAL STATUS FIELD - define observed state
+                of cluster Important: Run "make" to regenerate code after modifying
+                this file'
+              type: string
+            localport:
+              type: string
+            message:
+              type: string
+            remoteips:
+              items:
+                type: string
+              type: array
+            remoteport:
+              type: string
+          type: object
+      type: object
+  version: v1alpha1
+  versions:
+  - name: v1alpha1
+    served: true
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
diff --git a/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfnats.yaml b/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfnats.yaml
new file mode 100644 (file)
index 0000000..d167ff6
--- /dev/null
@@ -0,0 +1,93 @@
+
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: cnfnats.batch.sdewan.akraino.org
+spec:
+  group: batch.sdewan.akraino.org
+  names:
+    kind: CNFNAT
+    listKind: CNFNATList
+    plural: cnfnats
+    singular: cnfnat
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: CNFNAT is the Schema for the cnfnats 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: CNFNATSpec defines the desired state of CNFNAT
+          properties:
+            dest:
+              type: string
+            dest_ip:
+              type: string
+            dest_port:
+              type: string
+            index:
+              type: string
+            name:
+              description: 'INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
+                Important: Run "make" to regenerate code after modifying this file'
+              type: string
+            proto:
+              type: string
+            src:
+              type: string
+            src_dip:
+              type: string
+            src_dport:
+              type: string
+            src_ip:
+              type: string
+            src_port:
+              type: string
+            target:
+              type: string
+          type: object
+        status:
+          description: status subsource used for Sdewan rule CRDs
+          properties:
+            appliedGeneration:
+              format: int64
+              type: integer
+            appliedTime:
+              format: date-time
+              type: string
+            message:
+              type: string
+            state:
+              type: string
+          required:
+          - state
+          type: object
+      type: object
+  version: v1alpha1
+  versions:
+  - name: v1alpha1
+    served: true
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
diff --git a/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfrouterules.yaml b/platform/crd-ctrlr/src/config/crd/bases/batch.sdewan.akraino.org_cnfrouterules.yaml
new file mode 100644 (file)
index 0000000..a8656e9
--- /dev/null
@@ -0,0 +1,79 @@
+
+---
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+  annotations:
+    controller-gen.kubebuilder.io/version: v0.2.5
+  creationTimestamp: null
+  name: cnfrouterules.batch.sdewan.akraino.org
+spec:
+  group: batch.sdewan.akraino.org
+  names:
+    kind: CNFRouteRule
+    listKind: CNFRouteRuleList
+    plural: cnfrouterules
+    singular: cnfrouterule
+  scope: Namespaced
+  subresources:
+    status: {}
+  validation:
+    openAPIV3Schema:
+      description: CNFRouteRule is the Schema for the cnfrouterules 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: CNFRouteRuleSpec defines the desired state of CNFRouteRule
+          properties:
+            dst:
+              type: string
+            fwmark:
+              type: string
+            not:
+              type: boolean
+            prio:
+              type: string
+            src:
+              type: string
+            table:
+              type: string
+          type: object
+        status:
+          description: status subsource used for Sdewan rule CRDs
+          properties:
+            appliedGeneration:
+              format: int64
+              type: integer
+            appliedTime:
+              format: date-time
+              type: string
+            message:
+              type: string
+            state:
+              type: string
+          required:
+          - state
+          type: object
+      type: object
+  version: v1alpha1
+  versions:
+  - name: v1alpha1
+    served: true
+    storage: true
+status:
+  acceptedNames:
+    kind: ""
+    plural: ""
+  conditions: []
+  storedVersions: []
index 2a24a62..647f3bc 100644 (file)
@@ -51,7 +51,7 @@ spec:
             information:
               items:
                 description: CNFStatusInformation defines the runtime information
-                  of a CMF
+                  of a CNF
                 properties:
                   ip:
                     type: string
index 24215d5..6ece12c 100644 (file)
@@ -22,6 +22,66 @@ rules:
   - get
   - list
   - watch
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnflocalservices
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnflocalservices/status
+  verbs:
+  - get
+  - patch
+  - update
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfnats
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfnats/status
+  verbs:
+  - get
+  - patch
+  - update
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfrouterules
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfrouterules/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - batch.sdewan.akraino.org
   resources:
@@ -62,6 +122,26 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfstatuses
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - batch.sdewan.akraino.org
+  resources:
+  - cnfstatuses/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - batch.sdewan.akraino.org
   resources:
index c5b1135..af93287 100644 (file)
@@ -31,7 +31,12 @@ webhooks:
     - firewallrules
     - firewallsnats
     - firewalldnats
-    - cnfservice
+    - cnfnats
+    - cnfroutes
+    - cnfrouterules
+    - cnfservices
+    - cnflocalservices
+    - cnfstatuses
     - sdewanapplication
     - ipsecproposals
     - ipsechosts
@@ -62,7 +67,12 @@ webhooks:
     - firewallrules
     - firewallsnats
     - firewalldnats
-    - cnfservice
+    - cnfnats
+    - cnfservices
+    - cnfroutes
+    - cnfrouterules
+    - cnflocalservices
+    - cnfstatuses
     - sdewanapplication
     - ipsecproposals
     - ipsechosts
index f196c7e..7b6a78d 100644 (file)
@@ -348,4 +348,4 @@ func ProcessReconcile(r client.Client, logger logr.Logger, req ctrl.Request, han
        }
 
        return ctrl.Result{}, nil
-}
\ No newline at end of file
+}
index 0b5dcdf..a45fdfe 100644 (file)
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-package controllers\r
-\r
-import (\r
-       "context"\r
-       "errors"\r
-       "net"\r
-       "strconv"\r
-       "strings"\r
-       "sync"\r
-       "time"\r
-\r
-       "github.com/go-logr/logr"\r
-       "k8s.io/apimachinery/pkg/runtime"\r
-       errs "k8s.io/apimachinery/pkg/api/errors"\r
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"\r
-       "k8s.io/apimachinery/pkg/util/wait"\r
-       ctrl "sigs.k8s.io/controller-runtime"\r
-       "sigs.k8s.io/controller-runtime/pkg/builder"\r
-       "sigs.k8s.io/controller-runtime/pkg/client"\r
-       "sigs.k8s.io/controller-runtime/pkg/predicate"\r
-\r
-       batchv1alpha1 "sdewan.akraino.org/sdewan/api/v1alpha1"\r
-)\r
-\r
-var inLSQueryStatus = false\r
-\r
-// CNFLocalServiceReconciler reconciles a CNFLocalService object\r
-type CNFLocalServiceReconciler struct {\r
-       client.Client\r
-       Log    logr.Logger\r
-       CheckInterval time.Duration\r
-       Scheme *runtime.Scheme\r
-       mux    sync.Mutex\r
-}\r
-\r
-// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnflocalservices,verbs=get;list;watch;create;update;patch;delete\r
-// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnflocalservices/status,verbs=get;update;patch\r
-\r
-func (r *CNFLocalServiceReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {\r
-       ctx := context.Background()\r
-       log := r.Log.WithValues("CNFLocalService", req.NamespacedName)\r
-       during, _ := time.ParseDuration("5s")\r
-\r
-       instance, err := r.getInstance(req)\r
-       if err != nil {\r
-               if errs.IsNotFound(err) {\r
-                       // No instance\r
-                       return ctrl.Result{}, nil\r
-               }\r
-               // Error reading the object - requeue the request.\r
-               return ctrl.Result{RequeueAfter: during}, nil\r
-       }\r
-\r
-       finalizerName := "cnflocalservice.finalizers.sdewan.akraino.org"\r
-       delete_timestamp := getDeletionTempstamp(instance)\r
-\r
-       if delete_timestamp.IsZero() {\r
-               // Creating or updating CR\r
-               // Process instance\r
-               err = r.processInstance(instance)\r
-               if err != nil {\r
-                       log.Error(err, "Adding/Updating CR")\r
-                       instance.Status.Message = err.Error()\r
-                       r.Status().Update(ctx, instance)\r
-\r
-                       return ctrl.Result{}, err\r
-               }\r
-\r
-               finalizers := getFinalizers(instance)\r
-               if !containsString(finalizers, finalizerName) {\r
-                       appendFinalizer(instance, finalizerName)\r
-                       if err := r.Update(ctx, instance); err != nil {\r
-                               return ctrl.Result{}, err\r
-                       }\r
-                       log.Info("Added finalizer for CNFLocalService")\r
-               }\r
-       } else {\r
-               // Deleting CR\r
-               // Remove instance\r
-               err = r.removeInstance(instance)\r
-               if err != nil {\r
-                       log.Error(err, "Deleting CR")\r
-                       return ctrl.Result{RequeueAfter: during}, nil\r
-               }\r
-\r
-               finalizers := getFinalizers(instance)\r
-               if containsString(finalizers, finalizerName) {\r
-                       removeFinalizer(instance, finalizerName)\r
-                       if err := r.Update(ctx, instance); err != nil {\r
-                               return ctrl.Result{}, err\r
-                       }\r
-               }\r
-       }\r
-\r
-       return ctrl.Result{}, nil\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) getInstance(req ctrl.Request) (*batchv1alpha1.CNFLocalService, error) {\r
-       instance := &batchv1alpha1.CNFLocalService{}\r
-       err := r.Get(context.Background(), req.NamespacedName, instance)\r
-       return instance, err\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) getIP4s(dns string) ([]string, error) {\r
-       ips, err := net.LookupIP(dns)\r
-       var ip4s []string\r
-\r
-       if err == nil {\r
-               for _, ip := range ips {\r
-                       if strings.Contains(ip.String(), ".") {\r
-                               ip4s = append(ip4s, ip.String())\r
-                       }\r
-               }\r
-       }\r
-\r
-       return ip4s, err\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) processInstance(instance *batchv1alpha1.CNFLocalService) error {\r
-       r.mux.Lock()\r
-       defer r.mux.Unlock()\r
-\r
-       // check local service\r
-       ls := instance.Spec.LocalService\r
-       lips, err := r.getIP4s(ls)\r
-       if err != nil || len(lips) == 0 {\r
-               if err != nil {\r
-                       r.Log.Error(err, "Local Service")\r
-               }\r
-               return errors.New("Cannot reterive LocalService ip")\r
-       }\r
-\r
-       // check remote service\r
-       rs := instance.Spec.RemoteService\r
-       rips, err := r.getIP4s(rs)\r
-       if err != nil || len(rips) == 0 {\r
-               if err != nil {\r
-                       r.Log.Error(err, "Remote Service")\r
-               }\r
-               return errors.New("Cannot reterive RemoteService ip")\r
-       }\r
-\r
-       // check local port\r
-       lp := instance.Spec.LocalPort\r
-       if lp != "" {\r
-               _, err = strconv.Atoi(lp)\r
-               if err != nil {\r
-                       return errors.New("LocalPort: " + err.Error())\r
-               }\r
-       }\r
-\r
-       // check remote port\r
-       rp := instance.Spec.RemotePort\r
-       if rp != "" {\r
-               _, err = strconv.Atoi(rp)\r
-               if err != nil {\r
-                       return errors.New("RemotePort: " + err.Error())\r
-               }\r
-       }\r
-\r
-       var curStatus = batchv1alpha1.CNFLocalServiceStatus {\r
-               LocalIP: lips[0],\r
-               LocalPort: lp,\r
-               RemoteIPs: rips,\r
-               RemotePort: rp,\r
-               Message: "",\r
-       }\r
-\r
-       if !curStatus.IsEqual(&instance.Status) {\r
-               r.removeNats(instance)\r
-               r.addNats(instance, &curStatus)\r
-               instance.Status = curStatus\r
-               r.Status().Update(context.Background(), instance)\r
-       }\r
-\r
-       return nil\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) addNats(instance *batchv1alpha1.CNFLocalService, status *batchv1alpha1.CNFLocalServiceStatus) error {\r
-       r.Log.Info("Creating New CNFNAT CR for Local Service : " + instance.Name)\r
-       nat_base_name := instance.Name + "nat"\r
-       for i, rip := range status.RemoteIPs {\r
-               nat_name := nat_base_name + strconv.Itoa(i)\r
-               nat_instance := &batchv1alpha1.CNFNAT{\r
-                       ObjectMeta: metav1.ObjectMeta{\r
-                               Name:      nat_name,\r
-                               Namespace: instance.Namespace,\r
-                               Labels: instance.Labels,\r
-                       },\r
-                       Spec: batchv1alpha1.CNFNATSpec{\r
-                               SrcDIp: rip,\r
-                               SrcDPort: status.RemotePort,\r
-                               DestIp: status.LocalIP,\r
-                               DestPort: status.LocalPort,\r
-                               Proto: "tcp",\r
-                               Target: "DNAT",\r
-                       },\r
-               }\r
-\r
-               err := r.Create(context.Background(), nat_instance)\r
-               if err != nil {\r
-                       r.Log.Error(err, "Creating NAT CR : " + nat_name)\r
-               }\r
-       }\r
-       return nil\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) removeInstance(instance *batchv1alpha1.CNFLocalService) error {\r
-       r.mux.Lock()\r
-       defer r.mux.Unlock()\r
-       return r.removeNats(instance)\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) removeNats(instance *batchv1alpha1.CNFLocalService) error {\r
-       r.Log.Info("Deleting CNFNAT CR for Local Service : " + instance.Name)\r
-       nat_base_name := instance.Name + "nat"\r
-       for i, _ := range instance.Status.RemoteIPs {\r
-               nat_name := nat_base_name + strconv.Itoa(i)\r
-               nat_instance := &batchv1alpha1.CNFNAT{\r
-                       ObjectMeta: metav1.ObjectMeta{\r
-                               Name:      nat_name,\r
-                               Namespace: instance.Namespace,\r
-                               Labels: instance.Labels,\r
-                       },\r
-                       Spec: batchv1alpha1.CNFNATSpec{},\r
-               }\r
-\r
-               err := r.Delete(context.Background(), nat_instance)\r
-               if err != nil {\r
-                       r.Log.Error(err, "Deleting NAT CR : " + nat_name)\r
-               }\r
-\r
-               // check resource\r
-               err = wait.PollImmediate(time.Second, time.Second*10,\r
-                       func() (bool, error) {\r
-                               nat_instance_temp := &batchv1alpha1.CNFNAT{}\r
-                               err_get := r.Get(context.Background(), client.ObjectKey{\r
-                                       Namespace: instance.Namespace,\r
-                                       Name:      nat_name,\r
-                               }, nat_instance_temp)\r
-\r
-                               if errs.IsNotFound(err_get) {\r
-                                       return true, nil\r
-                               }\r
-                               r.Log.Info("Waiting for Deleting CR : " + nat_name)\r
-                               return false, nil\r
-                       },\r
-               )\r
-\r
-               if err != nil {\r
-                       r.Log.Error(err, "Failed to delete CR : " + nat_name)\r
-               }\r
-       }\r
-\r
-       return nil\r
-}\r
-\r
-// Query CNFStatus information\r
-func (r *CNFLocalServiceReconciler) check() {\r
-       ls_list := &batchv1alpha1.CNFLocalServiceList{}\r
-       err := r.List(context.Background(), ls_list)\r
-       if err != nil {\r
-               r.Log.Error(err, "Failed to list CNFLocalService CRs")\r
-       } else {\r
-               if len(ls_list.Items) > 0 {\r
-                       for _, inst := range ls_list.Items {\r
-                               r.Log.Info("Checking CNFLocalService: " + inst.Name)\r
-                               r.processInstance(&inst)\r
-                       }\r
-               }\r
-       }\r
-}\r
-\r
-// Query CNFStatus information\r
-func (r *CNFLocalServiceReconciler) SafeCheck() {\r
-       doCheck := true\r
-       r.mux.Lock()\r
-       if !inLSQueryStatus {\r
-               inLSQueryStatus = true\r
-       } else {\r
-               doCheck = false\r
-       }\r
-       r.mux.Unlock()\r
-\r
-       if doCheck {\r
-               r.check()\r
-\r
-               r.mux.Lock()\r
-               inLSQueryStatus = false\r
-               r.mux.Unlock()\r
-       }\r
-}\r
-\r
-func (r *CNFLocalServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {\r
-       // Start the loop to check ip address change of local/remote services\r
-       go func() {\r
-                       interval := time.After(r.CheckInterval)\r
-                       for {\r
-                               select {\r
-                               case <-interval:\r
-                                       r.SafeCheck()\r
-                                       interval = time.After(r.CheckInterval)\r
-                               case <-context.Background().Done():\r
-                                       return\r
-                               }\r
-                       }\r
-               }()\r
-\r
-       ps := builder.WithPredicates(predicate.GenerationChangedPredicate{})\r
-       return ctrl.NewControllerManagedBy(mgr).\r
-               For(&batchv1alpha1.CNFLocalService{}, ps).\r
-               Complete(r)\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+package controllers
+
+import (
+       "context"
+       "errors"
+       "net"
+       "strconv"
+       "strings"
+       "sync"
+       "time"
+
+       "github.com/go-logr/logr"
+       errs "k8s.io/apimachinery/pkg/api/errors"
+       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+       "k8s.io/apimachinery/pkg/runtime"
+       "k8s.io/apimachinery/pkg/util/wait"
+       ctrl "sigs.k8s.io/controller-runtime"
+       "sigs.k8s.io/controller-runtime/pkg/builder"
+       "sigs.k8s.io/controller-runtime/pkg/client"
+       "sigs.k8s.io/controller-runtime/pkg/predicate"
+
+       batchv1alpha1 "sdewan.akraino.org/sdewan/api/v1alpha1"
+)
+
+var inLSQueryStatus = false
+
+// CNFLocalServiceReconciler reconciles a CNFLocalService object
+type CNFLocalServiceReconciler struct {
+       client.Client
+       Log           logr.Logger
+       CheckInterval time.Duration
+       Scheme        *runtime.Scheme
+       mux           sync.Mutex
+}
+
+// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnflocalservices,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnflocalservices/status,verbs=get;update;patch
+
+func (r *CNFLocalServiceReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
+       ctx := context.Background()
+       log := r.Log.WithValues("CNFLocalService", req.NamespacedName)
+       during, _ := time.ParseDuration("5s")
+
+       instance, err := r.getInstance(req)
+       if err != nil {
+               if errs.IsNotFound(err) {
+                       // No instance
+                       return ctrl.Result{}, nil
+               }
+               // Error reading the object - requeue the request.
+               return ctrl.Result{RequeueAfter: during}, nil
+       }
+
+       finalizerName := "cnflocalservice.finalizers.sdewan.akraino.org"
+       delete_timestamp := getDeletionTempstamp(instance)
+
+       if delete_timestamp.IsZero() {
+               // Creating or updating CR
+               // Process instance
+               err = r.processInstance(instance)
+               if err != nil {
+                       log.Error(err, "Adding/Updating CR")
+                       instance.Status.Message = err.Error()
+                       r.Status().Update(ctx, instance)
+
+                       return ctrl.Result{}, err
+               }
+
+               finalizers := getFinalizers(instance)
+               if !containsString(finalizers, finalizerName) {
+                       appendFinalizer(instance, finalizerName)
+                       if err := r.Update(ctx, instance); err != nil {
+                               return ctrl.Result{}, err
+                       }
+                       log.Info("Added finalizer for CNFLocalService")
+               }
+       } else {
+               // Deleting CR
+               // Remove instance
+               err = r.removeInstance(instance)
+               if err != nil {
+                       log.Error(err, "Deleting CR")
+                       return ctrl.Result{RequeueAfter: during}, nil
+               }
+
+               finalizers := getFinalizers(instance)
+               if containsString(finalizers, finalizerName) {
+                       removeFinalizer(instance, finalizerName)
+                       if err := r.Update(ctx, instance); err != nil {
+                               return ctrl.Result{}, err
+                       }
+               }
+       }
+
+       return ctrl.Result{}, nil
+}
+
+func (r *CNFLocalServiceReconciler) getInstance(req ctrl.Request) (*batchv1alpha1.CNFLocalService, error) {
+       instance := &batchv1alpha1.CNFLocalService{}
+       err := r.Get(context.Background(), req.NamespacedName, instance)
+       return instance, err
+}
+
+func (r *CNFLocalServiceReconciler) getIP4s(dns string) ([]string, error) {
+       ips, err := net.LookupIP(dns)
+       var ip4s []string
+
+       if err == nil {
+               for _, ip := range ips {
+                       if strings.Contains(ip.String(), ".") {
+                               ip4s = append(ip4s, ip.String())
+                       }
+               }
+       }
+
+       return ip4s, err
+}
+
+func (r *CNFLocalServiceReconciler) processInstance(instance *batchv1alpha1.CNFLocalService) error {
+       r.mux.Lock()
+       defer r.mux.Unlock()
+
+       // check local service
+       ls := instance.Spec.LocalService
+       lips, err := r.getIP4s(ls)
+       if err != nil || len(lips) == 0 {
+               if err != nil {
+                       r.Log.Error(err, "Local Service")
+               }
+               return errors.New("Cannot reterive LocalService ip")
+       }
+
+       // check remote service
+       rs := instance.Spec.RemoteService
+       rips, err := r.getIP4s(rs)
+       if err != nil || len(rips) == 0 {
+               if err != nil {
+                       r.Log.Error(err, "Remote Service")
+               }
+               return errors.New("Cannot reterive RemoteService ip")
+       }
+
+       // check local port
+       lp := instance.Spec.LocalPort
+       if lp != "" {
+               _, err = strconv.Atoi(lp)
+               if err != nil {
+                       return errors.New("LocalPort: " + err.Error())
+               }
+       }
+
+       // check remote port
+       rp := instance.Spec.RemotePort
+       if rp != "" {
+               _, err = strconv.Atoi(rp)
+               if err != nil {
+                       return errors.New("RemotePort: " + err.Error())
+               }
+       }
+
+       var curStatus = batchv1alpha1.CNFLocalServiceStatus{
+               LocalIP:    lips[0],
+               LocalPort:  lp,
+               RemoteIPs:  rips,
+               RemotePort: rp,
+               Message:    "",
+       }
+
+       if !curStatus.IsEqual(&instance.Status) {
+               r.removeNats(instance)
+               r.addNats(instance, &curStatus)
+               instance.Status = curStatus
+               r.Status().Update(context.Background(), instance)
+       }
+
+       return nil
+}
+
+func (r *CNFLocalServiceReconciler) addNats(instance *batchv1alpha1.CNFLocalService, status *batchv1alpha1.CNFLocalServiceStatus) error {
+       r.Log.Info("Creating New CNFNAT CR for Local Service : " + instance.Name)
+       nat_base_name := instance.Name + "nat"
+       for i, rip := range status.RemoteIPs {
+               nat_name := nat_base_name + strconv.Itoa(i)
+               nat_instance := &batchv1alpha1.CNFNAT{
+                       ObjectMeta: metav1.ObjectMeta{
+                               Name:      nat_name,
+                               Namespace: instance.Namespace,
+                               Labels:    instance.Labels,
+                       },
+                       Spec: batchv1alpha1.CNFNATSpec{
+                               SrcDIp:   rip,
+                               SrcDPort: status.RemotePort,
+                               DestIp:   status.LocalIP,
+                               DestPort: status.LocalPort,
+                               Proto:    "tcp",
+                               Target:   "DNAT",
+                       },
+               }
+
+               err := r.Create(context.Background(), nat_instance)
+               if err != nil {
+                       r.Log.Error(err, "Creating NAT CR : "+nat_name)
+               }
+       }
+       return nil
+}
+
+func (r *CNFLocalServiceReconciler) removeInstance(instance *batchv1alpha1.CNFLocalService) error {
+       r.mux.Lock()
+       defer r.mux.Unlock()
+       return r.removeNats(instance)
+}
+
+func (r *CNFLocalServiceReconciler) removeNats(instance *batchv1alpha1.CNFLocalService) error {
+       r.Log.Info("Deleting CNFNAT CR for Local Service : " + instance.Name)
+       nat_base_name := instance.Name + "nat"
+       for i, _ := range instance.Status.RemoteIPs {
+               nat_name := nat_base_name + strconv.Itoa(i)
+               nat_instance := &batchv1alpha1.CNFNAT{
+                       ObjectMeta: metav1.ObjectMeta{
+                               Name:      nat_name,
+                               Namespace: instance.Namespace,
+                               Labels:    instance.Labels,
+                       },
+                       Spec: batchv1alpha1.CNFNATSpec{},
+               }
+
+               err := r.Delete(context.Background(), nat_instance)
+               if err != nil {
+                       r.Log.Error(err, "Deleting NAT CR : "+nat_name)
+               }
+
+               // check resource
+               err = wait.PollImmediate(time.Second, time.Second*10,
+                       func() (bool, error) {
+                               nat_instance_temp := &batchv1alpha1.CNFNAT{}
+                               err_get := r.Get(context.Background(), client.ObjectKey{
+                                       Namespace: instance.Namespace,
+                                       Name:      nat_name,
+                               }, nat_instance_temp)
+
+                               if errs.IsNotFound(err_get) {
+                                       return true, nil
+                               }
+                               r.Log.Info("Waiting for Deleting CR : " + nat_name)
+                               return false, nil
+                       },
+               )
+
+               if err != nil {
+                       r.Log.Error(err, "Failed to delete CR : "+nat_name)
+               }
+       }
+
+       return nil
+}
+
+// Query CNFStatus information
+func (r *CNFLocalServiceReconciler) check() {
+       ls_list := &batchv1alpha1.CNFLocalServiceList{}
+       err := r.List(context.Background(), ls_list)
+       if err != nil {
+               r.Log.Error(err, "Failed to list CNFLocalService CRs")
+       } else {
+               if len(ls_list.Items) > 0 {
+                       for _, inst := range ls_list.Items {
+                               r.Log.Info("Checking CNFLocalService: " + inst.Name)
+                               r.processInstance(&inst)
+                       }
+               }
+       }
+}
+
+// Query CNFStatus information
+func (r *CNFLocalServiceReconciler) SafeCheck() {
+       doCheck := true
+       r.mux.Lock()
+       if !inLSQueryStatus {
+               inLSQueryStatus = true
+       } else {
+               doCheck = false
+       }
+       r.mux.Unlock()
+
+       if doCheck {
+               r.check()
+
+               r.mux.Lock()
+               inLSQueryStatus = false
+               r.mux.Unlock()
+       }
+}
+
+func (r *CNFLocalServiceReconciler) SetupWithManager(mgr ctrl.Manager) error {
+       // Start the loop to check ip address change of local/remote services
+       go func() {
+               interval := time.After(r.CheckInterval)
+               for {
+                       select {
+                       case <-interval:
+                               r.SafeCheck()
+                               interval = time.After(r.CheckInterval)
+                       case <-context.Background().Done():
+                               return
+                       }
+               }
+       }()
+
+       ps := builder.WithPredicates(predicate.GenerationChangedPredicate{})
+       return ctrl.NewControllerManagedBy(mgr).
+               For(&batchv1alpha1.CNFLocalService{}, ps).
+               Complete(r)
+}
index bbb7cea..bee2cff 100644 (file)
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-package controllers\r
-\r
-import (\r
-       "context"\r
-       "reflect"\r
-\r
-       "github.com/go-logr/logr"\r
-       appsv1 "k8s.io/api/apps/v1"\r
-       "k8s.io/apimachinery/pkg/runtime"\r
-       ctrl "sigs.k8s.io/controller-runtime"\r
-       "sigs.k8s.io/controller-runtime/pkg/builder"\r
-       "sigs.k8s.io/controller-runtime/pkg/client"\r
-       "sigs.k8s.io/controller-runtime/pkg/handler"\r
-       "sigs.k8s.io/controller-runtime/pkg/predicate"\r
-       "sigs.k8s.io/controller-runtime/pkg/source"\r
-\r
-       batchv1alpha1 "sdewan.akraino.org/sdewan/api/v1alpha1"\r
-       "sdewan.akraino.org/sdewan/openwrt"\r
-)\r
-\r
-var cnfnatHandler = new(CNFNatHandler)\r
-\r
-type CNFNatHandler struct {\r
-}\r
-\r
-func (m *CNFNatHandler) GetType() string {\r
-       return "CNFNAT"\r
-}\r
-\r
-func (m *CNFNatHandler) GetName(instance runtime.Object) string {\r
-       nat := instance.(*batchv1alpha1.CNFNAT)\r
-       return nat.Name\r
-}\r
-\r
-func (m *CNFNatHandler) GetFinalizer() string {\r
-       return "cnfnat.finalizers.sdewan.akraino.org"\r
-}\r
-\r
-func (m *CNFNatHandler) GetInstance(r client.Client, ctx context.Context, req ctrl.Request) (runtime.Object, error) {\r
-       instance := &batchv1alpha1.CNFNAT{}\r
-       err := r.Get(ctx, req.NamespacedName, instance)\r
-       return instance, err\r
-}\r
-\r
-//pupulate "nat" to target field as default value\r
-func (m *CNFNatHandler) Convert(instance runtime.Object, deployment appsv1.Deployment) (openwrt.IOpenWrtObject, error) {\r
-       cnfnat := instance.(*batchv1alpha1.CNFNAT)\r
-       cnfnat.Spec.Name = cnfnat.ObjectMeta.Name\r
-       cnfnatObject := openwrt.SdewanNat(cnfnat.Spec)\r
-       return &cnfnatObject, nil\r
-}\r
-\r
-func (m *CNFNatHandler) IsEqual(instance1 openwrt.IOpenWrtObject, instance2 openwrt.IOpenWrtObject) bool {\r
-       nat1 := instance1.(*openwrt.SdewanNat)\r
-       nat2 := instance2.(*openwrt.SdewanNat)\r
-       return reflect.DeepEqual(*nat1, *nat2)\r
-}\r
-\r
-func (m *CNFNatHandler) GetObject(clientInfo *openwrt.OpenwrtClientInfo, name string) (openwrt.IOpenWrtObject, error) {\r
-       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)\r
-       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}\r
-       ret, err := natClient.GetNat(name)\r
-       return ret, err\r
-}\r
-\r
-func (m *CNFNatHandler) CreateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {\r
-       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)\r
-       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}\r
-       nat := instance.(*openwrt.SdewanNat)\r
-       return natClient.CreateNat(*nat)\r
-}\r
-\r
-func (m *CNFNatHandler) UpdateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {\r
-       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)\r
-       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}\r
-       nat := instance.(*openwrt.SdewanNat)\r
-       return natClient.UpdateNat(*nat)\r
-}\r
-\r
-func (m *CNFNatHandler) DeleteObject(clientInfo *openwrt.OpenwrtClientInfo, name string) error {\r
-       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)\r
-       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}\r
-       return natClient.DeleteNat(name)\r
-}\r
-\r
-func (m *CNFNatHandler) Restart(clientInfo *openwrt.OpenwrtClientInfo) (bool, error) {\r
-       return true, nil\r
-}\r
-\r
-// CNFNATReconciler reconciles a CNFNAT object\r
-type CNFNATReconciler struct {\r
-       client.Client\r
-       Log    logr.Logger\r
-       Scheme *runtime.Scheme\r
-}\r
-\r
-// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnfnats,verbs=get;list;watch;create;update;patch;delete\r
-// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnfnats/status,verbs=get;update;patch\r
-\r
-func (r *CNFNATReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {\r
-       return ProcessReconcile(r, r.Log, req, cnfnatHandler)\r
-}\r
-\r
-func (r *CNFNATReconciler) SetupWithManager(mgr ctrl.Manager) error {\r
-       ps := builder.WithPredicates(predicate.GenerationChangedPredicate{})\r
-       return ctrl.NewControllerManagedBy(mgr).\r
-               For(&batchv1alpha1.CNFNAT{}, ps).\r
-               Watches(\r
-                       &source.Kind{Type: &appsv1.Deployment{}},\r
-                       &handler.EnqueueRequestsFromMapFunc{\r
-                               ToRequests: handler.ToRequestsFunc(GetToRequestsFunc(r, &batchv1alpha1.CNFNATList{})),\r
-                       },\r
-                       Filter).\r
-               Complete(r)\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+package controllers
+
+import (
+       "context"
+       "reflect"
+
+       "github.com/go-logr/logr"
+       appsv1 "k8s.io/api/apps/v1"
+       "k8s.io/apimachinery/pkg/runtime"
+       ctrl "sigs.k8s.io/controller-runtime"
+       "sigs.k8s.io/controller-runtime/pkg/builder"
+       "sigs.k8s.io/controller-runtime/pkg/client"
+       "sigs.k8s.io/controller-runtime/pkg/handler"
+       "sigs.k8s.io/controller-runtime/pkg/predicate"
+       "sigs.k8s.io/controller-runtime/pkg/source"
+
+       batchv1alpha1 "sdewan.akraino.org/sdewan/api/v1alpha1"
+       "sdewan.akraino.org/sdewan/openwrt"
+)
+
+var cnfnatHandler = new(CNFNatHandler)
+
+type CNFNatHandler struct {
+}
+
+func (m *CNFNatHandler) GetType() string {
+       return "CNFNAT"
+}
+
+func (m *CNFNatHandler) GetName(instance runtime.Object) string {
+       nat := instance.(*batchv1alpha1.CNFNAT)
+       return nat.Name
+}
+
+func (m *CNFNatHandler) GetFinalizer() string {
+       return "cnfnat.finalizers.sdewan.akraino.org"
+}
+
+func (m *CNFNatHandler) GetInstance(r client.Client, ctx context.Context, req ctrl.Request) (runtime.Object, error) {
+       instance := &batchv1alpha1.CNFNAT{}
+       err := r.Get(ctx, req.NamespacedName, instance)
+       return instance, err
+}
+
+//pupulate "nat" to target field as default value
+func (m *CNFNatHandler) Convert(instance runtime.Object, deployment appsv1.Deployment) (openwrt.IOpenWrtObject, error) {
+       cnfnat := instance.(*batchv1alpha1.CNFNAT)
+       cnfnat.Spec.Name = cnfnat.ObjectMeta.Name
+       cnfnatObject := openwrt.SdewanNat(cnfnat.Spec)
+       return &cnfnatObject, nil
+}
+
+func (m *CNFNatHandler) IsEqual(instance1 openwrt.IOpenWrtObject, instance2 openwrt.IOpenWrtObject) bool {
+       nat1 := instance1.(*openwrt.SdewanNat)
+       nat2 := instance2.(*openwrt.SdewanNat)
+       return reflect.DeepEqual(*nat1, *nat2)
+}
+
+func (m *CNFNatHandler) GetObject(clientInfo *openwrt.OpenwrtClientInfo, name string) (openwrt.IOpenWrtObject, error) {
+       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}
+       ret, err := natClient.GetNat(name)
+       return ret, err
+}
+
+func (m *CNFNatHandler) CreateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {
+       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}
+       nat := instance.(*openwrt.SdewanNat)
+       return natClient.CreateNat(*nat)
+}
+
+func (m *CNFNatHandler) UpdateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {
+       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}
+       nat := instance.(*openwrt.SdewanNat)
+       return natClient.UpdateNat(*nat)
+}
+
+func (m *CNFNatHandler) DeleteObject(clientInfo *openwrt.OpenwrtClientInfo, name string) error {
+       openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+       natClient := openwrt.NatClient{OpenwrtClient: openwrtClient}
+       return natClient.DeleteNat(name)
+}
+
+func (m *CNFNatHandler) Restart(clientInfo *openwrt.OpenwrtClientInfo) (bool, error) {
+       return true, nil
+}
+
+// CNFNATReconciler reconciles a CNFNAT object
+type CNFNATReconciler struct {
+       client.Client
+       Log    logr.Logger
+       Scheme *runtime.Scheme
+}
+
+// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnfnats,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=batch.sdewan.akraino.org,resources=cnfnats/status,verbs=get;update;patch
+
+func (r *CNFNATReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
+       return ProcessReconcile(r, r.Log, req, cnfnatHandler)
+}
+
+func (r *CNFNATReconciler) SetupWithManager(mgr ctrl.Manager) error {
+       ps := builder.WithPredicates(predicate.GenerationChangedPredicate{})
+       return ctrl.NewControllerManagedBy(mgr).
+               For(&batchv1alpha1.CNFNAT{}, ps).
+               Watches(
+                       &source.Kind{Type: &appsv1.Deployment{}},
+                       &handler.EnqueueRequestsFromMapFunc{
+                               ToRequests: handler.ToRequestsFunc(GetToRequestsFunc(r, &batchv1alpha1.CNFNATList{})),
+                       },
+                       Filter).
+               Complete(r)
+}
index c10e933..e90514a 100644 (file)
@@ -241,10 +241,10 @@ func main() {
                os.Exit(1)
        }
        if err = (&controllers.CNFLocalServiceReconciler{
-               Client: mgr.GetClient(),
-               Log:    ctrl.Log.WithName("controllers").WithName("CNFLocalService"),
+               Client:        mgr.GetClient(),
+               Log:           ctrl.Log.WithName("controllers").WithName("CNFLocalService"),
                CheckInterval: time.Duration(checkInterval) * time.Second,
-               Scheme: mgr.GetScheme(),
+               Scheme:        mgr.GetScheme(),
        }).SetupWithManager(mgr); err != nil {
                setupLog.Error(err, "unable to create controller", "controller", "CNFLocalService")
                os.Exit(1)
index 7ca7db6..46d87ce 100644 (file)
-// SPDX-License-Identifier: Apache-2.0\r
-// Copyright (c) 2021 Intel Corporation\r
-\r
-package openwrt\r
-\r
-import (\r
-       "encoding/json"\r
-)\r
-\r
-const (\r
-       natBaseURL = "sdewan/nat/v1/"\r
-)\r
-\r
-type NatClient struct {\r
-       OpenwrtClient *openwrtClient\r
-}\r
-\r
-// Nat\r
-type SdewanNat struct {\r
-       Name     string `json:"name"`\r
-       Src      string `json:"src"`\r
-       SrcIp    string `json:"src_ip"`\r
-       SrcDIp   string `json:"src_dip"`\r
-       SrcPort  string `json:"src_port"`\r
-       SrcDPort string `json:"src_dport"`\r
-       Proto    string `json:"proto"`\r
-       Dest     string `json:"dest"`\r
-       DestIp   string `json:"dest_ip"`\r
-       DestPort string `json:"dest_port"`\r
-       Target   string `json:"target"`\r
-       Index    string `json:"index"`\r
-}\r
-\r
-func (o *SdewanNat) GetName() string {\r
-       return o.Name\r
-}\r
-\r
-type SdewanNats struct {\r
-       Nats []SdewanNat `json:"nats"`\r
-}\r
-\r
-// Nat APIs\r
-// get nats\r
-func (f *NatClient) GetNats() (*SdewanNats, error) {\r
-       var response string\r
-       var err error\r
-       response, err = f.OpenwrtClient.Get(natBaseURL + "nats")\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       var sdewanNats SdewanNats\r
-       err = json.Unmarshal([]byte(response), &sdewanNats)\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       return &sdewanNats, nil\r
-}\r
-\r
-// get nat\r
-func (m *NatClient) GetNat(nat string) (*SdewanNat, error) {\r
-       var response string\r
-       var err error\r
-       response, err = m.OpenwrtClient.Get(natBaseURL + "nats/" + nat)\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       var sdewanNat SdewanNat\r
-       err = json.Unmarshal([]byte(response), &sdewanNat)\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       return &sdewanNat, nil\r
-}\r
-\r
-// create nat\r
-func (m *NatClient) CreateNat(nat SdewanNat) (*SdewanNat, error) {\r
-       var response string\r
-       var err error\r
-       nat_obj, _ := json.Marshal(nat)\r
-       response, err = m.OpenwrtClient.Post(natBaseURL+"nats", string(nat_obj))\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       var sdewanNat SdewanNat\r
-       err = json.Unmarshal([]byte(response), &sdewanNat)\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       return &sdewanNat, nil\r
-}\r
-\r
-// delete nat\r
-func (m *NatClient) DeleteNat(nat_name string) error {\r
-       _, err := m.OpenwrtClient.Delete(natBaseURL + "nats/" + nat_name)\r
-       if err != nil {\r
-               return err\r
-       }\r
-\r
-       return nil\r
-}\r
-\r
-// update nat\r
-func (m *NatClient) UpdateNat(nat SdewanNat) (*SdewanNat, error) {\r
-       var response string\r
-       var err error\r
-       nat_obj, _ := json.Marshal(nat)\r
-       nat_name := nat.Name\r
-       response, err = m.OpenwrtClient.Put(natBaseURL+"nats/"+nat_name, string(nat_obj))\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       var sdewanNat SdewanNat\r
-       err = json.Unmarshal([]byte(response), &sdewanNat)\r
-       if err != nil {\r
-               return nil, err\r
-       }\r
-\r
-       return &sdewanNat, nil\r
-}\r
+// SPDX-License-Identifier: Apache-2.0
+// Copyright (c) 2021 Intel Corporation
+
+package openwrt
+
+import (
+       "encoding/json"
+)
+
+const (
+       natBaseURL = "sdewan/nat/v1/"
+)
+
+type NatClient struct {
+       OpenwrtClient *openwrtClient
+}
+
+// Nat
+type SdewanNat struct {
+       Name     string `json:"name"`
+       Src      string `json:"src"`
+       SrcIp    string `json:"src_ip"`
+       SrcDIp   string `json:"src_dip"`
+       SrcPort  string `json:"src_port"`
+       SrcDPort string `json:"src_dport"`
+       Proto    string `json:"proto"`
+       Dest     string `json:"dest"`
+       DestIp   string `json:"dest_ip"`
+       DestPort string `json:"dest_port"`
+       Target   string `json:"target"`
+       Index    string `json:"index"`
+}
+
+func (o *SdewanNat) GetName() string {
+       return o.Name
+}
+
+type SdewanNats struct {
+       Nats []SdewanNat `json:"nats"`
+}
+
+// Nat APIs
+// get nats
+func (f *NatClient) GetNats() (*SdewanNats, error) {
+       var response string
+       var err error
+       response, err = f.OpenwrtClient.Get(natBaseURL + "nats")
+       if err != nil {
+               return nil, err
+       }
+
+       var sdewanNats SdewanNats
+       err = json.Unmarshal([]byte(response), &sdewanNats)
+       if err != nil {
+               return nil, err
+       }
+
+       return &sdewanNats, nil
+}
+
+// get nat
+func (m *NatClient) GetNat(nat string) (*SdewanNat, error) {
+       var response string
+       var err error
+       response, err = m.OpenwrtClient.Get(natBaseURL + "nats/" + nat)
+       if err != nil {
+               return nil, err
+       }
+
+       var sdewanNat SdewanNat
+       err = json.Unmarshal([]byte(response), &sdewanNat)
+       if err != nil {
+               return nil, err
+       }
+
+       return &sdewanNat, nil
+}
+
+// create nat
+func (m *NatClient) CreateNat(nat SdewanNat) (*SdewanNat, error) {
+       var response string
+       var err error
+       nat_obj, _ := json.Marshal(nat)
+       response, err = m.OpenwrtClient.Post(natBaseURL+"nats", string(nat_obj))
+       if err != nil {
+               return nil, err
+       }
+
+       var sdewanNat SdewanNat
+       err = json.Unmarshal([]byte(response), &sdewanNat)
+       if err != nil {
+               return nil, err
+       }
+
+       return &sdewanNat, nil
+}
+
+// delete nat
+func (m *NatClient) DeleteNat(nat_name string) error {
+       _, err := m.OpenwrtClient.Delete(natBaseURL + "nats/" + nat_name)
+       if err != nil {
+               return err
+       }
+
+       return nil
+}
+
+// update nat
+func (m *NatClient) UpdateNat(nat SdewanNat) (*SdewanNat, error) {
+       var response string
+       var err error
+       nat_obj, _ := json.Marshal(nat)
+       nat_name := nat.Name
+       response, err = m.OpenwrtClient.Put(natBaseURL+"nats/"+nat_name, string(nat_obj))
+       if err != nil {
+               return nil, err
+       }
+
+       var sdewanNat SdewanNat
+       err = json.Unmarshal([]byte(response), &sdewanNat)
+       if err != nil {
+               return nil, err
+       }
+
+       return &sdewanNat, nil
+}