in datasource/etcd/ms.go [1247:1310]
func (ds *MetadataManager) DeleteManyTags(ctx context.Context, request *pb.DeleteServiceTagsRequest) error {
remoteIP := util.GetIPFromContext(ctx)
domainProject := util.ParseDomainProject(ctx)
if !eutil.ServiceExist(ctx, domainProject, request.ServiceId) {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, service does not exist, operator: %s",
request.ServiceId, request.Keys, remoteIP), nil)
return pb.NewError(pb.ErrServiceNotExists, "Service does not exist.")
}
tags, err := eutil.GetTagsUtils(ctx, domainProject, request.ServiceId)
if err != nil {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, get service tags failed, operator: %s",
request.ServiceId, request.Keys, remoteIP), err)
return pb.NewError(pb.ErrInternal, err.Error())
}
copyTags := make(map[string]string, len(tags))
for k, v := range tags {
copyTags[k] = v
}
for _, key := range request.Keys {
if _, ok := copyTags[key]; !ok {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, tag[%s] does not exist, operator: %s",
request.ServiceId, request.Keys, key, remoteIP), nil)
return pb.NewError(pb.ErrTagNotExists, "Delete tags failed for this key "+key+" does not exist.")
}
delete(copyTags, key)
}
// the capacity of tags may be 0
data, err := json.Marshal(copyTags)
if err != nil {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, marshall service tags failed, operator: %s",
request.ServiceId, request.Keys, remoteIP), err)
return pb.NewError(pb.ErrInternal, err.Error())
}
key := path.GenerateServiceTagKey(domainProject, request.ServiceId)
opts := etcdadpt.Ops(etcdadpt.OpPut(etcdadpt.WithStrKey(key), etcdadpt.WithValue(data)))
syncOpts, err := esync.GenDeleteOpts(ctx, datasource.ResourceKV, key, data,
esync.WithOpts(map[string]string{"key": key}))
if err != nil {
return pb.NewError(pb.ErrInternal, err.Error())
}
opts = append(opts, syncOpts...)
resp, err := etcdadpt.TxnWithCmp(ctx, opts,
etcdadpt.If(etcdadpt.NotEqualVer(path.GenerateServiceKey(domainProject, request.ServiceId), 0)), nil)
if err != nil {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, operator: %s",
request.ServiceId, request.Keys, remoteIP), err)
return pb.NewError(pb.ErrUnavailableBackend, err.Error())
}
if !resp.Succeeded {
log.Error(fmt.Sprintf("delete service[%s]'s tags %v failed, service does not exist, operator: %s",
request.ServiceId, request.Keys, remoteIP), err)
return pb.NewError(pb.ErrServiceNotExists, "Service does not exist.")
}
log.Info(fmt.Sprintf("delete service[%s]'s tags %v successfully, operator: %s", request.ServiceId, request.Keys, remoteIP))
return nil
}