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  }