Skip to content

Commit

Permalink
find dependency bug fix (#133)
Browse files Browse the repository at this point in the history
* find api dependency rule bug fix

* find api dependency rule bug fix

* quota apply bug fix

* http client bug fix
delete service bug fix
dependency optimize

* add upload schemas api

* upload schemas,add info in services.yaml

* delete service bug fix

* find dependency bug fix
  • Loading branch information
aseTo2016 authored and little-cui committed Oct 21, 2017
1 parent e17d3e0 commit 5becdea
Show file tree
Hide file tree
Showing 2 changed files with 288 additions and 8 deletions.
159 changes: 159 additions & 0 deletions server/service/service_dependency_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,165 @@ var _ = Describe("ServiceController", func() {
})
})

Context("dep find", func() {
var providerIdDep1, providerIdDep2, providerIdDep3, consumerIdDep string
It("find接口, 建立依赖关系", func() {
resp, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "serviceName_consumer1",
AppId: "appId_consumer1",
Version: "2.0.0",
Level: "FRONT",
Schemas: []string{
"com.huawei.test",
},
Status: "UP",
},
})
Expect(err).To(BeNil())
Expect(resp.GetResponse().Code).To(Equal(pb.Response_SUCCESS))
consumerIdDep = resp.ServiceId

resp, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "serviceName_provider1",
AppId: "appId_provider1",
Version: "2.0.0",
Level: "FRONT",
Schemas: []string{
"com.huawei.test",
},
Status: "UP",
},
})
Expect(err).To(BeNil())
Expect(resp.GetResponse().Code).To(Equal(pb.Response_SUCCESS))
providerIdDep1 = resp.ServiceId

resp, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "serviceName_provider2",
AppId: "appId_provider2",
Version: "2.0.0",
Level: "FRONT",
Schemas: []string{
"com.huawei.test",
},
Status: "UP",
},
})
Expect(err).To(BeNil())
Expect(resp.GetResponse().Code).To(Equal(pb.Response_SUCCESS))
providerIdDep2 = resp.ServiceId

respFind, err := insResource.Find(getContext(), &pb.FindInstancesRequest{
ConsumerServiceId: consumerIdDep,
AppId: "appId_provider1",
ServiceName: "serviceName_provider1",
VersionRule: "latest",
})
Expect(err).To(BeNil())
Expect(respFind.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respFind, err = insResource.Find(getContext(), &pb.FindInstancesRequest{
ConsumerServiceId: consumerIdDep,
AppId: "appId_provider2",
ServiceName: "serviceName_provider2",
VersionRule: "latest",
})
Expect(err).To(BeNil())
Expect(respFind.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respPro, err := serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
ServiceId: consumerIdDep,
})
Expect(err).To(BeNil())
Expect(respPro.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

var flag bool
if len(respPro.Providers) == 2 {
if (respPro.Providers[0].ServiceId == providerIdDep1 || respPro.Providers[0].ServiceId == providerIdDep2) &&
(respPro.Providers[1].ServiceId == providerIdDep1 || respPro.Providers[1].ServiceId == providerIdDep2) {
flag = true
}
}
Expect(flag).To(Equal(true))

})
It("find ,find 不同version,相同servicename和appId", func() {
respCreate, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
Service: &pb.MicroService{
ServiceName: "serviceName_provider2",
AppId: "appId_provider2",
Version: "1.0",
Level: "FRONT",
Schemas: []string{
"com.huawei.test",
},
Status: "UP",
},
})
Expect(err).To(BeNil())
Expect(respCreate.GetResponse().Code).To(Equal(pb.Response_SUCCESS))
providerIdDep3 = respCreate.ServiceId

respFind, err := insResource.Find(getContext(), &pb.FindInstancesRequest{
ConsumerServiceId: consumerIdDep,
AppId: "appId_provider2",
ServiceName: "serviceName_provider2",
VersionRule: "1.0",
})
Expect(err).To(BeNil())
Expect(respFind.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respPro, err := serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
ServiceId: consumerIdDep,
})
Expect(err).To(BeNil())
Expect(respPro.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

var flag bool
if len(respPro.Providers) == 2 {
if (respPro.Providers[0].ServiceId == providerIdDep1 || respPro.Providers[0].ServiceId == providerIdDep3) &&
(respPro.Providers[1].ServiceId == providerIdDep1 || respPro.Providers[1].ServiceId == providerIdDep3) {
flag = true
}
}
Expect(flag).To(Equal(true))
} )

It("clean", func() {
respDelete, err := serviceResource.Delete(getContext(), &pb.DeleteServiceRequest{
ServiceId: consumerIdDep,
Force: true,
})
Expect(err).To(BeNil())
Expect(respDelete.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respDelete, err = serviceResource.Delete(getContext(), &pb.DeleteServiceRequest{
ServiceId: providerIdDep1,
Force: true,
})
Expect(err).To(BeNil())
Expect(respDelete.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respDelete, err = serviceResource.Delete(getContext(), &pb.DeleteServiceRequest{
ServiceId: providerIdDep2,
Force: true,
})
Expect(err).To(BeNil())
Expect(respDelete.GetResponse().Code).To(Equal(pb.Response_SUCCESS))

respDelete, err = serviceResource.Delete(getContext(), &pb.DeleteServiceRequest{
ServiceId: providerIdDep3,
Force: true,
})
Expect(err).To(BeNil())
Expect(respDelete.GetResponse().Code).To(Equal(pb.Response_SUCCESS))
})
})


It("删除微服务,作为provider,有consumer", func() {
var consumerId, providerId string
resp, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
Expand Down
137 changes: 129 additions & 8 deletions server/service/util/dependency.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,134 @@ func CreateDependencyRule(ctx context.Context, dep *Dependency) error {
return nil
}

func CreateDependencyRuleForFind(ctx context.Context, tenant string, provider *pb.MicroServiceKey, consumer *pb.MicroServiceKey) error {
//更新consumer的providers的值,consumer的版本是确定的
consumerFlag := strings.Join([]string{consumer.AppId, consumer.ServiceName, consumer.Version}, "/")
conKey := apt.GenerateConsumerDependencyRuleKey(tenant, consumer)

oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
if err != nil {
util.Logger().Errorf(err, "get dependency rule failed, consumer %s: get consumer depedency rule failed.", consumerFlag)
return err
}
opts := []registry.PluginOp{}
if oldProviderRule := isNeedUpdate(oldProviderRules.Dependency, provider); oldProviderRule != nil {
opt, err := deleteConsumerDepOfProviderRule(ctx, tenant, oldProviderRule, consumer)
if err != nil {
util.Logger().Errorf(err, "marshal consumerDepRules failed for delete consumer rule from provider rule's dep.%s", consumerFlag)
return err
}
util.Logger().Infof("delete provider dep, %v, delete consumer %v", oldProviderRule, consumer)
opts = append(opts, opt)

opt, err = updateDepRuleUtil(conKey, oldProviderRules, provider)
if err != nil {
util.Logger().Errorf(err, "update provider rule into consumer's dep rule failed, %s", consumerFlag)
return err
}
util.Logger().Infof("update consumer dep %s, %v --> %v",consumerFlag, oldProviderRule, provider)
opts = append(opts, opt)
} else {
if !isExist(oldProviderRules.Dependency, provider) {
opt, err := addDepRuleUtil(conKey, oldProviderRules, provider)
if err != nil {
util.Logger().Errorf(err, "add provider rule into consumer's dep rule failed, %s", consumerFlag)
return err
}
util.Logger().Infof("add consumer dep, %s, add %v", consumerFlag, provider)
opts = append(opts, opt)
}

proKey := apt.GenerateProviderDependencyRuleKey(tenant, provider)
consumerDepRules, err := TransferToMicroServiceDependency(ctx, proKey)
if err != nil {
util.Logger().Errorf(err, "get consumer rule of provider failed,%v", provider)
return err
}
if !isExist(consumerDepRules.Dependency, consumer) {
opt, err := addDepRuleUtil(proKey, consumerDepRules, consumer)
if err != nil {
util.Logger().Errorf(err, "add consumer rule into provider's dep rule failed,%s",consumerFlag)
return err
}
util.Logger().Infof("add provider dep, %s, add %v", consumerFlag, provider)
opts = append(opts, opt)
}
}

if len(opts) != 0 {
_, err = registry.GetRegisterCenter().Txn(ctx, opts)
if err != nil {
util.Logger().Errorf(err, "update dep rule for consumer failed, %s", consumerFlag)
return err
}
}
return nil
}

func isExist(services []*pb.MicroServiceKey, service *pb.MicroServiceKey) bool{
for _, tmp := range services {
if equalServiceDependency(tmp, service) {
return true
}
}
return false
}

func deleteConsumerDepOfProviderRule(ctx context.Context, tenant string, providerRule *pb.MicroServiceKey, deleteConsumer *pb.MicroServiceKey) (registry.PluginOp, error){
proKey := apt.GenerateProviderDependencyRuleKey(tenant, providerRule)
consumerDepRules, err := TransferToMicroServiceDependency(ctx, proKey)
if err != nil {
return registry.PluginOp{}, err
}
return deleteDepRuleUtil(proKey, consumerDepRules, deleteConsumer)
}

func deleteDepRuleUtil(key string, deps *pb.MicroServiceDependency, deleteDepRule *pb.MicroServiceKey)(registry.PluginOp, error){
for key, consumerDepRule := range deps.Dependency {
if equalServiceDependency(consumerDepRule, deleteDepRule) {
deps.Dependency = append(deps.Dependency[:key], deps.Dependency[key+1:]...)
}
}
data, err := json.Marshal(deps)
if err != nil {
return registry.PluginOp{}, err
}
return registry.OpPut(registry.WithStrKey(key), registry.WithValue(data)), nil
}

func addDepRuleUtil(key string, deps *pb.MicroServiceDependency, updateDepRule *pb.MicroServiceKey) (registry.PluginOp, error){
deps.Dependency = append(deps.Dependency, updateDepRule)
data, err := json.Marshal(deps)
if err != nil {
util.Logger().Errorf(err, "marshal consumerDepRules failed for delete consumer rule from provider rule's dep.")
return registry.PluginOp{}, err
}
return registry.OpPut(registry.WithStrKey(key), registry.WithValue(data)), nil
}

func updateDepRuleUtil(key string, deps *pb.MicroServiceDependency, updateDepRule *pb.MicroServiceKey) (registry.PluginOp, error){
for _, serviceRule := range deps.Dependency {
if serviceRule.ServiceName == updateDepRule.ServiceName && updateDepRule.AppId == serviceRule.AppId && updateDepRule.Version != serviceRule.Version{
serviceRule.Version = updateDepRule.Version
}
}
data, err := json.Marshal(deps)
if err != nil {
return registry.PluginOp{}, err
}
return registry.OpPut(registry.WithStrKey(key), registry.WithValue(data)), nil
}

func isNeedUpdate(services []*pb.MicroServiceKey, service *pb.MicroServiceKey) *pb.MicroServiceKey{
for _, tmp := range services {
if tmp.ServiceName == service.ServiceName && tmp.AppId == service.AppId && tmp.Version != service.Version {
return tmp
}
}
return nil
}

func containServiceDependency(services []*pb.MicroServiceKey, service *pb.MicroServiceKey) (bool, error) {
if services == nil || service == nil {
return false, errors.New("Invalid params input.")
Expand Down Expand Up @@ -466,18 +594,11 @@ func AddServiceVersionRule(ctx context.Context, tenant string, provider *pb.Micr
return err
}

dep := new(Dependency)
dep.Tenant = tenant
dep.Consumer = consumer
dep.ProvidersRule = []*pb.MicroServiceKey{provider}
dep.ConsumerId = consumerId

lock, err := mux.Lock(mux.GLOBAL_LOCK)
if err != nil {
return err
}

err = CreateDependencyRule(ctx, dep)
err = CreateDependencyRuleForFind(ctx, tenant, provider, consumer)
lock.Unlock()
return err
}
Expand Down

0 comments on commit 5becdea

Please sign in to comment.