github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/node.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/edge/pkg/common/message" 11 "github.com/kubeedge/kubeedge/edge/pkg/common/modules" 12 "github.com/kubeedge/kubeedge/edge/pkg/metamanager" 13 ) 14 15 //NodesGetter to get node interface 16 type NodesGetter interface { 17 Nodes(namespace string) NodesInterface 18 } 19 20 //NodesInterface is interface for client nodes 21 type NodesInterface interface { 22 Create(*api.Node) (*api.Node, error) 23 Update(*api.Node) error 24 Delete(name string) error 25 Get(name string) (*api.Node, error) 26 } 27 28 type nodes struct { 29 namespace string 30 send SendInterface 31 } 32 33 func newNodes(namespace string, s SendInterface) *nodes { 34 return &nodes{ 35 send: s, 36 namespace: namespace, 37 } 38 } 39 40 func (c *nodes) Create(cm *api.Node) (*api.Node, error) { 41 return nil, nil 42 } 43 44 func (c *nodes) Update(cm *api.Node) error { 45 resource := fmt.Sprintf("%s/%s/%s", c.namespace, model.ResourceTypeNode, cm.Name) 46 nodeMsg := message.BuildMsg(modules.MetaGroup, "", modules.EdgedModuleName, resource, model.UpdateOperation, cm) 47 _, err := c.send.SendSync(nodeMsg) 48 if err != nil { 49 return fmt.Errorf("update node failed, err: %v", err) 50 } 51 return nil 52 } 53 54 func (c *nodes) Delete(name string) error { 55 return nil 56 } 57 58 func (c *nodes) Get(name string) (*api.Node, error) { 59 resource := fmt.Sprintf("%s/%s/%s", c.namespace, model.ResourceTypeNode, name) 60 nodeMsg := message.BuildMsg(modules.MetaGroup, "", modules.EdgedModuleName, resource, model.QueryOperation, nil) 61 msg, err := c.send.SendSync(nodeMsg) 62 if err != nil { 63 return nil, fmt.Errorf("get node failed, err: %v", err) 64 } 65 66 var content []byte 67 switch msg.Content.(type) { 68 case []byte: 69 content = msg.GetContent().([]byte) 70 default: 71 content, err = json.Marshal(msg.GetContent()) 72 if err != nil { 73 return nil, fmt.Errorf("marshal message to node failed, err: %v", err) 74 } 75 } 76 77 if msg.GetOperation() == model.ResponseOperation && msg.GetSource() == metamanager.MetaManagerModuleName { 78 return handleNodeFromMetaDB(content) 79 } 80 return handleNodeFromMetaManager(content) 81 } 82 83 func handleNodeFromMetaDB(content []byte) (*api.Node, error) { 84 var lists []string 85 err := json.Unmarshal(content, &lists) 86 if err != nil { 87 return nil, fmt.Errorf("unmarshal message to node list from db failed, err: %v", err) 88 } 89 90 if len(lists) != 1 { 91 return nil, fmt.Errorf("node length from meta db is %d", len(lists)) 92 } 93 94 var node *api.Node 95 err = json.Unmarshal([]byte(lists[0]), &node) 96 if err != nil { 97 return nil, fmt.Errorf("unmarshal message to node from db failed, err: %v", err) 98 } 99 return node, nil 100 } 101 102 func handleNodeFromMetaManager(content []byte) (*api.Node, error) { 103 var node *api.Node 104 err := json.Unmarshal(content, &node) 105 if err != nil { 106 return nil, fmt.Errorf("unmarshal message to node failed, err: %v", err) 107 } 108 return node, nil 109 }