blob: ec2105e9222c41e0f739d0e110017260f2ed7ec9 [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 service
import (
"github.com/ServiceComb/service-center/pkg/util"
apt "github.com/ServiceComb/service-center/server/core"
pb "github.com/ServiceComb/service-center/server/core/proto"
scerr "github.com/ServiceComb/service-center/server/error"
"github.com/ServiceComb/service-center/server/mux"
serviceUtil "github.com/ServiceComb/service-center/server/service/util"
"golang.org/x/net/context"
)
func (s *MicroServiceService) CreateDependenciesForMicroServices(ctx context.Context, in *pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
dependencyInfos := in.Dependencies
if len(dependencyInfos) == 0 {
return serviceUtil.BadParamsResponse("Invalid request body."), nil
}
domainProject := util.ParseDomainProject(ctx)
for _, dependencyInfo := range dependencyInfos {
consumerFlag := util.StringJoin([]string{dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName, dependencyInfo.Consumer.Version}, "/")
dep := new(serviceUtil.Dependency)
dep.DomainProject = domainProject
util.Logger().Infof("start create dependency, data info %v", dependencyInfo)
consumerInfo := pb.DependenciesToKeys([]*pb.DependencyKey{dependencyInfo.Consumer}, domainProject)[0]
providersInfo := pb.DependenciesToKeys(dependencyInfo.Providers, domainProject)
dep.Consumer = consumerInfo
dep.ProvidersRule = providersInfo
rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
if rsp != nil {
util.Logger().Errorf(nil, "create dependency failed, conusmer %s: invalid params.%s", consumerFlag, rsp.Response.Message)
return rsp, nil
}
consumerId, err := serviceUtil.GetServiceId(ctx, consumerInfo)
util.Logger().Debugf("consumerId is %s", consumerId)
if err != nil {
util.Logger().Errorf(err, "create dependency failed, consumer %s: get consumer failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
if len(consumerId) == 0 {
util.Logger().Errorf(nil, "create dependency failed, consumer %s: consumer not exist.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Get consumer's serviceId is empty."),
}, nil
}
if len(dependencyInfo.Providers) == 0 {
return serviceUtil.BadParamsResponse("Provider is invalid"), nil
}
dep.ConsumerId = consumerId
//更新服务的内容,把providers加入
err = serviceUtil.UpdateServiceForAddDependency(ctx, consumerId, dependencyInfo.Providers, domainProject)
if err != nil {
util.Logger().Errorf(err, "create dependency failed, consumer %s: Update service failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
//建立依赖规则,用于维护依赖关系
lock, err := mux.Lock(mux.GLOBAL_LOCK)
if err != nil {
util.Logger().Errorf(err, "create dependency failed, consumer %s: create lock failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
err = serviceUtil.CreateDependencyRule(ctx, dep)
lock.Unlock()
if err != nil {
util.Logger().Errorf(err, "create dependency rule failed: consumer %s", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
util.Logger().Infof("Create dependency success: consumer %s, %s from remote %s", consumerFlag, consumerId, util.GetIPFromContext(ctx))
}
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_SUCCESS, "Create dependency successfully."),
}, nil
}
func (s *MicroServiceService) GetProviderDependencies(ctx context.Context, in *pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
err := apt.Validate(in)
if err != nil {
util.Logger().Errorf(err, "GetProviderDependencies failed for validating parameters failed.")
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
}, nil
}
domainProject := util.ParseDomainProject(ctx)
providerServiceId := in.ServiceId
provider, err := serviceUtil.GetService(ctx, domainProject, providerServiceId)
if err != nil {
util.Logger().Errorf(err, "GetProviderDependencies failed, %s.", providerServiceId)
return nil, err
}
if provider == nil {
util.Logger().Errorf(err, "GetProviderDependencies failed for provider does not exist, %s.", providerServiceId)
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Provider does not exist"),
}, nil
}
dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, providerServiceId, provider)
services, err := dr.GetDependencyConsumers()
if err != nil {
util.Logger().Errorf(err, "GetProviderDependencies failed.")
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
util.Logger().Debugf("GetProviderDependencies successfully, providerId is %s.", in.ServiceId)
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(pb.Response_SUCCESS, "Get all consumers successful."),
Consumers: services,
}, nil
}
func (s *MicroServiceService) GetConsumerDependencies(ctx context.Context, in *pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error) {
err := apt.Validate(in)
if err != nil {
util.Logger().Errorf(err, "GetConsumerDependencies failed for validating parameters failed.")
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInvalidParams, err.Error()),
}, nil
}
consumerId := in.ServiceId
domainProject := util.ParseDomainProject(ctx)
consumer, err := serviceUtil.GetService(ctx, domainProject, consumerId)
if err != nil {
util.Logger().Errorf(err, "GetConsumerDependencies failed for get consumer failed.")
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
if consumer == nil {
util.Logger().Errorf(err, "GetConsumerDependencies failed for consumer does not exist, %s.", consumerId)
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrServiceNotExists, "Consumer does not exist"),
}, nil
}
dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject, consumerId, consumer)
services, err := dr.GetDependencyProviders()
if err != nil {
util.Logger().Errorf(err, "GetConsumerDependencies failed for get providers failed.")
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(scerr.ErrInternal, err.Error()),
}, err
}
util.Logger().Debugf("GetConsumerDependencies successfully, consumerId is %s.", consumerId)
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(pb.Response_SUCCESS, "Get all providers successfully."),
Providers: services,
}, nil
}