diff options
Diffstat (limited to 'kube2msb/src/kube2msb/msb_client.go')
-rw-r--r-- | kube2msb/src/kube2msb/msb_client.go | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/kube2msb/src/kube2msb/msb_client.go b/kube2msb/src/kube2msb/msb_client.go new file mode 100644 index 0000000..2c1b402 --- /dev/null +++ b/kube2msb/src/kube2msb/msb_client.go @@ -0,0 +1,129 @@ +/* +Copyright 2017 ZTE, Inc. and others. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "net/http" +) + +const ( + urlPrefix = "/api/microservices/v1/services" +) + +type Client interface { + Register(string) + DeRegister(string) +} + +type MSBAgent struct { + Client + url string +} + +func newMSBAgent(s string) (*MSBAgent, error) { + healthCheckURL := s + urlPrefix + "/health" + resp, err := http.Get(healthCheckURL) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("MSB agent:%s is not available", s) + } + + return &MSBAgent{url: s}, nil +} + +func (client *MSBAgent) Register(serviceInfo string) { + var ( + sas = []*ServiceAnnotation{} + ) + err := json.Unmarshal([]byte(serviceInfo), &sas) + if err != nil { + log.Printf("Failed to Unmarshal serviceInfo to ServiceAnnotation:%v", err) + return + } + + for _, sa := range sas { + su := ServiceAnnotation2ServiceUnit(sa) + body, _ := json.Marshal(su) + postURL := client.url + urlPrefix + + resp, err := http.Post(postURL, "application/json", bytes.NewReader(body)) + if err != nil { + log.Printf("Failed to do a request:%v", err) + return + } + + log.Printf("Http request to register service:%s returned code:%d", su.Name, resp.StatusCode) + } +} + +func (client *MSBAgent) DeRegister(serviceInfo string) { + var ( + sas = []*ServiceAnnotation{} + ) + + err := json.Unmarshal([]byte(serviceInfo), &sas) + if err != nil { + log.Printf("Failed to Unmarshal serviceInfo to ServiceAnnotation:%v", err) + return + } + + for _, sa := range sas { + var deleteURL string + if sa.Version == "" { + deleteURL = client.url + urlPrefix + "/" + sa.ServiceName + "/version/" + "null" + "/nodes/" + sa.IP + "/" + sa.Port + } else { + deleteURL = client.url + urlPrefix + "/" + sa.ServiceName + "/version/" + sa.Version + "/nodes/" + sa.IP + "/" + sa.Port + } + log.Printf("deleteURL:%s", deleteURL) + req, err := http.NewRequest("DELETE", deleteURL, nil) + if err != nil { + log.Printf("(deleteURL:%s) failed to NewRequest:%v", deleteURL, err) + return + } + + c := &http.Client{} + resp, err := c.Do(req) + if err != nil { + log.Printf("(deleteURL:%s) failed to do a request:%v", deleteURL, err) + return + } + + log.Printf("Http request to deregister service:%s returned code:%d", sa.ServiceName, resp.StatusCode) + } +} + +func ServiceAnnotation2ServiceUnit(sa *ServiceAnnotation) *ServiceUnit { + if sa == nil { + return nil + } + + return &ServiceUnit{ + Name: sa.ServiceName, + Version: sa.Version, + URL: sa.URL, + Protocol: sa.Protocol, + LBPolicy: sa.LBPolicy, + VisualRange: sa.VisualRange, + Instances: []InstanceUnit{{ServiceIP: sa.IP, ServicePort: sa.Port}}, + } +} |