// CNFServiceSpec defines the desired state of CNFService
type CNFServiceSpec struct {
- Name string `json:"name,omitempty"`
-}
-
-// CNFServiceStatus defines the observed state of CNFService
-type CNFServiceStatus struct {
- // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
- // Important: Run "make" to regenerate code after modifying this file
+ FullName string `json:"fullname,omitempty"`
+ Port string `json:"port,omitempty"`
+ DPort string `json:"dport,omitempty"`
}
// +kubebuilder:object:root=true
+// +kubebuilder:subresource:status
// CNFService is the Schema for the cnfservices API
type CNFService struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
- Spec CNFServiceSpec `json:"spec,omitempty"`
- Status CNFServiceStatus `json:"status,omitempty"`
+ Spec CNFServiceSpec `json:"spec,omitempty"`
+ Status SdewanStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
- out.Status = in.Status
+ in.Status.DeepCopyInto(&out.Status)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFService.
return out
}
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *CNFServiceStatus) DeepCopyInto(out *CNFServiceStatus) {
- *out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CNFServiceStatus.
-func (in *CNFServiceStatus) DeepCopy() *CNFServiceStatus {
- if in == nil {
- return nil
- }
- out := new(CNFServiceStatus)
- in.DeepCopyInto(out)
- return out
-}
-
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Connection) DeepCopyInto(out *Connection) {
*out = *in
plural: cnfservices
singular: cnfservice
scope: Namespaced
+ subresources:
+ status: {}
validation:
openAPIV3Schema:
description: CNFService is the Schema for the cnfservices API
spec:
description: CNFServiceSpec defines the desired state of CNFService
properties:
- name:
+ dport:
+ type: string
+ fullname:
+ type: string
+ port:
type: string
type: object
status:
- description: CNFServiceStatus defines the observed state of CNFService
+ 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
kind: CNFService
metadata:
name: cnfservice-sample
+ labels:
+ sdewanPurpose: cnf1
spec:
- # Add fields here
- foo: bar
+ fullname: foo.default.svc.cluster.local
+ port: "8866"
+ dport: "8080"
import (
"context"
+ "reflect"
"github.com/go-logr/logr"
appsv1 "k8s.io/api/apps/v1"
}
func (m *CNFServiceHandler) Convert(instance runtime.Object, deployment appsv1.Deployment) (openwrt.IOpenWrtObject, error) {
- return nil, nil
+ svc := instance.(*batchv1alpha1.CNFService)
+ openwrtsvc := openwrt.SdewanSvc{
+ Name: svc.Name,
+ FullName: svc.Spec.FullName,
+ Port: svc.Spec.Port,
+ DPort: svc.Spec.DPort,
+ }
+ return &openwrtsvc, nil
}
func (m *CNFServiceHandler) IsEqual(instance1 openwrt.IOpenWrtObject, instance2 openwrt.IOpenWrtObject) bool {
- return false
+ service1 := instance1.(*openwrt.SdewanSvc)
+ service2 := instance2.(*openwrt.SdewanSvc)
+ return reflect.DeepEqual(*service1, *service2)
}
func (m *CNFServiceHandler) GetObject(clientInfo *openwrt.OpenwrtClientInfo, name string) (openwrt.IOpenWrtObject, error) {
- return nil, nil
+ openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+ svc := openwrt.SvcClient{OpenwrtClient: openwrtClient}
+ ret, err := svc.GetSvc(name)
+ return ret, err
}
func (m *CNFServiceHandler) CreateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {
- return nil, nil
+ openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+ svc := openwrt.SvcClient{OpenwrtClient: openwrtClient}
+ service := instance.(*openwrt.SdewanSvc)
+ return svc.CreateSvc(*service)
}
func (m *CNFServiceHandler) UpdateObject(clientInfo *openwrt.OpenwrtClientInfo, instance openwrt.IOpenWrtObject) (openwrt.IOpenWrtObject, error) {
- return nil, nil
+ openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+ svc := openwrt.SvcClient{OpenwrtClient: openwrtClient}
+ service := instance.(*openwrt.SdewanSvc)
+ return svc.UpdateSvc(*service)
}
func (m *CNFServiceHandler) DeleteObject(clientInfo *openwrt.OpenwrtClientInfo, name string) error {
- return nil
+ openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
+ svc := openwrt.SvcClient{OpenwrtClient: openwrtClient}
+ return svc.DeleteSvc(name)
}
func (m *CNFServiceHandler) Restart(clientInfo *openwrt.OpenwrtClientInfo) (bool, error) {
- openwrtClient := openwrt.GetOpenwrtClient(*clientInfo)
- service := openwrt.ServiceClient{OpenwrtClient: openwrtClient}
- return service.ExecuteService("cnfService", "restart")
+ return true, nil
}
// CNFServiceReconciler reconciles a CNFService object
--- /dev/null
+package openwrt
+
+import (
+ "encoding/json"
+)
+
+const (
+ svcBaseURL = "sdewan/service/v1/"
+)
+
+type SvcClient struct {
+ OpenwrtClient *openwrtClient
+}
+
+// Svc Info
+type SdewanSvc struct {
+ Name string `json:"name"`
+ FullName string `json:"fullname"`
+ Port string `json:"port"`
+ DPort string `json:"dport"`
+}
+
+type SdewanSvcs struct {
+ Svcs []SdewanSvc `json:"svcs"`
+}
+
+func (o *SdewanSvc) GetName() string {
+ return o.Name
+}
+
+// Svc APIs
+// get svcs
+func (m *SvcClient) GetSvcs() (*SdewanSvcs, error) {
+ response, err := m.OpenwrtClient.Get(svcBaseURL + "services")
+ if err != nil {
+ return nil, err
+ }
+
+ var sdewanSvcs SdewanSvcs
+ err2 := json.Unmarshal([]byte(response), &sdewanSvcs)
+ if err2 != nil {
+ return nil, err2
+ }
+
+ return &sdewanSvcs, nil
+}
+
+// get svc
+func (m *SvcClient) GetSvc(svc_name string) (*SdewanSvc, error) {
+ response, err := m.OpenwrtClient.Get(svcBaseURL + "services/" + svc_name)
+ if err != nil {
+ return nil, err
+ }
+
+ var sdewanSvc SdewanSvc
+ err2 := json.Unmarshal([]byte(response), &sdewanSvc)
+ if err2 != nil {
+ return nil, err2
+ }
+
+ return &sdewanSvc, nil
+}
+
+// create svc
+func (m *SvcClient) CreateSvc(svc SdewanSvc) (*SdewanSvc, error) {
+ svc_obj, _ := json.Marshal(svc)
+ response, err := m.OpenwrtClient.Post(svcBaseURL+"services/", string(svc_obj))
+ if err != nil {
+ return nil, err
+ }
+
+ var sdewanSvc SdewanSvc
+ err2 := json.Unmarshal([]byte(response), &sdewanSvc)
+ if err2 != nil {
+ return nil, err2
+ }
+
+ return &sdewanSvc, nil
+}
+
+// delete svc
+func (m *SvcClient) DeleteSvc(svc_name string) error {
+ _, err := m.OpenwrtClient.Delete(svcBaseURL + "services/" + svc_name)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// update svc
+func (m *SvcClient) UpdateSvc(svc SdewanSvc) (*SdewanSvc, error) {
+ svc_obj, _ := json.Marshal(svc)
+ svc_name := svc.Name
+ response, err := m.OpenwrtClient.Put(svcBaseURL+"services/"+svc_name, string(svc_obj))
+ if err != nil {
+ return nil, err
+ }
+
+ var sdewanSvc SdewanSvc
+ err2 := json.Unmarshal([]byte(response), &sdewanSvc)
+ if err2 != nil {
+ return nil, err2
+ }
+
+ return &sdewanSvc, nil
+}