blob: ae0f0f660862eebe0e9f64bc18ade3c3d283903d [file] [log] [blame]
//Copyright 2017 Huawei Technologies Co., Ltd
//
//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 rest
import (
"encoding/json"
pb "github.com/ServiceComb/service-center/server/core/proto"
"github.com/ServiceComb/service-center/util"
"github.com/ServiceComb/service-center/util/rest"
"io/ioutil"
"net/http"
"strings"
)
type MicroServiceService struct {
//
}
func (this *MicroServiceService) URLPatterns() []rest.Route {
return []rest.Route{
{rest.HTTP_METHOD_GET, "/registry/v3/existence", this.GetExistence},
{rest.HTTP_METHOD_GET, "/registry/v3/microservices", this.GetServices},
{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:serviceId", this.GetServiceOne},
{rest.HTTP_METHOD_POST, "/registry/v3/microservices", this.Register},
{rest.HTTP_METHOD_PUT, "/registry/v3/microservices/:serviceId/properties", this.Update},
{rest.HTTP_METHOD_DELETE, "/registry/v3/microservices/:serviceId", this.Unregister},
{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:serviceId/schemas/:schemaId", this.GetSchemas},
{rest.HTTP_METHOD_PUT, "/registry/v3/microservices/:serviceId/schemas/:schemaId", this.ModifySchemas},
{rest.HTTP_METHOD_DELETE, "/registry/v3/microservices/:serviceId/schemas/:schemaId", this.DeleteSchemas},
{rest.HTTP_METHOD_PUT, "/registry/v3/dependencies", this.CreateDependenciesForMicroServices},
{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:consumerId/providers", this.GetConProDependencies},
{rest.HTTP_METHOD_GET, "/registry/v3/microservices/:providerId/consumers", this.GetProConDependencies},
{rest.HTTP_METHOD_DELETE, "/registry/v3/microservices", this.UnregisterServices},
}
}
func (this *MicroServiceService) GetSchemas(w http.ResponseWriter, r *http.Request) {
request := &pb.GetSchemaRequest{
ServiceId: r.URL.Query().Get(":serviceId"),
SchemaId: r.URL.Query().Get(":schemaId"),
}
resp, err := ServiceAPI.GetSchemaInfo(r.Context(), request)
if len(resp.Schema) != 0 {
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
return
}
WriteTextResponse(resp.GetResponse(), err, "", w)
}
func (this *MicroServiceService) ModifySchemas(w http.ResponseWriter, r *http.Request) {
message, err := ioutil.ReadAll(r.Body)
if err != nil {
util.LOGGER.Error("body err", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
request := &pb.ModifySchemaRequest{
ServiceId: r.URL.Query().Get(":serviceId"),
SchemaId: r.URL.Query().Get(":schemaId"),
}
err = json.Unmarshal(message, request)
if err != nil {
util.LOGGER.Error("Unmarshal error", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
resp, err := ServiceAPI.ModifySchema(r.Context(), request)
WriteTextResponse(resp.GetResponse(), err, "", w)
}
func (this *MicroServiceService) DeleteSchemas(w http.ResponseWriter, r *http.Request) {
request := &pb.DeleteSchemaRequest{
ServiceId: r.URL.Query().Get(":serviceId"),
SchemaId: r.URL.Query().Get(":schemaId"),
}
resp, err := ServiceAPI.DeleteSchema(r.Context(), request)
WriteTextResponse(resp.GetResponse(), err, "", w)
}
func (this *MicroServiceService) Register(w http.ResponseWriter, r *http.Request) {
message, err := ioutil.ReadAll(r.Body)
if err != nil {
util.LOGGER.Error("body err", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
var request pb.CreateServiceRequest
err = json.Unmarshal(message, &request)
if err != nil {
util.LOGGER.Error("Unmarshal error", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
resp, err := ServiceAPI.Create(r.Context(), &request)
if err != nil {
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
if resp.GetResponse().Code != pb.Response_SUCCESS {
WriteText(http.StatusBadRequest, resp.GetResponse().Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) Update(w http.ResponseWriter, r *http.Request) {
message, err := ioutil.ReadAll(r.Body)
if err != nil {
util.LOGGER.Error("body err", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
request := &pb.UpdateServicePropsRequest{
ServiceId: r.URL.Query().Get(":serviceId"),
}
err = json.Unmarshal(message, request)
if err != nil {
util.LOGGER.Error("Unmarshal error", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
resp, err := ServiceAPI.UpdateProperties(r.Context(), request)
WriteTextResponse(resp.GetResponse(), err, "", w)
}
func (this *MicroServiceService) Unregister(w http.ResponseWriter, r *http.Request) {
force := r.URL.Query().Get("force")
serviceId := r.URL.Query().Get(":serviceId")
util.LOGGER.Warnf(nil, "Service %s unregists, force is %s.", serviceId, force)
if force != "0" && force != "1" && strings.TrimSpace(force) != "" {
WriteText(http.StatusBadRequest, "parameter force must be 1 or 0", w)
return
}
request := &pb.DeleteServiceRequest{
ServiceId: serviceId,
Force: force == "1",
}
resp, err := ServiceAPI.Delete(r.Context(), request)
WriteTextResponse(resp.GetResponse(), err, "", w)
}
func (this *MicroServiceService) GetServices(w http.ResponseWriter, r *http.Request) {
request := &pb.GetServicesRequest{}
util.LOGGER.Debugf("tenant is %s", r.Context().Value("tenant").(string))
resp, err := ServiceAPI.GetServices(r.Context(), request)
if err != nil {
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
if resp.GetResponse().Code != pb.Response_SUCCESS {
WriteText(http.StatusBadRequest, resp.GetResponse().Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) GetExistence(w http.ResponseWriter, r *http.Request) {
request := &pb.GetExistenceRequest{
Type: r.URL.Query().Get("type"),
AppId: r.URL.Query().Get("appId"),
ServiceName: r.URL.Query().Get("serviceName"),
Version: r.URL.Query().Get("version"),
ServiceId: r.URL.Query().Get("serviceId"),
SchemaId: r.URL.Query().Get("schemaId"),
}
resp, err := ServiceAPI.Exist(r.Context(), request)
if err != nil {
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
if resp.GetResponse().Code != pb.Response_SUCCESS {
WriteText(http.StatusBadRequest, resp.GetResponse().Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) GetServiceOne(w http.ResponseWriter, r *http.Request) {
request := &pb.GetServiceRequest{
ServiceId: r.URL.Query().Get(":serviceId"),
}
resp, err := ServiceAPI.GetOne(r.Context(), request)
if err != nil {
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
if resp.GetResponse().Code != pb.Response_SUCCESS {
WriteText(http.StatusBadRequest, resp.GetResponse().Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) CreateDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
requestBody, err := ioutil.ReadAll(r.Body)
if err != nil {
util.LOGGER.Error("body err", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
request := &pb.CreateDependenciesRequest{}
err = json.Unmarshal(requestBody, request)
if err != nil {
util.LOGGER.Error("Unmarshal error", err)
WriteText(http.StatusInternalServerError, "Unmarshal error", w)
return
}
//fmt.Println("request is ", request)
rsp, err := ServiceAPI.CreateDependenciesForMircServices(r.Context(), request)
//fmt.Println("rsp is ", rsp)
//请求错误
if err != nil {
util.LOGGER.Errorf(err, "create dependency failed for service internal reason.")
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
//服务内部错误
if rsp.Response.Code == pb.Response_FAIL {
util.LOGGER.Errorf(nil, "create dependency failed for request invalid. %s", rsp.Response.Message)
WriteText(http.StatusBadRequest, rsp.Response.Message, w)
return
}
WriteText(http.StatusOK, "add dependency success.", w)
}
func (this *MicroServiceService) GetConProDependencies(w http.ResponseWriter, r *http.Request) {
request := &pb.GetDependenciesRequest{
ServiceId: r.URL.Query().Get(":consumerId"),
}
resp, err := ServiceAPI.GetConsumerDependencies(r.Context(), request)
if err != nil {
util.LOGGER.Error("get Dependency failed.", err)
WriteText(http.StatusInternalServerError, "get Dependency failed", w)
return
}
//服务请求错误
if resp.Response.Code == pb.Response_FAIL {
util.LOGGER.Errorf(nil, resp.Response.Message)
WriteText(http.StatusBadRequest, resp.Response.Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) GetProConDependencies(w http.ResponseWriter, r *http.Request) {
request := &pb.GetDependenciesRequest{
ServiceId: r.URL.Query().Get(":providerId"),
}
resp, err := ServiceAPI.GetProviderDependencies(r.Context(), request)
if err != nil {
util.LOGGER.Error("get Dependency failed.", err)
WriteText(http.StatusInternalServerError, "get Dependency failed", w)
return
}
//服务请求错误
if resp.Response.Code == pb.Response_FAIL {
util.LOGGER.Errorf(nil, resp.Response.Message)
WriteText(http.StatusBadRequest, resp.Response.Message, w)
return
}
resp.Response = nil
WriteJsonObject(http.StatusOK, resp, w)
}
func (this *MicroServiceService) UnregisterServices(w http.ResponseWriter, r *http.Request) {
request_body,err := ioutil.ReadAll(r.Body)
if err != nil{
util.LOGGER.Error("body ,err",err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
request := &pb.DelServicesRequest{}
err = json.Unmarshal(request_body, request)
if err != nil {
util.LOGGER.Error("unmarshal ,err ", err)
WriteText(http.StatusBadRequest, err.Error(), w)
return
}
resp, err := ServiceAPI.DeleteServices(r.Context(), request)
if resp.Response.Code == pb.Response_SUCCESS {
WriteText(http.StatusOK, "", w)
return
}
if resp.Services == nil || len(resp.Services) == 0 {
WriteText(http.StatusBadRequest, resp.Response.Message, w)
return
}
resp.Response = nil
objJson, err := json.Marshal(resp)
if err != nil {
WriteText(http.StatusInternalServerError, err.Error(), w)
return
}
WriteJson(http.StatusBadRequest, objJson, w)
return
}