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

tianxiaoliang 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 c7915ad  Feature: Add schema ref (#1180)
c7915ad is described below

commit c7915adad51c9f7dd067c84d4f670494d43a5a27
Author: little-cui <[email protected]>
AuthorDate: Thu Dec 16 09:53:12 2021 +0800

    Feature: Add schema ref (#1180)
---
 datasource/etcd/schema.go                 | 68 ++++++++++++++++++++++++++++++
 datasource/manager.go                     | 16 +++++++
 datasource/mongo/schema.go                | 66 +++++++++++++++++++++++++++++
 datasource/{manager.go => schema/init.go} | 47 +++++++--------------
 datasource/schema/options.go              | 23 +++++++++++
 datasource/schema/schema.go               | 69 +++++++++++++++++++++++++++++++
 etc/conf/app.yaml                         |  3 ++
 7 files changed, 259 insertions(+), 33 deletions(-)

diff --git a/datasource/etcd/schema.go b/datasource/etcd/schema.go
new file mode 100644
index 0000000..2aa7bc2
--- /dev/null
+++ b/datasource/etcd/schema.go
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package etcd
+
+import (
+       "context"
+
+       "github.com/apache/servicecomb-service-center/datasource/schema"
+)
+
+func init() {
+       schema.Install("etcd", NewSchemaDAO)
+       schema.Install("embeded_etcd", NewSchemaDAO)
+       schema.Install("embedded_etcd", NewSchemaDAO)
+}
+
+func NewSchemaDAO(opts schema.Options) (schema.DAO, error) {
+       return &SchemaDAO{}, nil
+}
+
+type SchemaDAO struct{}
+
+func (SchemaDAO) GetRef(ctx context.Context, ref *schema.Ref) (*schema.Ref, 
error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) PutRef(ctx context.Context, ref *schema.Ref) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) DeleteRef(ctx context.Context, ref ...*schema.Ref) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) GetContent(ctx context.Context, hash *schema.ContentRequest) 
(string, error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) PutContent(ctx context.Context, content *schema.Content) 
error {
+       panic("implement me")
+}
+
+func (SchemaDAO) DeleteContent(ctx context.Context, hash 
...*schema.ContentRequest) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) ListHash(ctx context.Context) ([]*schema.Content, error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) ExistRef(ctx context.Context, hash *schema.ContentRequest) 
(*schema.Ref, error) {
+       panic("implement me")
+}
diff --git a/datasource/manager.go b/datasource/manager.go
index 5e4d5d6..9ac3e5d 100644
--- a/datasource/manager.go
+++ b/datasource/manager.go
@@ -20,6 +20,7 @@ package datasource
 import (
        "fmt"
 
+       "github.com/apache/servicecomb-service-center/datasource/schema"
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
@@ -42,6 +43,21 @@ func Init(opts Options) error {
                return nil
        }
 
+       err := initDatasource(opts)
+       if err != nil {
+               return err
+       }
+
+       err = schema.Init(schema.Options{
+               Kind: opts.Kind,
+       })
+       if err != nil {
+               return err
+       }
+       return nil
+}
+
+func initDatasource(opts Options) error {
        dataSourceEngine, ok := plugins[opts.Kind]
        if !ok {
                return fmt.Errorf("plugin implement not supported [%s]", 
opts.Kind)
diff --git a/datasource/mongo/schema.go b/datasource/mongo/schema.go
new file mode 100644
index 0000000..a9a4497
--- /dev/null
+++ b/datasource/mongo/schema.go
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package mongo
+
+import (
+       "context"
+
+       "github.com/apache/servicecomb-service-center/datasource/schema"
+)
+
+func init() {
+       schema.Install("mongo", NewSchemaDAO)
+}
+
+func NewSchemaDAO(opts schema.Options) (schema.DAO, error) {
+       return &SchemaDAO{}, nil
+}
+
+type SchemaDAO struct{}
+
+func (SchemaDAO) GetRef(ctx context.Context, ref *schema.Ref) (*schema.Ref, 
error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) PutRef(ctx context.Context, ref *schema.Ref) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) DeleteRef(ctx context.Context, ref ...*schema.Ref) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) GetContent(ctx context.Context, hash *schema.ContentRequest) 
(string, error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) PutContent(ctx context.Context, content *schema.Content) 
error {
+       panic("implement me")
+}
+
+func (SchemaDAO) DeleteContent(ctx context.Context, hash 
...*schema.ContentRequest) error {
+       panic("implement me")
+}
+
+func (SchemaDAO) ListHash(ctx context.Context) ([]*schema.Content, error) {
+       panic("implement me")
+}
+
+func (SchemaDAO) ExistRef(ctx context.Context, hash *schema.ContentRequest) 
(*schema.Ref, error) {
+       panic("implement me")
+}
diff --git a/datasource/manager.go b/datasource/schema/init.go
similarity index 51%
copy from datasource/manager.go
copy to datasource/schema/init.go
index 5e4d5d6..2a6e6d1 100644
--- a/datasource/manager.go
+++ b/datasource/schema/init.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package datasource
+package schema
 
 import (
        "fmt"
@@ -23,59 +23,40 @@ import (
        "github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-type dataSourceEngine func(opts Options) (DataSource, error)
+type engine func(opts Options) (DAO, error)
 
 var (
-       plugins        = make(map[string]dataSourceEngine)
-       dataSourceInst DataSource
+       plugins  = make(map[string]engine)
+       instance DAO
 )
 
-// load plugins configuration into plugins
-func Install(pluginImplName string, engineFunc dataSourceEngine) {
+// Install load plugins configuration into plugins
+func Install(pluginImplName string, engineFunc engine) {
        plugins[pluginImplName] = engineFunc
 }
 
 // Init construct storage plugin instance
-// invoked by sc main process
+// invoked by sc main process.
 func Init(opts Options) error {
        if opts.Kind == "" {
                return nil
        }
 
-       dataSourceEngine, ok := plugins[opts.Kind]
+       engineFunc, ok := plugins[opts.Kind]
        if !ok {
                return fmt.Errorf("plugin implement not supported [%s]", 
opts.Kind)
        }
+
        var err error
-       dataSourceInst, err = dataSourceEngine(opts)
+       instance, err = engineFunc(opts)
        if err != nil {
                return err
        }
-       log.Info(fmt.Sprintf("datasource plugin [%s] enabled", opts.Kind))
+       log.Info(fmt.Sprintf("schema plugin [%s] enabled", opts.Kind))
+
        return nil
 }
 
-func GetSCManager() SCManager {
-       return dataSourceInst.SCManager()
-}
-func GetMetadataManager() MetadataManager {
-       return dataSourceInst.MetadataManager()
-}
-func GetSystemManager() SystemManager {
-       return dataSourceInst.SystemManager()
-}
-func GetRoleManager() RoleManager {
-       return dataSourceInst.RoleManager()
-}
-func GetAccountManager() AccountManager {
-       return dataSourceInst.AccountManager()
-}
-func GetAccountLockManager() AccountLockManager {
-       return dataSourceInst.AccountLockManager()
-}
-func GetDependencyManager() DependencyManager {
-       return dataSourceInst.DependencyManager()
-}
-func GetMetricsManager() MetricsManager {
-       return dataSourceInst.MetricsManager()
+func Instance() DAO {
+       return instance
 }
diff --git a/datasource/schema/options.go b/datasource/schema/options.go
new file mode 100644
index 0000000..fbdba26
--- /dev/null
+++ b/datasource/schema/options.go
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package schema
+
+//Options contains configuration for plugins
+type Options struct {
+       Kind string
+}
diff --git a/datasource/schema/schema.go b/datasource/schema/schema.go
new file mode 100644
index 0000000..7b0a924
--- /dev/null
+++ b/datasource/schema/schema.go
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package schema
+
+import (
+       "context"
+       "crypto/md5"
+       "encoding/hex"
+)
+
+type RefRequest struct {
+       Domain    string
+       Project   string
+       ServiceID string `json:"serviceId" bson:"service_id"`
+       SchemaID  string `json:"schemaId" bson:"schema_id"`
+}
+
+type Ref struct {
+       Domain    string
+       Project   string
+       ServiceID string `json:"serviceId" bson:"service_id"`
+       SchemaID  string `json:"schemaId" bson:"schema_id"`
+       Hash      string
+}
+
+type ContentRequest struct {
+       Domain  string
+       Project string
+       Hash    string
+}
+
+type Content struct {
+       Domain  string
+       Project string
+       Hash    string
+       Content string
+}
+
+type DAO interface {
+       GetRef(ctx context.Context, ref *Ref) (*Ref, error)
+       PutRef(ctx context.Context, ref *Ref) error
+       DeleteRef(ctx context.Context, ref ...*Ref) error
+       // GetContent get a schema content, hash is the result of 
MD5(schemaId+': '+content), see: Hash
+       GetContent(ctx context.Context, hash *ContentRequest) (string, error)
+       PutContent(ctx context.Context, content *Content) error
+       DeleteContent(ctx context.Context, hash ...*ContentRequest) error
+       // ListHash return Content list without content
+       ListHash(ctx context.Context) ([]*Content, error)
+       ExistRef(ctx context.Context, hash *ContentRequest) (*Ref, error)
+}
+
+func Hash(schemaID, content string) string {
+       return hex.EncodeToString(md5.New().Sum([]byte(schemaID + ": " + 
content)))
+}
diff --git a/etc/conf/app.yaml b/etc/conf/app.yaml
index 333086f..8d190e9 100644
--- a/etc/conf/app.yaml
+++ b/etc/conf/app.yaml
@@ -166,6 +166,9 @@ registry:
     disable: false
     # if want disable modification of Schema, SchemaNotEditable set true
     notEditable: false
+    # remove the schema without refs every 7d
+    retire:
+      interval: 7d
   # enable to register sc itself when startup
   selfRegister: 1
 

Reply via email to