SCB-2176 Fix: POST tags should be covered (#828)

* SCB-2176 Fix: POST tags should be covered

* SCB-2176 Fix: UT failures
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index ed9981a..b7e70a5 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -1638,38 +1638,7 @@
 		}, nil
 	}
 
-	addTags := request.Tags
-	res := quota.NewApplyQuotaResource(quota.TagQuotaType, domainProject, request.ServiceId, int64(len(addTags)))
-	rst := quota.Apply(ctx, res)
-	errQuota := rst.Err
-	if errQuota != nil {
-		log.Errorf(errQuota, "add service[%s]'s tags %v failed, operator: %s", request.ServiceId, addTags, remoteIP)
-		response := &pb.AddServiceTagsResponse{
-			Response: pb.CreateResponseWithSCErr(errQuota),
-		}
-		if errQuota.InternalError() {
-			return response, errQuota
-		}
-		return response, nil
-	}
-
-	dataTags, err := serviceUtil.GetTagsUtils(ctx, domainProject, request.ServiceId)
-	if err != nil {
-		log.Errorf(err, "add service[%s]'s tags %v failed, get existed tag failed, operator: %s",
-			request.ServiceId, addTags, remoteIP)
-		return &pb.AddServiceTagsResponse{
-			Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
-		}, err
-	}
-	for key, value := range dataTags {
-		if _, ok := addTags[key]; ok {
-			continue
-		}
-		addTags[key] = value
-	}
-	dataTags = addTags
-
-	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, request.ServiceId, dataTags)
+	checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject, request.ServiceId, request.Tags)
 	if checkErr != nil {
 		log.Errorf(checkErr, "add service[%s]'s tags %v failed, operator: %s", request.ServiceId, request.Tags, remoteIP)
 		resp := &pb.AddServiceTagsResponse{
diff --git a/datasource/etcd/ms_test.go b/datasource/etcd/ms_test.go
index 9c3e059..8d8c7a6 100644
--- a/datasource/etcd/ms_test.go
+++ b/datasource/etcd/ms_test.go
@@ -3568,7 +3568,6 @@
 func TestTags_Add(t *testing.T) {
 	var (
 		serviceId1 string
-		serviceId2 string
 	)
 
 	// create service
@@ -3586,20 +3585,6 @@
 		assert.NoError(t, err)
 		assert.NotEqual(t, "", resp.ServiceId)
 		serviceId1 = resp.ServiceId
-
-		svc2 := &pb.MicroService{
-			AppId:       "create_tag_group_ms",
-			ServiceName: "create_tag_service_ms",
-			Version:     "1.0.1",
-			Level:       "FRONT",
-			Status:      pb.MS_UP,
-		}
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
-			Service: svc2,
-		})
-		assert.NoError(t, err)
-		assert.NotNil(t, "", resp.ServiceId)
-		serviceId2 = resp.ServiceId
 	})
 
 	t.Run("the request is invalid", func(t *testing.T) {
@@ -3629,30 +3614,6 @@
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
 	})
-
-	t.Run("tag's quota exceeded", func(t *testing.T) {
-		log.Info("insufficient tag quota")
-		size := quota.DefaultTagQuota / 2
-		tags := make(map[string]string, size)
-		for i := 0; i < size; i++ {
-			s := "tag" + strconv.Itoa(i)
-			tags[s] = s
-		}
-		resp, err := datasource.Instance().AddTags(getContext(), &pb.AddServiceTagsRequest{
-			ServiceId: serviceId2,
-			Tags:      tags,
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
-		tags["out"] = "range"
-		resp, _ = datasource.Instance().AddTags(getContext(), &pb.AddServiceTagsRequest{
-			ServiceId: serviceId2,
-			Tags:      tags,
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ErrNotEnoughQuota, resp.Response.GetCode())
-	})
 }
 
 func TestTags_Get(t *testing.T) {
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 16eb4ab..7152e78 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -483,48 +483,20 @@
 }
 
 func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddServiceTagsRequest) (*discovery.AddServiceTagsResponse, error) {
-	remoteIP := util.GetIPFromContext(ctx)
-	service, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
-	if err != nil {
-		if errors.Is(err, datasource.ErrNoData) {
-			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
-			return &discovery.AddServiceTagsResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil
-		}
-		log.Error(fmt.Sprintf("failed to add tags for service %s for get service failed", request.ServiceId), err)
+	err := UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), bson.M{"$set": bson.M{ColumnTag: request.Tags}})
+	if err == nil {
 		return &discovery.AddServiceTagsResponse{
-			Response: discovery.CreateResponse(discovery.ErrInternal, "Failed to check service exist"),
+			Response: discovery.CreateResponse(discovery.ResponseSuccess, "Add service tags successfully."),
 		}, nil
 	}
-	tags := request.Tags
-	res := quota.NewApplyQuotaResource(quota.TagQuotaType, util.ParseDomainProject(ctx), request.ServiceId, int64(len(tags)))
-	rst := quota.Apply(ctx, res)
-	errQuota := rst.Err
-	if errQuota != nil {
-		log.Error(fmt.Sprintf("add service[%s]'s tags %v failed, operator: %s", request.ServiceId, tags, remoteIP), errQuota)
-		response := &discovery.AddServiceTagsResponse{
-			Response: discovery.CreateResponseWithSCErr(errQuota),
-		}
-		if errQuota.InternalError() {
-			return response, errQuota
-		}
-		return response, nil
-	}
-	dataTags := service.Tags
-	for key, value := range dataTags {
-		if _, ok := tags[key]; ok {
-			continue
-		}
-		tags[key] = value
-	}
-	err = UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), bson.M{"$set": bson.M{ColumnTag: tags}})
-	if err != nil {
-		log.Error(fmt.Sprintf("update service %s tags failed.", request.ServiceId), err)
+	log.Error(fmt.Sprintf("update service %s tags failed.", request.ServiceId), err)
+	if err == client.ErrNoDocuments {
 		return &discovery.AddServiceTagsResponse{
-			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
+			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, err.Error()),
 		}, nil
 	}
 	return &discovery.AddServiceTagsResponse{
-		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Add service tags successfully."),
+		Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 	}, nil
 }
 
@@ -2955,9 +2927,9 @@
 	return res, nil
 }
 
-func formatRevision(consumerServiceId string, instances []*discovery.MicroServiceInstance) (string, error) {
+func formatRevision(consumerServiceID string, instances []*discovery.MicroServiceInstance) (string, error) {
 	if instances == nil {
-		return fmt.Sprintf("%x", sha1.Sum(util.StringToBytesWithNoCopy(consumerServiceId))), nil
+		return fmt.Sprintf("%x", sha1.Sum(util.StringToBytesWithNoCopy(consumerServiceID))), nil
 	}
 	copyInstance := make([]*discovery.MicroServiceInstance, len(instances))
 	copy(copyInstance, instances)
@@ -2967,6 +2939,6 @@
 		log.Error("fail to marshal instance json", err)
 		return "", err
 	}
-	s := fmt.Sprintf("%s.%x", consumerServiceId, sha1.Sum(data))
+	s := fmt.Sprintf("%s.%x", consumerServiceID, sha1.Sum(data))
 	return fmt.Sprintf("%x", sha1.Sum(util.StringToBytesWithNoCopy(s))), nil
 }
diff --git a/datasource/mongo/ms_test.go b/datasource/mongo/ms_test.go
index c9b05fb..b296c7d 100644
--- a/datasource/mongo/ms_test.go
+++ b/datasource/mongo/ms_test.go
@@ -608,7 +608,6 @@
 func TestTags_Add(t *testing.T) {
 	var (
 		serviceId1 string
-		serviceId2 string
 	)
 
 	// create service
@@ -626,20 +625,6 @@
 		assert.NoError(t, err)
 		assert.NotEqual(t, "", resp.ServiceId)
 		serviceId1 = resp.ServiceId
-
-		svc2 := &pb.MicroService{
-			AppId:       "create_tag_group_ms",
-			ServiceName: "create_tag_service_ms",
-			Version:     "1.0.1",
-			Level:       "FRONT",
-			Status:      pb.MS_UP,
-		}
-		resp, err = datasource.Instance().RegisterService(getContext(), &pb.CreateServiceRequest{
-			Service: svc2,
-		})
-		assert.NoError(t, err)
-		assert.NotNil(t, "", resp.ServiceId)
-		serviceId2 = resp.ServiceId
 	})
 
 	t.Run("the request is invalid", func(t *testing.T) {
@@ -667,29 +652,6 @@
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
 	})
-
-	t.Run("tag's quota exceeded", func(t *testing.T) {
-		size := quota.DefaultTagQuota / 2
-		tags := make(map[string]string, size)
-		for i := 0; i < size; i++ {
-			s := "tag" + strconv.Itoa(i)
-			tags[s] = s
-		}
-		resp, err := datasource.Instance().AddTags(getContext(), &pb.AddServiceTagsRequest{
-			ServiceId: serviceId2,
-			Tags:      tags,
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
-		tags["out"] = "range"
-		resp, _ = datasource.Instance().AddTags(getContext(), &pb.AddServiceTagsRequest{
-			ServiceId: serviceId2,
-			Tags:      tags,
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ErrNotEnoughQuota, resp.Response.GetCode())
-	})
 }
 
 func TestTags_Get(t *testing.T) {
diff --git a/server/plugin/quota/buildin/common.go b/server/plugin/quota/buildin/common.go
index d9656ce..ca69707 100644
--- a/server/plugin/quota/buildin/common.go
+++ b/server/plugin/quota/buildin/common.go
@@ -109,15 +109,8 @@
 			return int64(len(resp.Schemas)), nil
 		}
 	case quota.TagQuotaType:
-		{
-			resp, err := datasource.Instance().GetTags(ctx, &pb.GetServiceTagsRequest{
-				ServiceId: serviceID,
-			})
-			if err != nil {
-				return 0, err
-			}
-			return int64(len(resp.Tags)), nil
-		}
+		// always re-create the service old tags
+		return 0, nil
 	default:
 		return 0, fmt.Errorf("not define quota type '%s'", res.QuotaType)
 	}
diff --git a/server/service/tag_test.go b/server/service/tag_test.go
index d32480c..40f5c85 100644
--- a/server/service/tag_test.go
+++ b/server/service/tag_test.go
@@ -137,7 +137,7 @@
 				Expect(err).To(BeNil())
 				Expect(respAddTags.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
 
-				size = quota.DefaultRuleQuota / 2
+				size = quota.DefaultRuleQuota
 				tags = make(map[string]string, size)
 				for i := 0; i < size; i++ {
 					s := "tag" + strconv.Itoa(i)
@@ -149,14 +149,6 @@
 				})
 				Expect(err).To(BeNil())
 				Expect(respAddTags.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				tags["out"] = "range"
-				respAddTags, _ = serviceResource.AddTags(getContext(), &pb.AddServiceTagsRequest{
-					ServiceId: serviceId2,
-					Tags:      tags,
-				})
-				Expect(err).To(BeNil())
-				Expect(respAddTags.Response.GetCode()).To(Equal(pb.ErrNotEnoughQuota))
 			})
 		})
 	})