github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/endpoint.go (about) 1 package client 2 3 import ( 4 "encoding/json" 5 "fmt" 6 7 api "k8s.io/api/core/v1" 8 9 "github.com/kubeedge/beehive/pkg/core/model" 10 "github.com/kubeedge/kubeedge/common/constants" 11 "github.com/kubeedge/kubeedge/edge/pkg/common/message" 12 "github.com/kubeedge/kubeedge/edge/pkg/common/modules" 13 "github.com/kubeedge/kubeedge/edgemesh/pkg/constant" 14 ) 15 16 // EndpointsGetter has a method to return a EndpointsInterface. 17 // A group's client should implement this interface. 18 type EndpointsGetter interface { 19 Endpoints(namespace string) EndpointsInterface 20 } 21 22 // EndpointsInterface has methods to work with Endpoints resources. 23 type EndpointsInterface interface { 24 Create(*api.Endpoints) (*api.Endpoints, error) 25 Update(*api.Endpoints) error 26 Delete(name string) error 27 Get(name string) (*api.Endpoints, error) 28 } 29 30 // Endpoints is struct implementing EndpointsInterface 31 type Endpoints struct { 32 namespace string 33 send SendInterface 34 } 35 36 func newEndpoints(namespace string, s SendInterface) *Endpoints { 37 return &Endpoints{ 38 send: s, 39 namespace: namespace, 40 } 41 } 42 43 // Create Endpoints 44 func (c *Endpoints) Create(cm *api.Endpoints) (*api.Endpoints, error) { 45 return nil, nil 46 } 47 48 // Update Endpoints 49 func (c *Endpoints) Update(cm *api.Endpoints) error { 50 return nil 51 } 52 53 // Delete Endpoints 54 func (c *Endpoints) Delete(name string) error { 55 return nil 56 } 57 58 // Get Endpoints 59 func (c *Endpoints) Get(name string) (*api.Endpoints, error) { 60 resource := fmt.Sprintf("%s/%s/%s", c.namespace, constants.ResourceTypeEndpoints, name) 61 endpointMsg := message.BuildMsg(modules.MetaGroup, "", constant.ModuleNameEdgeMesh, resource, model.QueryOperation, nil) 62 msg, err := c.send.SendSync(endpointMsg) 63 if err != nil { 64 return nil, fmt.Errorf("get endpointMsg from metaManager failed, err: %v", err) 65 } 66 67 var content []byte 68 switch msg.Content.(type) { 69 case []byte: 70 content = msg.GetContent().([]byte) 71 default: 72 content, err = json.Marshal(msg.Content) 73 if err != nil { 74 return nil, fmt.Errorf("marshal message to endpointMsg failed, err: %v", err) 75 } 76 } 77 78 if msg.GetOperation() == model.ResponseOperation { 79 return handleEndpointFromMetaDB(content) 80 } 81 return handleEndpointFromMetaManager(content) 82 } 83 84 func handleEndpointFromMetaDB(content []byte) (*api.Endpoints, error) { 85 var lists []string 86 err := json.Unmarshal([]byte(content), &lists) 87 if err != nil { 88 return nil, fmt.Errorf("unmarshal message to Endpoints list from db failed, err: %v", err) 89 } 90 91 if len(lists) != 1 { 92 return nil, fmt.Errorf("endpoints length from meta db is %d", len(lists)) 93 } 94 95 var Endpoints api.Endpoints 96 err = json.Unmarshal([]byte(lists[0]), &Endpoints) 97 if err != nil { 98 return nil, fmt.Errorf("unmarshal message to Endpoint from db failed, err: %v", err) 99 } 100 return &Endpoints, nil 101 } 102 103 func handleEndpointFromMetaManager(content []byte) (*api.Endpoints, error) { 104 var Endpoints api.Endpoints 105 err := json.Unmarshal(content, &Endpoints) 106 if err != nil { 107 return nil, fmt.Errorf("unmarshal message to Endpoint failed, err: %v", err) 108 } 109 return &Endpoints, nil 110 }