blob: 41ffdf3163e645d15bf487d283153ce371978d5f [file] [log] [blame]
/*
* 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 response
import (
"github.com/go-chassis/cari/discovery"
"github.com/apache/servicecomb-service-center/pkg/util"
)
func init() {
RegisterFilter("/v4/:project/registry/microservices", MicroserviceListFilter)
RegisterFilter("/v4/:project/registry/microservices/:providerId/consumers", ProvidersListFilter)
RegisterFilter("/v4/:project/registry/microservices/:consumerId/providers", ConsumersListFilter)
// control panel apis
RegisterFilter("/v4/:project/govern/microservices", MicroServiceInfoListFilter)
RegisterFilter("/v4/:project/govern/apps", AppIDListFilter)
}
func MicroserviceListFilter(obj interface{}, labels []map[string]string) interface{} {
servicesResponse, ok := obj.(*discovery.GetServicesResponse)
if !ok {
return obj
}
servicesResponse.Services = filterMicroservices(servicesResponse.Services, labels)
return servicesResponse
}
func matchOne(service *discovery.MicroService, labels map[string]string) bool {
if env, ok := labels["environment"]; ok && service.Environment != env {
return false
}
if app, ok := labels["appId"]; ok && service.AppId != app {
return false
}
if name, ok := labels["serviceName"]; ok && !util.WildcardMatch(name, service.ServiceName) {
return false
}
return true
}
func filterMicroservices(sources []*discovery.MicroService, labelsList []map[string]string) []*discovery.MicroService {
var services []*discovery.MicroService
for _, service := range sources {
for _, labels := range labelsList {
if !matchOne(service, labels) {
continue
}
services = append(services, service)
break
}
}
return services
}
func ProvidersListFilter(obj interface{}, labels []map[string]string) interface{} {
servicesResponse, ok := obj.(*discovery.GetConDependenciesResponse)
if !ok {
return obj
}
servicesResponse.Providers = filterMicroservices(servicesResponse.Providers, labels)
return servicesResponse
}
func ConsumersListFilter(obj interface{}, labels []map[string]string) interface{} {
servicesResponse, ok := obj.(*discovery.GetProDependenciesResponse)
if !ok {
return obj
}
servicesResponse.Consumers = filterMicroservices(servicesResponse.Consumers, labels)
return servicesResponse
}
func MicroServiceInfoListFilter(obj interface{}, labelsList []map[string]string) interface{} {
servicesResponse, ok := obj.(*discovery.GetServicesInfoResponse)
if !ok {
return obj
}
var services []*discovery.ServiceDetail
for _, service := range servicesResponse.AllServicesDetail {
for _, labels := range labelsList {
if !matchOne(service.MicroService, labels) {
continue
}
services = append(services, service)
break
}
}
servicesResponse.AllServicesDetail = services
return servicesResponse
}
func AppIDListFilter(obj interface{}, labelsList []map[string]string) interface{} {
appsResponse, ok := obj.(*discovery.GetAppsResponse)
if !ok {
return obj
}
var apps []string
for _, appID := range appsResponse.AppIds {
for _, labels := range labelsList {
if app, ok := labels["appId"]; ok && appID != app {
continue
}
apps = append(apps, appID)
break
}
}
appsResponse.AppIds = apps
return appsResponse
}