GuoYL123 commented on a change in pull request #766:
URL:
https://github.com/apache/servicecomb-service-center/pull/766#discussion_r532374005
##########
File path: server/service/gov/kie/kie_distributor.go
##########
@@ -0,0 +1,202 @@
+package kie
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "github.com/apache/servicecomb-service-center/pkg/gov"
+ "github.com/apache/servicecomb-service-center/server/config"
+ svc "github.com/apache/servicecomb-service-center/server/service/gov"
+ "github.com/ghodss/yaml"
+ "github.com/go-chassis/kie-client"
+ "log"
+ "strings"
+)
+
+type Distributor struct {
+ lbPolicies map[string]*gov.LoadBalancer
+ name string
+ client *kie.Client
+}
+
+const PREFIX = "servicecomb."
+
+const EnableStatus = "enabled"
+
+const ValueType = "text"
+
+const AppKey = "app"
+
+const EnvironmentKey = "environment"
+
+var rule = Validator{}
+
+func (d *Distributor) Create(kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("create %v", &p))
+ key := toSnake(kind) + "." + p.Name
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ Key: PREFIX + key,
+ Value: string(yamlByte),
+ Status: EnableStatus,
+ ValueType: ValueType,
+ Labels: map[string]string{AppKey: p.Selector.App,
EnvironmentKey: p.Selector.Environment},
+ }
+ _, err = d.client.Create(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Update(id, kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("update %v", &p))
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ ID: id,
+ Value: string(yamlByte),
+ Status: p.Status,
+ }
+ _, err = d.client.Put(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Delete(id, project string) error {
+ err := d.client.Delete(context.TODO(), id, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (d *Distributor) List(kind, project, app, env string) ([]byte, error) {
+ list, _, err := d.client.List(context.TODO(),
+ kie.WithKey("beginWith("+PREFIX+toSnake(kind)+")"),
+ kie.WithLabels(map[string]string{AppKey: app, EnvironmentKey:
env}),
+ kie.WithRevision(0),
+ kie.WithGetProject(project))
+ if err != nil {
+ return nil, err
+ }
+ var r []*gov.LoadBalancer
+ for _, item := range list.Data {
+ goc := &gov.LoadBalancer{
+ GovernancePolicy: &gov.GovernancePolicy{},
+ }
+ spec := make(map[string]interface{})
+ specJSON, _ := yaml.YAMLToJSON([]byte(item.Value))
+ err = json.Unmarshal(specJSON, &spec)
+ if err != nil {
+ return nil, err
+ }
+ goc.ID = item.ID
+ goc.Status = item.Status
+ goc.Name = item.Key
+ goc.Spec = spec
+ goc.Selector.App = item.Labels[AppKey]
+ goc.Selector.Environment = item.Labels[EnvironmentKey]
+ goc.CreatTime = item.CreatTime
+ goc.UpdateTime = item.UpdateTime
+ r = append(r, goc)
+ }
+ b, _ := json.MarshalIndent(r, "", " ")
+ return b, nil
+}
+
+func (d *Distributor) Get(id, project string) ([]byte, error) {
+ kv, err := d.client.Get(context.TODO(), id, kie.WithGetProject(project))
+ if err != nil {
+ return nil, err
+ }
+ goc := &gov.LoadBalancer{
+ GovernancePolicy: &gov.GovernancePolicy{},
+ }
+ goc.ID = kv.ID
+ goc.Status = kv.Status
+ goc.Name = kv.Key
+ goc.Spec = kv
+ goc.Selector.App = kv.Labels[AppKey]
+ goc.Selector.Environment = kv.Labels[EnvironmentKey]
+ goc.CreatTime = kv.CreatTime
+ goc.UpdateTime = kv.UpdateTime
+ b, _ := json.MarshalIndent(goc, "", " ")
+ return b, nil
+}
+
+func (d *Distributor) Type() string {
+ return svc.ConfigDistributorKie
+}
+func (d *Distributor) Name() string {
+ return d.name
+}
+
+func initClient(endpoint string) *kie.Client {
+ client, err := kie.NewClient(
+ kie.Config{Endpoint: endpoint,
+ DefaultLabels: map[string]string{},
+ })
+ if err != nil {
+ log.Fatalf("init kie client failed, err: %s", err)
+ }
+ return client
+}
+
+func new(opts config.DistributorOptions) (svc.ConfigDistributor, error) {
+ //ep := config.GetString("gov.kie.endpoint", "")
+ return &Distributor{name: opts.Name, lbPolicies:
map[string]*gov.LoadBalancer{}, client: initClient(opts.Endpoint)}, nil
+}
+
+func toSnake(name string) string {
+ if name == "" {
+ return ""
+ }
+ temp := strings.Split(name, "-")
+ var s string
+ for num, v := range temp {
+ vv := []rune(v)
+ if num == 0 {
+ s += string(vv)
Review comment:
done
##########
File path: server/service/gov/kie/kie_distributor.go
##########
@@ -0,0 +1,202 @@
+package kie
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "github.com/apache/servicecomb-service-center/pkg/gov"
+ "github.com/apache/servicecomb-service-center/server/config"
+ svc "github.com/apache/servicecomb-service-center/server/service/gov"
+ "github.com/ghodss/yaml"
+ "github.com/go-chassis/kie-client"
+ "log"
+ "strings"
+)
+
+type Distributor struct {
+ lbPolicies map[string]*gov.LoadBalancer
+ name string
+ client *kie.Client
+}
+
+const PREFIX = "servicecomb."
+
+const EnableStatus = "enabled"
+
+const ValueType = "text"
+
+const AppKey = "app"
+
+const EnvironmentKey = "environment"
+
+var rule = Validator{}
+
+func (d *Distributor) Create(kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("create %v", &p))
+ key := toSnake(kind) + "." + p.Name
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ Key: PREFIX + key,
+ Value: string(yamlByte),
+ Status: EnableStatus,
+ ValueType: ValueType,
+ Labels: map[string]string{AppKey: p.Selector.App,
EnvironmentKey: p.Selector.Environment},
+ }
+ _, err = d.client.Create(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Update(id, kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("update %v", &p))
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ ID: id,
+ Value: string(yamlByte),
+ Status: p.Status,
+ }
+ _, err = d.client.Put(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Delete(id, project string) error {
+ err := d.client.Delete(context.TODO(), id, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (d *Distributor) List(kind, project, app, env string) ([]byte, error) {
+ list, _, err := d.client.List(context.TODO(),
+ kie.WithKey("beginWith("+PREFIX+toSnake(kind)+")"),
+ kie.WithLabels(map[string]string{AppKey: app, EnvironmentKey:
env}),
+ kie.WithRevision(0),
+ kie.WithGetProject(project))
+ if err != nil {
+ return nil, err
+ }
+ var r []*gov.LoadBalancer
+ for _, item := range list.Data {
+ goc := &gov.LoadBalancer{
+ GovernancePolicy: &gov.GovernancePolicy{},
+ }
+ spec := make(map[string]interface{})
+ specJSON, _ := yaml.YAMLToJSON([]byte(item.Value))
+ err = json.Unmarshal(specJSON, &spec)
+ if err != nil {
+ return nil, err
+ }
+ goc.ID = item.ID
+ goc.Status = item.Status
+ goc.Name = item.Key
+ goc.Spec = spec
+ goc.Selector.App = item.Labels[AppKey]
+ goc.Selector.Environment = item.Labels[EnvironmentKey]
+ goc.CreatTime = item.CreatTime
+ goc.UpdateTime = item.UpdateTime
+ r = append(r, goc)
+ }
+ b, _ := json.MarshalIndent(r, "", " ")
+ return b, nil
+}
+
+func (d *Distributor) Get(id, project string) ([]byte, error) {
+ kv, err := d.client.Get(context.TODO(), id, kie.WithGetProject(project))
+ if err != nil {
+ return nil, err
+ }
+ goc := &gov.LoadBalancer{
+ GovernancePolicy: &gov.GovernancePolicy{},
+ }
+ goc.ID = kv.ID
+ goc.Status = kv.Status
+ goc.Name = kv.Key
+ goc.Spec = kv
+ goc.Selector.App = kv.Labels[AppKey]
+ goc.Selector.Environment = kv.Labels[EnvironmentKey]
+ goc.CreatTime = kv.CreatTime
+ goc.UpdateTime = kv.UpdateTime
+ b, _ := json.MarshalIndent(goc, "", " ")
+ return b, nil
+}
+
+func (d *Distributor) Type() string {
+ return svc.ConfigDistributorKie
+}
+func (d *Distributor) Name() string {
+ return d.name
+}
+
+func initClient(endpoint string) *kie.Client {
+ client, err := kie.NewClient(
+ kie.Config{Endpoint: endpoint,
+ DefaultLabels: map[string]string{},
+ })
+ if err != nil {
+ log.Fatalf("init kie client failed, err: %s", err)
+ }
+ return client
+}
+
+func new(opts config.DistributorOptions) (svc.ConfigDistributor, error) {
+ //ep := config.GetString("gov.kie.endpoint", "")
+ return &Distributor{name: opts.Name, lbPolicies:
map[string]*gov.LoadBalancer{}, client: initClient(opts.Endpoint)}, nil
+}
+
+func toSnake(name string) string {
+ if name == "" {
+ return ""
+ }
+ temp := strings.Split(name, "-")
+ var s string
+ for num, v := range temp {
+ vv := []rune(v)
+ if num == 0 {
+ s += string(vv)
+ continue
+ }
+ if len(vv) > 0 {
+ if vv[0] >= 'a' && vv[0] <= 'z' { //首字母大写
+ vv[0] -= 32
+ }
+ s += string(vv)
Review comment:
done
##########
File path: server/service/gov/mock/mock.go
##########
@@ -31,32 +31,36 @@ type Distributor struct {
name string
}
-func (d *Distributor) Create(kind string, spec []byte) error {
+func (d *Distributor) Create(kind, project string, spec []byte) error {
p := &gov.LoadBalancer{}
err := json.Unmarshal(spec, p)
log.Println(fmt.Sprintf("create %v", &p))
d.lbPolicies[p.GovernancePolicy.Name] = p
return err
}
-func (d *Distributor) Update(kind string, spec []byte) error {
+func (d *Distributor) Update(id, kind, project string, spec []byte) error {
p := &gov.LoadBalancer{}
err := json.Unmarshal(spec, p)
log.Println("update ", p)
d.lbPolicies[p.GovernancePolicy.Name] = p
return err
}
-func (d *Distributor) Delete(name, kind string) error {
- delete(d.lbPolicies, name)
+func (d *Distributor) Delete(id, project string) error {
+ delete(d.lbPolicies, id)
return nil
}
-func (d *Distributor) List(kind string) ([]byte, error) {
+func (d *Distributor) List(kind, project, app, env string) ([]byte, error) {
r := make([]*gov.LoadBalancer, len(d.lbPolicies))
Review comment:
done
##########
File path: server/service/gov/kie/kie_distributor.go
##########
@@ -0,0 +1,202 @@
+package kie
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "github.com/apache/servicecomb-service-center/pkg/gov"
+ "github.com/apache/servicecomb-service-center/server/config"
+ svc "github.com/apache/servicecomb-service-center/server/service/gov"
+ "github.com/ghodss/yaml"
+ "github.com/go-chassis/kie-client"
+ "log"
+ "strings"
+)
+
+type Distributor struct {
+ lbPolicies map[string]*gov.LoadBalancer
+ name string
+ client *kie.Client
+}
+
+const PREFIX = "servicecomb."
+
+const EnableStatus = "enabled"
+
+const ValueType = "text"
+
+const AppKey = "app"
+
+const EnvironmentKey = "environment"
+
+var rule = Validator{}
+
+func (d *Distributor) Create(kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("create %v", &p))
+ key := toSnake(kind) + "." + p.Name
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ Key: PREFIX + key,
+ Value: string(yamlByte),
+ Status: EnableStatus,
+ ValueType: ValueType,
+ Labels: map[string]string{AppKey: p.Selector.App,
EnvironmentKey: p.Selector.Environment},
+ }
+ _, err = d.client.Create(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Update(id, kind, project string, spec []byte) error {
+ p := &gov.LoadBalancer{}
+ err := json.Unmarshal(spec, p)
+ if err != nil {
+ return err
+ }
+ log.Println(fmt.Sprintf("update %v", &p))
+ err = rule.Validate(kind, p.Spec)
+ if err != nil {
+ return err
+ }
+ yamlByte, err := yaml.Marshal(p.Spec)
+ if err != nil {
+ return err
+ }
+ kv := kie.KVRequest{
+ ID: id,
+ Value: string(yamlByte),
+ Status: p.Status,
+ }
+ _, err = d.client.Put(context.TODO(), kv, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ d.lbPolicies[p.GovernancePolicy.Name] = p
+ return nil
+}
+
+func (d *Distributor) Delete(id, project string) error {
+ err := d.client.Delete(context.TODO(), id, kie.WithProject(project))
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (d *Distributor) List(kind, project, app, env string) ([]byte, error) {
+ list, _, err := d.client.List(context.TODO(),
+ kie.WithKey("beginWith("+PREFIX+toSnake(kind)+")"),
+ kie.WithLabels(map[string]string{AppKey: app, EnvironmentKey:
env}),
+ kie.WithRevision(0),
+ kie.WithGetProject(project))
+ if err != nil {
+ return nil, err
+ }
+ var r []*gov.LoadBalancer
Review comment:
done
##########
File path: server/resource/v1/gov_resource.go
##########
@@ -50,26 +51,78 @@ func (t *Governance) Create(w http.ResponseWriter, req
*http.Request) {
//Put gov config
func (t *Governance) Put(w http.ResponseWriter, req *http.Request) {
-
+ kind := req.URL.Query().Get(":kind")
+ id := req.URL.Query().Get(":id")
+ project := req.URL.Query().Get(":project")
+ body, err := ioutil.ReadAll(req.Body)
+ if err != nil {
+ log.Error("read body err", err)
+ controller.WriteError(w, discovery.ErrInternal, err.Error())
+ return
+ }
+ err = gov.Update(id, kind, project, body)
+ if err != nil {
+ log.Error("create gov err", err)
+ controller.WriteError(w, discovery.ErrInternal, err.Error())
+ return
+ }
+ w.WriteHeader(http.StatusOK)
}
//List return all gov config
func (t *Governance) List(w http.ResponseWriter, req *http.Request) {
+ kind := req.URL.Query().Get(":kind")
+ project := req.URL.Query().Get(":project")
+ app := req.URL.Query().Get("app")
+ environment := req.URL.Query().Get("environment")
+ body, err := gov.List(kind, project, app, environment)
+ if err != nil {
+ log.Error("create gov err", err)
+ controller.WriteError(w, discovery.ErrInternal, err.Error())
+ return
+ }
+ _, _ = w.Write(body)
+ w.WriteHeader(http.StatusOK)
+ w.Header().Set(rest.HeaderContentType, rest.ContentTypeJSON)
+}
+//Get gov config
+func (t *Governance) Get(w http.ResponseWriter, req *http.Request) {
+ id := req.URL.Query().Get(":id")
+ project := req.URL.Query().Get(":project")
+ body, err := gov.Get(id, project)
+ if err != nil {
+ log.Error("create gov err", err)
+ controller.WriteError(w, discovery.ErrInternal, err.Error())
+ return
+ }
+ _, _ = w.Write(body)
Review comment:
done
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]