This is an automated email from the ASF dual-hosted git repository.

littlecui 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 429da63c multi instances change status by properties (#1425)
429da63c is described below

commit 429da63c7a1c8a9241493a28cc8f53d665e1b7fa
Author: fancy <31287706+qiuq...@users.noreply.github.com>
AuthorDate: Sat Aug 26 15:45:38 2023 +0800

    multi instances change status by properties (#1425)
    
    * multi instances change status by properties
    
    * multi instances change status by properties
    
    * multi instances change status by properties
    
    ---------
    
    Co-authored-by: qiuqi (C) <q30043...@china.huawei.com>
---
 datasource/etcd/ms.go                      | 53 ++++++++++++++++++++++++++++++
 datasource/mongo/ms.go                     |  4 +++
 datasource/ms.go                           |  6 ++++
 server/resource/disco/instance_resource.go | 28 ++++++++++++++--
 server/service/disco/instance.go           |  5 +++
 5 files changed, 94 insertions(+), 2 deletions(-)

diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 66cc4908..a0096989 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -39,6 +39,7 @@ import (
        
"github.com/apache/servicecomb-service-center/datasource/etcd/state/kvstore"
        esync 
"github.com/apache/servicecomb-service-center/datasource/etcd/sync"
        eutil 
"github.com/apache/servicecomb-service-center/datasource/etcd/util"
+       serviceUtil 
"github.com/apache/servicecomb-service-center/datasource/etcd/util"
        "github.com/apache/servicecomb-service-center/datasource/schema"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/util"
@@ -1569,3 +1570,55 @@ func (ds *MetadataManager) UnregisterService(ctx 
context.Context, request *pb.De
 func (ds *MetadataManager) Statistics(ctx context.Context, withShared bool) 
(*pb.Statistics, error) {
        return statistics(ctx, withShared)
 }
+
+func (ds *MetadataManager) UpdateManyInstanceStatus(ctx context.Context, match 
*datasource.MatchPolicy, status string) error {
+       resp, _ := ds.ListManyInstances(ctx, &pb.GetAllInstancesRequest{})
+       instances := resp.Instances
+       if len(instances) == 0 {
+               return nil
+       }
+       options := make([]etcdadpt.OpOptions, 0)
+       cmps := make([]etcdadpt.CmpOptions, 0)
+
+       domainProject := util.ParseDomainProject(ctx)
+
+       for _, instance := range instances {
+               var t = true
+               for k, v := range match.Properties {
+                       value, ok := instance.Properties[k]
+                       if ok {
+                               if value != v {
+                                       t = false
+                                       break
+                               }
+                       } else {
+                               t = false
+                               break
+                       }
+               }
+               if t {
+                       key := path.GenerateInstanceKey(domainProject, 
instance.ServiceId, instance.InstanceId)
+                       //更新状态
+                       instance.Status = status
+                       data, _ := json.Marshal(instance)
+                       leaseID, err := serviceUtil.GetLeaseID(ctx, 
domainProject, instance.ServiceId, instance.InstanceId)
+                       if err != nil {
+                               log.Error(fmt.Sprintf("get leaseId %s error", 
instance.InstanceId), err)
+                               continue
+                       }
+                       options = append(options, 
etcdadpt.Ops(etcdadpt.OpPut(etcdadpt.WithStrKey(key), etcdadpt.WithValue(data), 
etcdadpt.WithLease(leaseID)))...)
+                       cmps = append(cmps, 
etcdadpt.If(etcdadpt.NotEqualVer(path.GenerateServiceKey(domainProject, 
instance.ServiceId), 0))...)
+               }
+       }
+       _, err := etcdadpt.TxnWithCmp(ctx,
+               options,
+               cmps,
+               nil)
+
+       if err != nil {
+               log.Error("UpdateManyInstanceStatus error", err)
+
+               return pb.NewError(pb.ErrUnavailableBackend, err.Error())
+       }
+       return nil
+}
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 3fed2580..78451de8 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -1677,3 +1677,7 @@ func formatRevision(consumerServiceID string, instances 
[]*discovery.MicroServic
 func (ds *MetadataManager) Statistics(ctx context.Context, withShared bool) 
(*discovery.Statistics, error) {
        return statistics(ctx, withShared)
 }
+
+func (ds *MetadataManager) UpdateManyInstanceStatus(ctx context.Context, match 
*datasource.MatchPolicy, status string) error {
+       return nil
+}
diff --git a/datasource/ms.go b/datasource/ms.go
index 52a6e29e..371759c0 100644
--- a/datasource/ms.go
+++ b/datasource/ms.go
@@ -38,6 +38,10 @@ var (
        ErrModifySchemaNotAllow = errors.New("schema already exist, can not be 
changed request")
 )
 
+type MatchPolicy struct {
+       Properties map[string]string `json:"properties,omitempty"`
+}
+
 // Attention: request validation must be finished before the following 
interface being invoked!!!
 // MetadataManager contains the CRUD of cache metadata
 type MetadataManager interface {
@@ -93,4 +97,6 @@ type MetadataManager interface {
        RetireService(ctx context.Context, plan *RetirePlan) error
 
        Statistics(ctx context.Context, withShared bool) (*pb.Statistics, error)
+
+       UpdateManyInstanceStatus(ctx context.Context, match *MatchPolicy, 
status string) error
 }
diff --git a/server/resource/disco/instance_resource.go 
b/server/resource/disco/instance_resource.go
index 7a0129c8..ec336b46 100644
--- a/server/resource/disco/instance_resource.go
+++ b/server/resource/disco/instance_resource.go
@@ -25,11 +25,11 @@ import (
 
        "github.com/go-chassis/go-chassis/v2/pkg/codec"
 
-       discosvc 
"github.com/apache/servicecomb-service-center/server/service/disco"
-
+       "github.com/apache/servicecomb-service-center/datasource"
        "github.com/apache/servicecomb-service-center/pkg/log"
        "github.com/apache/servicecomb-service-center/pkg/rest"
        "github.com/apache/servicecomb-service-center/pkg/util"
+       discosvc 
"github.com/apache/servicecomb-service-center/server/service/disco"
        pb "github.com/go-chassis/cari/discovery"
 )
 
@@ -51,6 +51,7 @@ func (s *InstanceResource) URLPatterns() []rest.Route {
                {Method: http.MethodPut, Path: 
"/v4/:project/registry/microservices/:serviceId/instances/:instanceId/heartbeat",
                        Func: s.SendHeartbeat},
                {Method: http.MethodPut, Path: 
"/v4/:project/registry/heartbeats", Func: s.SendManyHeartbeat},
+               {Method: http.MethodPut, Path: 
"/v4/:project/registry/instances/status", Func: s.UpdateManyInstanceStatus},
        }
 }
 func (s *InstanceResource) LegacyRegisterInstance(w http.ResponseWriter, r 
*http.Request) {
@@ -311,3 +312,26 @@ func (s *InstanceResource) PutInstanceProperties(w 
http.ResponseWriter, r *http.
        }
        rest.WriteResponse(w, r, nil, nil)
 }
+
+func (s *InstanceResource) UpdateManyInstanceStatus(w http.ResponseWriter, r 
*http.Request) {
+       request := &UpdateManyInstanceStatusRequest{}
+       message, _ := io.ReadAll(r.Body)
+       err := codec.Decode(message, request)
+       if err != nil {
+               log.Error(fmt.Sprintf("invalid json: %s", 
util.BytesToStringWithNoCopy(message)), err)
+               rest.WriteError(w, pb.ErrInvalidParams, "Unmarshal error")
+               return
+       }
+       err = discosvc.UpdateManyInstanceStatus(r.Context(), &request.Matches, 
request.Status)
+       if err != nil {
+               log.Error("can not update instance properties", err)
+               rest.WriteServiceError(w, err)
+               return
+       }
+       rest.WriteResponse(w, r, nil, nil)
+}
+
+type UpdateManyInstanceStatusRequest struct {
+       Matches datasource.MatchPolicy `json:"matches,omitempty"`
+       Status  string                 `json:"status,omitempty"`
+}
diff --git a/server/service/disco/instance.go b/server/service/disco/instance.go
index 4fa3689e..45b8cc4d 100644
--- a/server/service/disco/instance.go
+++ b/server/service/disco/instance.go
@@ -485,3 +485,8 @@ func InstanceUsage(ctx context.Context, request 
*pb.GetServiceCountRequest) (int
        }
        return resp.Count, nil
 }
+
+func UpdateManyInstanceStatus(ctx context.Context, match 
*datasource.MatchPolicy, status string) error {
+       err := datasource.GetMetadataManager().UpdateManyInstanceStatus(ctx, 
match, status)
+       return err
+}

Reply via email to