github.com/jingruilea/kubeedge@v1.2.0-beta.0.0.20200410162146-4bb8902b3879/edge/pkg/metamanager/client/service.go (about)

     1  package client
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  
     7  	"github.com/kubeedge/beehive/pkg/core/model"
     8  	v1 "k8s.io/api/core/v1"
     9  
    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  // ServiceGetter interface
    17  type ServiceGetter interface {
    18  	Services(namespace string) ServiceInterface
    19  }
    20  
    21  // ServiceInterface is an interface
    22  type ServiceInterface interface {
    23  	Create(*v1.Service) (*v1.Service, error)
    24  	Update(service *v1.Service) error
    25  	Delete(name string) error
    26  	Get(name string) (*v1.Service, error)
    27  	GetPods(name string) ([]v1.Pod, error)
    28  	ListAll() ([]v1.Service, error)
    29  }
    30  
    31  type services struct {
    32  	namespace string
    33  	send      SendInterface
    34  }
    35  
    36  func newServices(namespace string, s SendInterface) *services {
    37  	return &services{
    38  		namespace: namespace,
    39  		send:      s,
    40  	}
    41  }
    42  
    43  func (s *services) Create(*v1.Service) (*v1.Service, error) {
    44  	return &v1.Service{}, nil
    45  }
    46  
    47  func (s *services) Update(service *v1.Service) error {
    48  	return nil
    49  }
    50  
    51  func (s *services) Delete(name string) error {
    52  	return nil
    53  }
    54  
    55  func (s *services) GetPods(name string) ([]v1.Pod, error) {
    56  	resource := fmt.Sprintf("%s/%s/%s", s.namespace, model.ResourceTypePodlist, name)
    57  	msg := message.BuildMsg(modules.MetaGroup, "", constant.ModuleNameEdgeMesh, resource, model.QueryOperation, nil)
    58  	respMsg, err := s.send.SendSync(msg)
    59  	if err != nil {
    60  		return nil, fmt.Errorf("get service podlist from metaManager failed, err: %v", err)
    61  	}
    62  	var content []byte
    63  	switch respMsg.Content.(type) {
    64  	case []byte:
    65  		content = respMsg.GetContent().([]byte)
    66  	default:
    67  		content, err = json.Marshal(respMsg.Content)
    68  		if err != nil {
    69  			return nil, fmt.Errorf("marshal message to service podlist failed, err: %v", err)
    70  		}
    71  	}
    72  
    73  	if respMsg.GetOperation() == model.ResponseOperation {
    74  		return handleServicePodListFromMetaDB(content)
    75  	}
    76  	return handleServicePodListFromMetaManager(content)
    77  }
    78  
    79  func handleServicePodListFromMetaDB(content []byte) ([]v1.Pod, error) {
    80  	var lists []string
    81  	err := json.Unmarshal([]byte(content), &lists)
    82  	if err != nil {
    83  		return nil, fmt.Errorf("unmarshal message to Service list from db failed, err: %v", err)
    84  	}
    85  
    86  	if len(lists) != 1 {
    87  		return nil, fmt.Errorf("service length from meta db is %d", len(lists))
    88  	}
    89  
    90  	var ps []v1.Pod
    91  	err = json.Unmarshal([]byte(lists[0]), &ps)
    92  	if err != nil {
    93  		return nil, fmt.Errorf("unmarshal message to service podlist from db failed, err: %v", err)
    94  	}
    95  	return ps, nil
    96  }
    97  
    98  func handleServicePodListFromMetaManager(content []byte) ([]v1.Pod, error) {
    99  	var ps []v1.Pod
   100  	err := json.Unmarshal(content, &ps)
   101  	if err != nil {
   102  		return nil, fmt.Errorf("unmarshal message to service podlist failed, err: %v", err)
   103  	}
   104  	return ps, nil
   105  }
   106  
   107  func (s *services) Get(name string) (*v1.Service, error) {
   108  	resource := fmt.Sprintf("%s/%s/%s", s.namespace, constants.ResourceTypeService, name)
   109  	msg := message.BuildMsg(modules.MetaGroup, "", constant.ModuleNameEdgeMesh, resource, model.QueryOperation, nil)
   110  	respMsg, err := s.send.SendSync(msg)
   111  	if err != nil {
   112  		return nil, fmt.Errorf("get service from metaManager failed, err: %v", err)
   113  	}
   114  	var content []byte
   115  	switch respMsg.Content.(type) {
   116  	case []byte:
   117  		content = respMsg.GetContent().([]byte)
   118  	default:
   119  		content, err = json.Marshal(respMsg.Content)
   120  		if err != nil {
   121  			return nil, fmt.Errorf("marshal message to configmap failed, err: %v", err)
   122  		}
   123  	}
   124  
   125  	if respMsg.GetOperation() == model.ResponseOperation {
   126  		return handleServiceFromMetaDB(content)
   127  	}
   128  	return handleServiceFromMetaManager(content)
   129  }
   130  
   131  func handleServiceFromMetaDB(content []byte) (*v1.Service, error) {
   132  	var lists []string
   133  	err := json.Unmarshal([]byte(content), &lists)
   134  	if err != nil {
   135  		return nil, fmt.Errorf("unmarshal message to Service list from db failed, err: %v", err)
   136  	}
   137  
   138  	if len(lists) != 1 {
   139  		return nil, fmt.Errorf("service length from meta db is %d", len(lists))
   140  	}
   141  
   142  	var s v1.Service
   143  	err = json.Unmarshal([]byte(lists[0]), &s)
   144  	if err != nil {
   145  		return nil, fmt.Errorf("unmarshal message to Service from db failed, err: %v", err)
   146  	}
   147  	return &s, nil
   148  }
   149  
   150  func handleServiceFromMetaManager(content []byte) (*v1.Service, error) {
   151  	var s v1.Service
   152  	err := json.Unmarshal(content, &s)
   153  	if err != nil {
   154  		return nil, fmt.Errorf("unmarshal message to Service failed, err: %v", err)
   155  	}
   156  	return &s, nil
   157  }
   158  
   159  func (s *services) ListAll() ([]v1.Service, error) {
   160  	resource := fmt.Sprintf("%s/%s", s.namespace, constants.ResourceTypeService)
   161  	msg := message.BuildMsg(modules.MetaGroup, "", constant.ModuleNameEdgeMesh, resource, model.QueryOperation, nil)
   162  	respMsg, err := s.send.SendSync(msg)
   163  	if err != nil {
   164  		return nil, fmt.Errorf("get service list from metaManager failed, err: %v", err)
   165  	}
   166  	var content []byte
   167  	switch respMsg.Content.(type) {
   168  	case []byte:
   169  		content = respMsg.GetContent().([]byte)
   170  	default:
   171  		content, err = json.Marshal(respMsg.Content)
   172  		if err != nil {
   173  			return nil, fmt.Errorf("marshal message to service list failed, err: %v", err)
   174  		}
   175  	}
   176  
   177  	if respMsg.GetOperation() == model.ResponseOperation {
   178  		return handleServiceListFromMetaDB(content)
   179  	}
   180  	return handleServiceListFromMetaManager(content)
   181  }
   182  
   183  func handleServiceListFromMetaDB(content []byte) ([]v1.Service, error) {
   184  	var lists []string
   185  	err := json.Unmarshal([]byte(content), &lists)
   186  	if err != nil {
   187  		return nil, fmt.Errorf("unmarshal message to service list from edge db failed, err: %v", err)
   188  	}
   189  
   190  	var serviceList []v1.Service
   191  	for i := range lists {
   192  		var s v1.Service
   193  		err = json.Unmarshal([]byte(lists[i]), &s)
   194  		if err != nil {
   195  			return nil, fmt.Errorf("unmarshal message to service from edge db failed, err: %v", err)
   196  		}
   197  		serviceList = append(serviceList, s)
   198  	}
   199  	return serviceList, nil
   200  }
   201  
   202  func handleServiceListFromMetaManager(content []byte) ([]v1.Service, error) {
   203  	var serviceList []v1.Service
   204  	err := json.Unmarshal(content, &serviceList)
   205  	if err != nil {
   206  		return nil, fmt.Errorf("unmarshal message to service list failed, err: %v", err)
   207  	}
   208  	return serviceList, nil
   209  }