server/resource/govern/govern_resource.go (103 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 govern
import (
"net/http"
"net/url"
"strings"
"github.com/apache/servicecomb-service-center/pkg/rest"
"github.com/apache/servicecomb-service-center/pkg/util"
governsvc "github.com/apache/servicecomb-service-center/server/service/govern"
pb "github.com/go-chassis/cari/discovery"
"github.com/go-chassis/foundation/stringutil"
)
// Service 治理相关接口服务
type Resource struct {
//
}
// URLPatterns 路由
func (res *Resource) URLPatterns() []rest.Route {
return []rest.Route{
{Method: http.MethodGet, Path: "/v4/:project/govern/microservices/:serviceId", Func: res.GetService},
{Method: http.MethodGet, Path: "/v4/:project/govern/relations", Func: res.Draw},
{Method: http.MethodGet, Path: "/v4/:project/govern/microservices", Func: res.ListService},
{Method: http.MethodGet, Path: "/v4/:project/govern/apps", Func: res.ListApp},
{Method: http.MethodGet, Path: "/v4/:project/govern/statistics", Func: res.GetOverview},
}
}
// Draw 获取依赖连接图详细依赖关系
func (res *Resource) Draw(w http.ResponseWriter, r *http.Request) {
graph, err := governsvc.Draw(r.Context(), util.StringTRUE(r.URL.Query().Get("withShared")))
if err != nil {
rest.WriteServiceError(w, err)
return
}
rest.WriteResponse(w, r, nil, graph)
}
// GetService 查询服务详细信息
func (res *Resource) GetService(w http.ResponseWriter, r *http.Request) {
serviceID := r.URL.Query().Get(":serviceId")
request := &pb.GetServiceRequest{
ServiceId: serviceID,
}
ctx := r.Context()
serviceDetail, err := governsvc.GetServiceDetail(ctx, request)
if err != nil {
rest.WriteServiceError(w, err)
return
}
rest.WriteResponse(w, r, nil, &pb.GetServiceDetailResponse{Service: serviceDetail})
}
func (res *Resource) ListService(w http.ResponseWriter, r *http.Request) {
request := &pb.GetServicesInfoRequest{}
ctx := r.Context()
query := r.URL.Query()
optsStr := query.Get("options")
request.Options = strings.Split(optsStr, ",")
request.AppId = query.Get("appId")
request.ServiceName = query.Get("serviceName")
request.Environment = query.Get("env")
request.WithShared = util.StringTRUE(query.Get("withShared"))
request.Properties = ParseProperties(query, "property")
countOnly := query.Get("countOnly")
if countOnly != "0" && countOnly != "1" && strings.TrimSpace(countOnly) != "" {
rest.WriteError(w, pb.ErrInvalidParams, "parameter countOnly must be 1 or 0")
return
}
if countOnly == "1" {
request.CountOnly = true
}
resp, err := governsvc.ListServiceDetail(ctx, request)
if err != nil {
rest.WriteServiceError(w, err)
return
}
rest.WriteResponse(w, r, nil, resp)
}
func ParseProperties(query url.Values, key string) map[string]string {
propertyList := query[key]
properties := make(map[string]string, len(propertyList))
for _, kv := range propertyList {
if !strings.Contains(kv, ":") {
properties[kv] = ""
continue
}
k, v := stringutil.SplitToTwo(kv, ":")
properties[k] = v
}
return properties
}
func (res *Resource) GetOverview(w http.ResponseWriter, r *http.Request) {
st, err := governsvc.GetOverview(r.Context(), &pb.GetServicesRequest{})
if err != nil {
rest.WriteServiceError(w, err)
return
}
rest.WriteResponse(w, r, nil, &pb.GetServicesInfoStatisticsResponse{Statistics: st})
}
func (res *Resource) ListApp(w http.ResponseWriter, r *http.Request) {
request := &pb.GetAppsRequest{}
ctx := r.Context()
query := r.URL.Query()
request.Environment = query.Get("env")
request.WithShared = util.StringTRUE(query.Get("withShared"))
resp, err := governsvc.ListApp(ctx, request)
if err != nil {
rest.WriteServiceError(w, err)
return
}
rest.WriteResponse(w, r, nil, resp)
}