blob: 0538729cad4774282cd2738d7140ac5d11f11192 [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 (
apt "github.com/ServiceComb/service-center/server/core"
"github.com/ServiceComb/service-center/server/core/mux"
pb "github.com/ServiceComb/service-center/server/core/proto"
"github.com/ServiceComb/service-center/server/service/dependency"
ms "github.com/ServiceComb/service-center/server/service/microservice"
"github.com/ServiceComb/service-center/util"
"golang.org/x/net/context"
"strings"
)
func (s *ServiceController) CreateDependenciesForMircServices(ctx context.Context, in *pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
dependencyInfos := in.Dependencies
if dependencyInfos == nil {
return dependency.BadParamsResponse("Invalid request body."), nil
}
tenant := util.ParseTenantProject(ctx)
for _, dependencyInfo := range dependencyInfos {
consumerInfo := pb.TransferToMicroServiceKeys([]*pb.DependencyMircroService{dependencyInfo.Consumer}, tenant)[0]
providersInfo := pb.TransferToMicroServiceKeys(dependencyInfo.Providers, tenant)
consumerFlag := strings.Join([]string{consumerInfo.AppId, consumerInfo.ServiceName, consumerInfo.Version}, "/")
rsp := dependency.ParamsChecker(ctx, consumerInfo, providersInfo, tenant)
if rsp != nil {
util.LOGGER.Errorf(nil, "create dependency faild, conusmer %s: invalid params.%s", consumerFlag, rsp.Response.Message)
return rsp, nil
}
consumerId, err := ms.GetServiceId(ctx, consumerInfo)
util.LOGGER.Debugf("consumerId is %s", consumerId)
if err != nil {
util.LOGGER.Errorf(err, "create dependency faild, conusmer %s: get consumer failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
if len(consumerId) == 0 {
util.LOGGER.Errorf(nil, "create dependency faild, conusmer %s: consumer not exist.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, "Get consumer's serviceId is empty."),
}, nil
}
//更新服务的内容,把providers加入
err = dependency.UpdateServiceForAddDependency(ctx, consumerId, dependencyInfo.Providers, tenant)
if err != nil {
util.LOGGER.Errorf(err, "create dependency faild, conusmer %s: Update service failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
//建立依赖规则,用于维护依赖关系
lock, err := mux.Lock(mux.GLOBAL_LOCK)
if err != nil {
util.LOGGER.Errorf(err, "create dependency faild, conusmer %s: create lock failed.", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
err = dependency.CreateDependencyRule(ctx, consumerId, consumerInfo, providersInfo)
lock.Unlock()
if err != nil {
util.LOGGER.Errorf(err, "create dependency rule failed: consumer %s", consumerFlag)
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
//更新consumer作为provider的依赖关系
err = dependency.UpdateAsProviderDependency(ctx, consumerId, consumerInfo)
if err != nil {
util.LOGGER.Errorf(nil, "Dependency update,as provider,update it's consumer list failed. %s", err.Error())
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
//更新consumer作为consumer的依赖关系
err = dependency.UpdateAsConsumerDependency(ctx, consumerId, providersInfo, tenant)
if err != nil {
util.LOGGER.Errorf(nil, "Dependency update,as consumer,update it's provider list failed. %s", err.Error())
return &pb.CreateDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, 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 success"),
}, nil
}
func (s *ServiceController) 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(pb.Response_FAIL, err.Error()),
}, nil
}
providerId := in.ServiceId
tenant := util.ParseTenantProject(ctx)
if !ms.ServiceExist(ctx, tenant, providerId) {
util.LOGGER.Errorf(nil, "GetProviderDependencies failed, providerId is %s: service not exist.",
providerId)
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, "This provider does not exist."),
}, nil
}
keyProDependency := apt.GenerateProviderDependencyKey(tenant, providerId, "")
services, err := dependency.GetDependencies(ctx, keyProDependency, tenant)
if err != nil {
util.LOGGER.Errorf(err, "GetProviderDependencies failed, providerId is %s.", providerId)
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
Consumers: nil,
}, err
}
util.LOGGER.Infof("GetProviderDependencies successfully, providerId is %s.", providerId)
return &pb.GetProDependenciesResponse{
Response: pb.CreateResponse(pb.Response_SUCCESS, "Get all consumers successful."),
Consumers: services,
}, nil
}
func (s *ServiceController) 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(pb.Response_FAIL, err.Error()),
}, nil
}
consumerId := in.ServiceId
tenant := util.ParseTenantProject(ctx)
if !ms.ServiceExist(ctx, tenant, consumerId) {
util.LOGGER.Errorf(nil, "GetConsumerDependencies failed, consumerId is %s: service not exist.",
consumerId)
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, "This consumer does not exist."),
}, nil
}
keyConDependency := apt.GenerateConsumerDependencyKey(tenant, consumerId, "")
services, err := dependency.GetDependencies(ctx, keyConDependency, tenant)
if err != nil {
util.LOGGER.Errorf(err, "GetConsumerDependencies failed, consumerId is %s.", consumerId)
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(pb.Response_FAIL, err.Error()),
}, err
}
util.LOGGER.Infof("GetConsumerDependencies successfully, consumerId is %s.", consumerId)
return &pb.GetConDependenciesResponse{
Response: pb.CreateResponse(pb.Response_SUCCESS, "Get all providers successful."),
Providers: services,
}, nil
}