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 }