-// 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{})
+}
-// 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{})
+}
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
--- /dev/null
+
+---
+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: []
--- /dev/null
+
+---
+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: []
--- /dev/null
+
+---
+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: []
information:
items:
description: CNFStatusInformation defines the runtime information
- of a CMF
+ of a CNF
properties:
ip:
type: string
- 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:
- 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:
- firewallrules
- firewallsnats
- firewalldnats
- - cnfservice
+ - cnfnats
+ - cnfroutes
+ - cnfrouterules
+ - cnfservices
+ - cnflocalservices
+ - cnfstatuses
- sdewanapplication
- ipsecproposals
- ipsechosts
- firewallrules
- firewallsnats
- firewalldnats
- - cnfservice
+ - cnfnats
+ - cnfservices
+ - cnfroutes
+ - cnfrouterules
+ - cnflocalservices
+ - cnfstatuses
- sdewanapplication
- ipsecproposals
- ipsechosts
}
return ctrl.Result{}, nil
-}
\ No newline at end of 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)
+}
-// 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)
+}
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)
-// 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
+}