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  }