You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ro...@apache.org on 2022/01/03 12:46:04 UTC
[servicecomb-service-center] branch master updated: [feat] add dep sync func when db is etcd
This is an automated email from the ASF dual-hosted git repository.
robotljw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git
The following commit(s) were added to refs/heads/master by this push:
new 080cdf0 [feat] add dep sync func when db is etcd
new 160431c Merge pull request #1200 from robotLJW/master
080cdf0 is described below
commit 080cdf03a4359b513bde30f078ee6180cb4ba4d8
Author: robotljw <79...@qq.com>
AuthorDate: Fri Dec 31 17:35:18 2021 +0800
[feat] add dep sync func when db is etcd
---
datasource/common.go | 5 +-
datasource/etcd/dep.go | 14 ++++-
datasource/etcd/dep_test.go | 134 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 149 insertions(+), 4 deletions(-)
diff --git a/datasource/common.go b/datasource/common.go
index f783594..d391864 100644
--- a/datasource/common.go
+++ b/datasource/common.go
@@ -32,8 +32,9 @@ const (
RegistryAppID = "default"
Provider = "p"
- ResourceAccount = "account"
- ResourceRole = "role"
+ ResourceAccount = "account"
+ ResourceRole = "role"
+ ResourceDependency = "dependency"
)
// WrapErrResponse is temp func here to wait finish to refact the discosvc pkg
diff --git a/datasource/etcd/dep.go b/datasource/etcd/dep.go
index ba3c837..a9faa86 100644
--- a/datasource/etcd/dep.go
+++ b/datasource/etcd/dep.go
@@ -23,6 +23,10 @@ import (
"errors"
"fmt"
+ pb "github.com/go-chassis/cari/discovery"
+ "github.com/go-chassis/cari/sync"
+ "github.com/little-cui/etcdadpt"
+
"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/etcd/event"
"github.com/apache/servicecomb-service-center/datasource/etcd/path"
@@ -30,8 +34,6 @@ import (
serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util"
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/pkg/util"
- pb "github.com/go-chassis/cari/discovery"
- "github.com/little-cui/etcdadpt"
)
type DepManager struct {
@@ -162,6 +164,14 @@ func (dm *DepManager) AddOrUpdateDependencies(ctx context.Context, dependencyInf
opts = append(opts, etcdadpt.OpPut(etcdadpt.WithStrKey(key), etcdadpt.WithValue(data)))
}
+ if datasource.EnableSync {
+ taskOpt, err := GenTaskOpts("", "", sync.UpdateAction, datasource.ResourceDependency, dependencyInfos)
+ if err != nil {
+ log.Error("", err)
+ return pb.CreateResponse(pb.ErrInternal, err.Error()), err
+ }
+ opts = append(opts, taskOpt)
+ }
err := etcdadpt.Txn(ctx, opts)
if err != nil {
log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t, %v",
diff --git a/datasource/etcd/dep_test.go b/datasource/etcd/dep_test.go
new file mode 100644
index 0000000..7dc8c72
--- /dev/null
+++ b/datasource/etcd/dep_test.go
@@ -0,0 +1,134 @@
+/*
+ * 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 etcd_test
+
+import (
+ "context"
+ "testing"
+
+ pb "github.com/go-chassis/cari/discovery"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/apache/servicecomb-service-center/datasource"
+ "github.com/apache/servicecomb-service-center/eventbase/model"
+ "github.com/apache/servicecomb-service-center/eventbase/service/task"
+ "github.com/apache/servicecomb-service-center/pkg/util"
+ _ "github.com/apache/servicecomb-service-center/test"
+)
+
+func depGetContext() context.Context {
+ return util.WithNoCache(util.SetDomainProject(context.Background(), "sync-dep", "sync-dep"))
+}
+
+func TestSyncAddOrUpdateDependencies(t *testing.T) {
+ datasource.EnableSync = true
+ var (
+ consumerId string
+ providerId string
+ )
+
+ t.Run("register service", func(t *testing.T) {
+ t.Run("create a consumer service should pass", func(t *testing.T) {
+ resp, err := datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "sync_dep_group",
+ ServiceName: "sync_dep_consumer",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
+ consumerId = resp.ServiceId
+ })
+ t.Run("create a provider service should pass", func(t *testing.T) {
+ resp, err := datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "sync_dep_group",
+ ServiceName: "sync_dep_provider",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
+ providerId = resp.ServiceId
+ })
+ })
+
+ t.Run("AddOrUpdateDependencies", func(t *testing.T) {
+ t.Run("add dependencies should pass", func(t *testing.T) {
+ consumer := &pb.MicroServiceKey{
+ ServiceName: "sync_dep_consumer",
+ AppId: "sync_dep_group",
+ Version: "1.0.0",
+ }
+ resp, err := datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId: "sync_dep_group",
+ ServiceName: "sync_dep_provider",
+ },
+ },
+ },
+ }, false)
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
+ listTaskReq := model.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceDependency,
+ }
+ tasks, err := task.List(context.Background(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(context.Background(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(context.Background(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+ })
+
+ t.Run("unregister consumer and provider", func(t *testing.T) {
+ t.Run("unregister consumer and provider should pass", func(t *testing.T) {
+ respDelP, err := datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{
+ ServiceId: consumerId, Force: true,
+ })
+ assert.NotNil(t, respDelP)
+ assert.NoError(t, err)
+ assert.Equal(t, pb.ResponseSuccess, respDelP.Response.GetCode())
+
+ respDelP, err = datasource.GetMetadataManager().UnregisterService(depGetContext(), &pb.DeleteServiceRequest{
+ ServiceId: providerId, Force: true,
+ })
+ assert.NotNil(t, respDelP)
+ assert.NoError(t, err)
+ assert.Equal(t, pb.ResponseSuccess, respDelP.Response.GetCode())
+
+ })
+ })
+ datasource.EnableSync = false
+}