[feat] add SyncAll func when db is mongo
diff --git a/datasource/etcd/sync_test.go b/datasource/etcd/sync_test.go
index 09ed470..718f092 100644
--- a/datasource/etcd/sync_test.go
+++ b/datasource/etcd/sync_test.go
@@ -337,8 +337,10 @@
assert.Equal(t, 3, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
- err = task.Delete(syncAllContext(), tasks...)
+ tasks, err = task.List(syncAllContext(), &listServiceTaskReq)
assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
listKVTaskReq := model.ListTaskRequest{
Domain: "sync-all",
Project: "sync-all",
@@ -350,8 +352,13 @@
assert.Equal(t, 4, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listKVTaskReq)
+ assert.NoError(t, err)
+ // three schema and one tag
+ assert.Equal(t, 0, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
+
listAccountTaskReq := model.ListTaskRequest{
Domain: "",
Project: "",
@@ -362,8 +369,10 @@
assert.Equal(t, 1, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
- err = task.Delete(syncAllContext(), tasks...)
+ tasks, err = task.List(syncAllContext(), &listAccountTaskReq)
assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
listRoleTaskReq := model.ListTaskRequest{
Domain: "",
Project: "",
@@ -374,8 +383,10 @@
assert.Equal(t, 1, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
- err = task.Delete(syncAllContext(), tasks...)
+ tasks, err = task.List(syncAllContext(), &listRoleTaskReq)
assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
listDepTaskReq := model.ListTaskRequest{
Domain: "sync-all",
Project: "sync-all",
@@ -386,11 +397,17 @@
assert.Equal(t, 1, len(tasks))
err = task.Delete(syncAllContext(), tasks...)
assert.NoError(t, err)
- err = task.Delete(syncAllContext(), tasks...)
+ tasks, err = task.List(syncAllContext(), &listDepTaskReq)
assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
exist, err := etcdadpt.Exist(syncAllContext(), etcd.SyncAllKey)
assert.Equal(t, true, exist)
assert.Nil(t, err)
+
+ isDelete, err := etcdadpt.Delete(syncAllContext(), etcd.SyncAllKey)
+ assert.Equal(t, true, isDelete)
+ assert.Nil(t, err)
})
t.Run("delete all resources should pass", func(t *testing.T) {
diff --git a/datasource/mongo/db.go b/datasource/mongo/db.go
index 4597dfa..e64e1eb 100644
--- a/datasource/mongo/db.go
+++ b/datasource/mongo/db.go
@@ -33,6 +33,7 @@
ensureDep()
ensureAccount()
ensureAccountLock()
+ ensureSyncLock()
}
func ensureService() {
@@ -93,3 +94,8 @@
dmongo.EnsureCollection(model.CollectionAccountLock, nil, []mongo.IndexModel{
util.BuildIndexDoc(model.ColumnAccountLockKey)})
}
+
+func ensureSyncLock() {
+ dmongo.EnsureCollection(model.CollectionSync, nil, []mongo.IndexModel{
+ util.BuildIndexDoc(model.ColumnKey)})
+}
diff --git a/datasource/mongo/model/types.go b/datasource/mongo/model/types.go
index 0a34020..cd42798 100644
--- a/datasource/mongo/model/types.go
+++ b/datasource/mongo/model/types.go
@@ -33,6 +33,7 @@
CollectionRole = "role"
CollectionDomain = "domain"
CollectionProject = "project"
+ CollectionSync = "sync"
)
const (
@@ -75,6 +76,7 @@
ColumnAccountLockKey = "key"
ColumnAccountLockStatus = "status"
ColumnAccountLockReleaseAt = "release_at"
+ ColumnKey = "key"
)
type Service struct {
diff --git a/datasource/mongo/sync.go b/datasource/mongo/sync.go
index 7fcaaa1..92a615f 100644
--- a/datasource/mongo/sync.go
+++ b/datasource/mongo/sync.go
@@ -19,8 +19,25 @@
import (
"context"
+ "fmt"
+ "strings"
+ dmongo "github.com/go-chassis/cari/db/mongo"
+ "github.com/go-chassis/cari/discovery"
+ rbacmodel "github.com/go-chassis/cari/rbac"
+ "go.mongodb.org/mongo-driver/bson"
+ "go.mongodb.org/mongo-driver/mongo"
+
+ "github.com/apache/servicecomb-service-center/datasource"
+ "github.com/apache/servicecomb-service-center/datasource/mongo/model"
+ "github.com/apache/servicecomb-service-center/datasource/mongo/sync"
"github.com/apache/servicecomb-service-center/pkg/log"
+ putil "github.com/apache/servicecomb-service-center/pkg/util"
+ "github.com/apache/servicecomb-service-center/server/config"
+)
+
+const (
+ SyncAllKey = "sync-all"
)
type SyncManager struct {
@@ -28,7 +45,171 @@
// SyncAll will list all services,accounts,roles,schemas,tags,deps and use tasks to store
func (s *SyncManager) SyncAll(ctx context.Context) error {
- // TODO mongo should implement it
- log.Info("Mongo does not implement this method")
+ enable := config.GetBool("sync.enableOnStart", false)
+ if !enable {
+ return nil
+ }
+ exist, err := syncAllKeyExist(ctx)
+ if err != nil {
+ return err
+ }
+ if exist {
+ log.Info(fmt.Sprintf("%s key already exists, do not need to do tasks", SyncAllKey))
+ return datasource.ErrSyncAllKeyExists
+ }
+ // TODO use mongo distributed lock
+ err = syncAllAccounts(ctx)
+ if err != nil {
+ return err
+ }
+ err = syncAllRoles(ctx)
+ if err != nil {
+ return err
+ }
+ err = syncAllServices(ctx)
+ if err != nil {
+ return err
+ }
+ err = syncAllDependencies(ctx)
+ if err != nil {
+ return err
+ }
+ return insertSyncAllKey(ctx)
+}
+
+func syncAllKeyExist(ctx context.Context) (bool, error) {
+ count, err := dmongo.GetClient().GetDB().Collection(model.CollectionSync).CountDocuments(ctx, bson.M{"key": SyncAllKey})
+ if err != nil {
+ return false, err
+ }
+ if count > 0 {
+ return true, nil
+ }
+ return false, nil
+}
+
+func syncAllAccounts(ctx context.Context) error {
+ cursor, err := dmongo.GetClient().GetDB().Collection(model.CollectionAccount).Find(ctx, bson.M{})
+ if err != nil {
+ return err
+ }
+ defer func(cursor *mongo.Cursor, ctx context.Context) {
+ err := cursor.Close(ctx)
+ if err != nil {
+ log.Error("fail to close mongo cursor", err)
+ }
+ }(cursor, ctx)
+ for cursor.Next(ctx) {
+ var account rbacmodel.Account
+ err = cursor.Decode(&account)
+ if err != nil {
+ log.Error("failed to decode account", err)
+ return err
+ }
+ err = sync.DoCreateOpts(ctx, datasource.ResourceAccount, &account)
+ if err != nil {
+ log.Error("failed to create account task", err)
+ return err
+ }
+ }
return nil
}
+
+func syncAllRoles(ctx context.Context) error {
+ cursor, err := dmongo.GetClient().GetDB().Collection(model.CollectionRole).Find(ctx, bson.M{})
+ if err != nil {
+ return err
+ }
+ defer func(cursor *mongo.Cursor, ctx context.Context) {
+ err := cursor.Close(ctx)
+ if err != nil {
+ log.Error("fail to close mongo cursor", err)
+ }
+ }(cursor, ctx)
+ for cursor.Next(ctx) {
+ var role rbacmodel.Role
+ err = cursor.Decode(&role)
+ if err != nil {
+ log.Error("failed to decode role", err)
+ return err
+ }
+ err = sync.DoCreateOpts(ctx, datasource.ResourceRole, &role)
+ if err != nil {
+ log.Error("failed to create role task", err)
+ return err
+ }
+ }
+ return nil
+}
+
+func syncAllServices(ctx context.Context) error {
+ cursor, err := dmongo.GetClient().GetDB().Collection(model.CollectionService).Find(ctx, bson.M{})
+ if err != nil {
+ return err
+ }
+ defer func(cursor *mongo.Cursor, ctx context.Context) {
+ err := cursor.Close(ctx)
+ if err != nil {
+ log.Error("fail to close mongo cursor", err)
+ }
+ }(cursor, ctx)
+ for cursor.Next(ctx) {
+ var tmp model.Service
+ err := cursor.Decode(&tmp)
+ if err != nil {
+ return err
+ }
+ request := &discovery.CreateServiceRequest{
+ Service: tmp.Service,
+ Tags: tmp.Tags,
+ }
+ putil.SetDomain(ctx, tmp.Domain)
+ putil.SetProject(ctx, tmp.Project)
+ err = sync.DoCreateOpts(ctx, datasource.ResourceService, request)
+ if err != nil {
+ log.Error("failed to create service task", err)
+ return err
+ }
+ }
+ return nil
+}
+
+func syncAllDependencies(ctx context.Context) error {
+ cursor, err := dmongo.GetClient().GetDB().Collection(model.CollectionDep).Find(ctx, bson.M{})
+ if err != nil {
+ return err
+ }
+ depInfosMap := make(map[string][]*discovery.ConsumerDependency)
+ defer func(cursor *mongo.Cursor, ctx context.Context) {
+ err := cursor.Close(ctx)
+ if err != nil {
+ log.Error("fail to close mongo cursor", err)
+ }
+ }(cursor, ctx)
+ for cursor.Next(ctx) {
+ var tmp model.ConsumerDep
+ err := cursor.Decode(&tmp)
+ if err != nil {
+ return err
+ }
+ key := tmp.Domain + "/" + tmp.Project
+ depInfosMap[key] = append(depInfosMap[key], tmp.ConsumerDep)
+ }
+ for key, dependencies := range depInfosMap {
+ splitKey := strings.Split(key, "/")
+ domain, project := splitKey[0], splitKey[1]
+ putil.SetDomain(ctx, domain)
+ putil.SetProject(ctx, project)
+ err := sync.DoUpdateOpts(ctx, datasource.ResourceDependency, dependencies)
+ if err != nil {
+ log.Error("fail to create dep tasks", err)
+ return err
+ }
+ }
+ return nil
+}
+
+func insertSyncAllKey(ctx context.Context) error {
+ _, err := dmongo.GetClient().GetDB().Collection(model.CollectionSync).InsertOne(ctx, bson.M{"key": SyncAllKey})
+ return err
+}
diff --git a/datasource/mongo/sync_test.go b/datasource/mongo/sync_test.go
new file mode 100644
index 0000000..816a2bf
--- /dev/null
+++ b/datasource/mongo/sync_test.go
@@ -0,0 +1,345 @@
+/*
+ * 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 mongo_test
+
+import (
+ "context"
+ "strconv"
+ "testing"
+
+ dmongo "github.com/go-chassis/cari/db/mongo"
+ pb "github.com/go-chassis/cari/discovery"
+ crbac "github.com/go-chassis/cari/rbac"
+ "github.com/go-chassis/cari/sync"
+ "github.com/go-chassis/go-archaius"
+ "github.com/stretchr/testify/assert"
+ "go.mongodb.org/mongo-driver/bson"
+
+ "github.com/apache/servicecomb-service-center/datasource"
+ "github.com/apache/servicecomb-service-center/datasource/mongo"
+ "github.com/apache/servicecomb-service-center/datasource/mongo/model"
+ "github.com/apache/servicecomb-service-center/datasource/rbac"
+ emodel "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"
+)
+
+func syncAllContext() context.Context {
+ ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "sync-all", "sync-all"))
+ return util.WithNoCache(util.SetContext(ctx, util.CtxEnableSync, "1"))
+}
+
+func TestSyncAll(t *testing.T) {
+ t.Run("enableOnStart is false will not do sync", func(t *testing.T) {
+ _ = archaius.Set("sync.enableOnStart", false)
+ err := datasource.GetSyncManager().SyncAll(syncAllContext())
+ assert.Nil(t, err)
+ })
+
+ t.Run("enableOnStart is true and syncAllKey exists will not do sync", func(t *testing.T) {
+ _ = archaius.Set("sync.enableOnStart", true)
+ _, err := dmongo.GetClient().GetDB().Collection(model.CollectionSync).InsertOne(syncAllContext(),
+ bson.M{"key": mongo.SyncAllKey})
+ assert.Nil(t, err)
+ err = datasource.GetSyncManager().SyncAll(syncAllContext())
+ assert.Equal(t, datasource.ErrSyncAllKeyExists, err)
+ _, err = dmongo.GetClient().GetDB().Collection(model.CollectionSync).DeleteOne(syncAllContext(),
+ bson.M{"key": mongo.SyncAllKey})
+ assert.Nil(t, err)
+ })
+
+ t.Run("enableOnStart is true and syncAllKey not exists will do sync", func(t *testing.T) {
+ _ = archaius.Set("sync.enableOnStart", true)
+ var accountName string
+ var roleName string
+ var consumerID string
+ var providerID string
+ t.Run("create a account and delete the task should pass", func(t *testing.T) {
+ a1 := crbac.Account{
+ ID: "sync-create-11111-sync-all",
+ Name: "sync-create-account1-sync-all",
+ Password: "tnuocca-tset",
+ Roles: []string{"admin"},
+ TokenExpirationTime: "2020-12-30",
+ CurrentPassword: "tnuocca-tset1",
+ }
+ err := rbac.Instance().CreateAccount(syncAllContext(), &a1)
+ assert.NoError(t, err)
+ accountName = a1.Name
+ r, err := rbac.Instance().GetAccount(syncAllContext(), a1.Name)
+ assert.NoError(t, err)
+ assert.Equal(t, a1, *r)
+ listTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceAccount,
+ }
+ tasks, err := task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+ t.Run("create a role and delete the task should pass", func(t *testing.T) {
+ r1 := crbac.Role{
+ ID: "create-11111-sync-all",
+ Name: "create-role-sync-all",
+ Perms: nil,
+ }
+ err := rbac.Instance().CreateRole(syncAllContext(), &r1)
+ assert.NoError(t, err)
+ r, err := rbac.Instance().GetRole(syncAllContext(), "create-role-sync-all")
+ assert.NoError(t, err)
+ assert.Equal(t, r1, *r)
+ dt, _ := strconv.Atoi(r.CreateTime)
+ assert.Less(t, 0, dt)
+ assert.Equal(t, r.CreateTime, r.UpdateTime)
+ roleName = r1.Name
+ listTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceRole,
+ }
+ tasks, err := task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ })
+ t.Run("create a consumer service will create a service task should pass", func(t *testing.T) {
+ resp, err := datasource.GetMetadataManager().RegisterService(syncAllContext(), &pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "sync_dep_group_sync_all",
+ ServiceName: "sync_dep_consumer_sync_all",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ consumerID = resp.ServiceId
+ listTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceService,
+ Action: sync.CreateAction,
+ Status: sync.PendingStatus,
+ }
+ tasks, err := task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+ t.Run("create one provider service will create one service task should pass", func(t *testing.T) {
+ resp, err := datasource.GetMetadataManager().RegisterService(syncAllContext(), &pb.CreateServiceRequest{
+ Service: &pb.MicroService{
+ AppId: "sync_dep_group_sync_all",
+ ServiceName: "sync_dep_provider_sync_all",
+ Version: "1.0.0",
+ Level: "FRONT",
+ Status: pb.MS_UP,
+ },
+ })
+ assert.NotNil(t, resp)
+ assert.NoError(t, err)
+ providerID = resp.ServiceId
+
+ listTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceService,
+ Action: sync.CreateAction,
+ Status: sync.PendingStatus,
+ }
+ tasks, err := task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+ t.Run("create dependencies for microServices will create a dependency task should pass", func(t *testing.T) {
+ consumer := &pb.MicroServiceKey{
+ ServiceName: "sync_dep_consumer_sync_all",
+ AppId: "sync_dep_group_sync_all",
+ Version: "1.0.0",
+ }
+ err := datasource.GetDependencyManager().PutDependencies(syncAllContext(), []*pb.ConsumerDependency{
+ {
+ Consumer: consumer,
+ Providers: []*pb.MicroServiceKey{
+ {
+ AppId: "sync_dep_group_sync_all",
+ ServiceName: "sync_dep_provider_sync_all",
+ },
+ },
+ },
+ }, false)
+ assert.NoError(t, err)
+
+ listTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceDependency,
+ Action: sync.UpdateAction,
+ Status: sync.PendingStatus,
+ }
+ tasks, err := task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+
+ t.Run("do sync will create task should pass", func(t *testing.T) {
+ err := datasource.GetSyncManager().SyncAll(syncAllContext())
+ assert.Nil(t, err)
+ listServiceTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceService,
+ }
+ tasks, err := task.List(syncAllContext(), &listServiceTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 2, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listServiceTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
+ listAccountTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceAccount,
+ }
+ tasks, err = task.List(syncAllContext(), &listAccountTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listAccountTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
+ listRoleTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceRole,
+ }
+ tasks, err = task.List(syncAllContext(), &listRoleTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listRoleTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
+ listDepTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceDependency,
+ }
+ tasks, err = task.List(syncAllContext(), &listDepTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ count, err := dmongo.GetClient().GetDB().Collection(model.CollectionSync).CountDocuments(syncAllContext(),
+ bson.M{"key": mongo.SyncAllKey})
+ assert.Nil(t, err)
+ assert.Equal(t, int64(1), count)
+ _, err = dmongo.GetClient().GetDB().Collection(model.CollectionSync).DeleteOne(syncAllContext(),
+ bson.M{"key": mongo.SyncAllKey})
+ assert.Nil(t, err)
+ })
+
+ t.Run("delete all resources should pass", func(t *testing.T) {
+ _, err := rbac.Instance().DeleteAccount(syncAllContext(), []string{accountName})
+ assert.NoError(t, err)
+ listAccountTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceAccount,
+ }
+ tasks, err := task.List(syncAllContext(), &listAccountTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listAccountTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
+ _, err = rbac.Instance().DeleteRole(syncAllContext(), roleName)
+ assert.NoError(t, err)
+ listRoleTaskReq := emodel.ListTaskRequest{
+ Domain: "",
+ Project: "",
+ ResourceType: datasource.ResourceRole,
+ }
+ tasks, err = task.List(syncAllContext(), &listRoleTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 1, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listRoleTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+
+ err = datasource.GetMetadataManager().UnregisterService(syncAllContext(), &pb.DeleteServiceRequest{
+ ServiceId: consumerID, Force: true,
+ })
+ assert.NoError(t, err)
+
+ err = datasource.GetMetadataManager().UnregisterService(syncAllContext(), &pb.DeleteServiceRequest{
+ ServiceId: providerID, Force: true,
+ })
+ assert.NoError(t, err)
+
+ listSeviceTaskReq := emodel.ListTaskRequest{
+ Domain: "sync-all",
+ Project: "sync-all",
+ ResourceType: datasource.ResourceService,
+ }
+ tasks, err = task.List(syncAllContext(), &listSeviceTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 2, len(tasks))
+ err = task.Delete(syncAllContext(), tasks...)
+ assert.NoError(t, err)
+ tasks, err = task.List(syncAllContext(), &listSeviceTaskReq)
+ assert.NoError(t, err)
+ assert.Equal(t, 0, len(tasks))
+ })
+ })
+
+}