blob: 54df31810d57b2272a282f09432a17fbc83207c2 [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 datasource
import (
"github.com/apache/servicecomb-service-center/pkg/util"
"github.com/go-chassis/cari/discovery"
)
var GlobalServiceNames = make(map[string]struct{})
type GetInstanceCountByDomainResponse struct {
Err error
CountByDomain int64
}
func SetServiceDefaultValue(service *discovery.MicroService) {
if len(service.AppId) == 0 {
service.AppId = discovery.AppID
}
if len(service.Version) == 0 {
service.Version = discovery.VERSION
}
if len(service.Level) == 0 {
service.Level = "BACK"
}
if len(service.Status) == 0 {
service.Status = discovery.MS_UP
}
}
// SetStaticServices calculate the service/application num under a domainProject
func SetStaticServices(statistics *discovery.Statistics, svcKeys []*discovery.MicroServiceKey, svcIDs []string, withShared bool) map[string]string {
l := len(svcKeys)
app := make(map[string]struct{}, l)
svcWithNonVersion := make(map[string]struct{}, l)
svcIDToNonVerKey := make(map[string]string, l)
for index, svc := range svcKeys {
if !withShared && IsGlobal(svc) {
continue
}
if _, ok := app[svc.AppId]; !ok {
app[svc.AppId] = struct{}{}
}
svc.Version = ""
svcWithNonVersionKey := generateServiceKey(svc)
if _, ok := svcWithNonVersion[svcWithNonVersionKey]; !ok {
svcWithNonVersion[svcWithNonVersionKey] = struct{}{}
}
svcIDToNonVerKey[svcIDs[index]] = svcWithNonVersionKey
}
statistics.Services.Count = int64(len(svcWithNonVersion))
statistics.Apps.Count = int64(len(app))
return svcIDToNonVerKey
}
// SetStaticInstances calculate the instance/onlineService num under a domainProject
func SetStaticInstances(statistics *discovery.Statistics, svcIDToNonVerKey map[string]string, instServiceIDs []string) {
onlineServices := make(map[string]struct{}, len(instServiceIDs))
for _, sid := range instServiceIDs {
key, ok := svcIDToNonVerKey[sid]
if !ok {
continue
}
statistics.Instances.Count++
if _, ok := onlineServices[key]; !ok {
onlineServices[key] = struct{}{}
}
}
statistics.Services.OnlineCount = int64(len(onlineServices))
}
func generateServiceKey(key *discovery.MicroServiceKey) string {
return util.StringJoin([]string{
key.Environment,
key.AppId,
key.ServiceName,
key.Version,
}, "/")
}
func TransServiceToKey(domainProject string, service *discovery.MicroService) *discovery.MicroServiceKey {
return &discovery.MicroServiceKey{
Tenant: domainProject,
Environment: service.Environment,
AppId: service.AppId,
ServiceName: service.ServiceName,
Version: service.Version,
}
}
func RegisterGlobalService(serviceName string) {
GlobalServiceNames[serviceName] = struct{}{}
}
func IsGlobal(key *discovery.MicroServiceKey) bool {
if !IsDefaultDomainProject(key.Tenant) {
return false
}
if key.AppId != RegistryAppID {
return false
}
_, ok := GlobalServiceNames[key.ServiceName]
if !ok {
_, ok = GlobalServiceNames[key.Alias]
}
return ok
}
func RemoveGlobalServices(withShared bool, domainProject string,
services []*discovery.MicroService) []*discovery.MicroService {
if withShared || !IsDefaultDomainProject(domainProject) {
return services
}
for i := len(services) - 1; i >= 0; i-- {
if !IsGlobal(discovery.MicroServiceToKey(domainProject, services[i])) {
continue
}
if i == len(services)-1 {
services = services[0:i]
continue
}
services = append(services[0:i], services[i+1:]...)
}
return services
}
func IsDefaultDomainProject(domainProject string) bool {
return domainProject == RegistryDomainProject
}