You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2022/06/24 01:17:48 UTC

[servicecomb-service-center] branch master updated: Feature: add instanceIsolation kind (#1304)

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 417c1e9a Feature: add instanceIsolation kind (#1304)
417c1e9a is described below

commit 417c1e9a3e180722a720104bbc56e12f7730c7c7
Author: little-cui <su...@qq.com>
AuthorDate: Fri Jun 24 09:17:43 2022 +0800

    Feature: add instanceIsolation kind (#1304)
---
 pkg/gov/governance.go                         | 17 +++++++----------
 pkg/gov/governance_test.go                    |  6 +++---
 server/resource/gov/gov_resource.go           |  2 +-
 server/service/gov/config_distributor_test.go | 18 +++++++++---------
 server/service/gov/kie/kie_distributor.go     | 16 ++++++----------
 server/service/gov/kie/validate.go            |  1 +
 server/service/gov/mock/mock.go               |  2 +-
 7 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/pkg/gov/governance.go b/pkg/gov/governance.go
index 1aab551c..2acd95e8 100644
--- a/pkg/gov/governance.go
+++ b/pkg/gov/governance.go
@@ -22,12 +22,12 @@ package gov
 //Name is the policy name, for example: "rate-limit-payment-api"
 //MD is metadata.
 type GovernancePolicy struct {
-	Name       string    `json:"name,omitempty"`
-	ID         string    `json:"id,omitempty"`
-	Status     string    `json:"status,omitempty"`
-	CreatTime  int64     `json:"creatTime,omitempty"`
-	UpdateTime int64     `json:"updateTime,omitempty"`
-	Selector   *Selector `json:"selector,omitempty"`
+	Name       string   `json:"name,omitempty"`
+	ID         string   `json:"id,omitempty"`
+	Status     string   `json:"status,omitempty"`
+	CreatTime  int64    `json:"creatTime,omitempty"`
+	UpdateTime int64    `json:"updateTime,omitempty"`
+	Selector   Selector `json:"selector,omitempty"`
 }
 
 //DisplayData define display data
@@ -43,10 +43,7 @@ type Policy struct {
 	Spec map[string]interface{} `json:"spec,omitempty"`
 }
 
-type Selector struct {
-	App         string `json:"app,omitempty"`
-	Environment string `json:"environment,omitempty"`
-}
+type Selector map[string]string
 
 type LBSpec struct {
 	MarkerName string         `json:"match"`
diff --git a/pkg/gov/governance_test.go b/pkg/gov/governance_test.go
index a247aefe..a318983a 100644
--- a/pkg/gov/governance_test.go
+++ b/pkg/gov/governance_test.go
@@ -50,9 +50,9 @@ func TestNewInstance(t *testing.T) {
 		GovernancePolicy: &gov.GovernancePolicy{
 			Name: "traffic2adminAPI",
 			ID:   "",
-			Selector: &gov.Selector{
-				App:         "default",
-				Environment: "development",
+			Selector: gov.Selector{
+				"app":         "default",
+				"environment": "development",
 			},
 		},
 		Spec: map[string]interface{}{
diff --git a/server/resource/gov/gov_resource.go b/server/resource/gov/gov_resource.go
index 2ccda467..9a77b32a 100644
--- a/server/resource/gov/gov_resource.go
+++ b/server/resource/gov/gov_resource.go
@@ -55,7 +55,7 @@ func (t *Governance) Create(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	p := &model.Policy{
-		GovernancePolicy: &model.GovernancePolicy{Selector: &model.Selector{}},
+		GovernancePolicy: &model.GovernancePolicy{Selector: model.Selector{}},
 	}
 	err = json.Unmarshal(body, p)
 	if err != nil {
diff --git a/server/service/gov/config_distributor_test.go b/server/service/gov/config_distributor_test.go
index e8d5f300..9ed9b643 100644
--- a/server/service/gov/config_distributor_test.go
+++ b/server/service/gov/config_distributor_test.go
@@ -57,9 +57,9 @@ func TestCreate(t *testing.T) {
 	res, err := svc.Create(context.TODO(), MockKind, Project, &gov.Policy{
 		GovernancePolicy: &gov.GovernancePolicy{
 			Name: "Traffic2adminAPI",
-			Selector: &gov.Selector{
-				App:         MockApp,
-				Environment: MockEnv,
+			Selector: gov.Selector{
+				"app":         MockApp,
+				"environment": MockEnv,
 			},
 		},
 		Spec: map[string]interface{}{"retryNext": 3, "match": "traffic2adminAPI"},
@@ -73,9 +73,9 @@ func TestUpdate(t *testing.T) {
 	err := svc.Update(context.TODO(), MockKind, id, Project, &gov.Policy{
 		GovernancePolicy: &gov.GovernancePolicy{
 			Name: "Traffic2adminAPI",
-			Selector: &gov.Selector{
-				App:         MockApp,
-				Environment: MockEnv,
+			Selector: gov.Selector{
+				"app":         MockApp,
+				"environment": MockEnv,
 			},
 		},
 		Spec: map[string]interface{}{"retryNext": 3, "match": "traffic2adminAPI"},
@@ -87,9 +87,9 @@ func TestDisplay(t *testing.T) {
 	res, err := svc.Create(context.TODO(), MatchGroup, Project, &gov.Policy{
 		GovernancePolicy: &gov.GovernancePolicy{
 			Name: "Traffic2adminAPI",
-			Selector: &gov.Selector{
-				App:         MockApp,
-				Environment: MockEnv,
+			Selector: gov.Selector{
+				"app":         MockApp,
+				"environment": MockEnv,
 			},
 		},
 	})
diff --git a/server/service/gov/kie/kie_distributor.go b/server/service/gov/kie/kie_distributor.go
index 25f51ed2..26cc9e42 100644
--- a/server/service/gov/kie/kie_distributor.go
+++ b/server/service/gov/kie/kie_distributor.go
@@ -56,7 +56,7 @@ const (
 	Rules           = "rules"
 )
 
-var PolicyNames = []string{"retry", "rateLimiting", "circuitBreaker", "bulkhead"}
+var PolicyNames = []string{"retry", "rateLimiting", "circuitBreaker", "bulkhead", "instanceIsolation"}
 
 var rule = Validator{}
 
@@ -84,7 +84,7 @@ func (d *Distributor) Create(ctx context.Context, kind, project string, p *gov.P
 		Value:     string(yamlByte),
 		Status:    StatusEnabled,
 		ValueType: TypeText,
-		Labels:    map[string]string{KeyApp: p.Selector.App, KeyEnvironment: p.Selector.Environment},
+		Labels:    p.Selector,
 	}
 	res, err := d.client.Create(ctx, kv, kie.WithProject(project))
 	if err != nil {
@@ -140,12 +140,9 @@ func (d *Distributor) DeleteMatchGroup(ctx context.Context, id string, project s
 		return err
 	}
 
-	labels := make(map[string]string)
-	labels[KeyApp] = policy.Selector.App
-	labels[KeyEnvironment] = policy.Selector.Environment
 	ops := []kie.GetOption{
 		kie.WithKey("wildcard(" + KeyPrefix + "*." + policy.Name + ")"),
-		kie.WithLabels(labels),
+		kie.WithLabels(policy.Selector),
 		kie.WithRevision(0),
 		kie.WithGetProject(project),
 	}
@@ -340,7 +337,7 @@ func (d *Distributor) generateID(ctx context.Context, project string, p *gov.Pol
 		return nil
 	}
 	kind := KindMatchGroup
-	list, _, err := d.listDataByKind(ctx, kind, project, p.Selector.App, p.Selector.Environment)
+	list, _, err := d.listDataByKind(ctx, kind, project, p.Selector[KeyApp], p.Selector[KeyEnvironment])
 	if err != nil {
 		return err
 	}
@@ -377,7 +374,7 @@ func getID() string {
 func (d *Distributor) transform(kv *kie.KVDoc, kind string) (*gov.Policy, error) {
 	goc := &gov.Policy{
 		GovernancePolicy: &gov.GovernancePolicy{
-			Selector: &gov.Selector{},
+			Selector: gov.Selector{},
 		},
 	}
 	spec := make(map[string]interface{})
@@ -392,8 +389,7 @@ func (d *Distributor) transform(kv *kie.KVDoc, kind string) (*gov.Policy, error)
 	goc.Status = kv.Status
 	goc.Name = kv.Key[strings.LastIndex(kv.Key, ".")+1 : len(kv.Key)]
 	goc.Spec = spec
-	goc.Selector.App = kv.Labels[KeyApp]
-	goc.Selector.Environment = kv.Labels[KeyEnvironment]
+	goc.Selector = kv.Labels
 	goc.CreatTime = kv.CreatTime
 	goc.UpdateTime = kv.UpdateTime
 	return goc, nil
diff --git a/server/service/gov/kie/validate.go b/server/service/gov/kie/validate.go
index 3d25e4ec..7a23da72 100644
--- a/server/service/gov/kie/validate.go
+++ b/server/service/gov/kie/validate.go
@@ -46,6 +46,7 @@ func (d *Validator) Validate(kind string, spec interface{}) error {
 	case "rate-limiting":
 		return rateLimitingValidate(spec)
 	case "circuit-breaker":
+	case "instance-isolation":
 	case "bulkhead":
 	case "loadbalancer":
 		return nil
diff --git a/server/service/gov/mock/mock.go b/server/service/gov/mock/mock.go
index 990ffcb0..97c541c0 100644
--- a/server/service/gov/mock/mock.go
+++ b/server/service/gov/mock/mock.go
@@ -105,7 +105,7 @@ func (d *Distributor) List(ctx context.Context, kind, project, app, env string)
 }
 
 func checkPolicy(g *gov.Policy, kind, app, env string) bool {
-	return g.Kind == kind && g.Selector != nil && g.Selector.App == app && g.Selector.Environment == env
+	return g.Kind == kind && g.Selector != nil && g.Selector["app"] == app && g.Selector["environment"] == env
 }
 
 func (d *Distributor) Get(ctx context.Context, kind, id, project string) ([]byte, error) {