add Exist method to determine a key's existence (#259)

diff --git a/server/service/kv/kv_svc.go b/server/service/kv/kv_svc.go
index 66a958b..9d15534 100644
--- a/server/service/kv/kv_svc.go
+++ b/server/service/kv/kv_svc.go
@@ -302,3 +302,16 @@
 	defer listSema.Release()
 	return datasource.GetBroker().GetKVDao().List(ctx, project, domain, options...)
 }
+
+func Exist(ctx context.Context, key, project, domain string, labels map[string]string) (bool, error) {
+	if labels == nil {
+		labels = map[string]string{}
+	}
+	labelFormat := stringutil.FormatMap(labels)
+	exist, err := datasource.GetBroker().GetKVDao().Exist(ctx, key, project, domain, datasource.WithLabelFormat(labelFormat))
+	if err != nil {
+		openlog.Error(err.Error())
+		return false, err
+	}
+	return exist, nil
+}
diff --git a/server/service/kv/kv_svc_test.go b/server/service/kv/kv_svc_test.go
index 471c016..879936c 100644
--- a/server/service/kv/kv_svc_test.go
+++ b/server/service/kv/kv_svc_test.go
@@ -195,3 +195,37 @@
 		assert.NoError(t, err)
 	})
 }
+
+func TestExist(t *testing.T) {
+	labels := map[string]string{
+		"app":     "solar-system",
+		"service": "galaxy",
+	}
+	t.Run("determine whether key 'earth' exists, expected: exists", func(t *testing.T) {
+		ctx := context.TODO()
+		kv, err := kvsvc.Create(ctx, &model.KVDoc{
+			Key:     "earth",
+			Value:   "exists",
+			Status:  common.StatusEnabled,
+			Labels:  labels,
+			Domain:  domain,
+			Project: project,
+		})
+		assert.Nil(t, err)
+		assert.NotEmpty(t, kv.ID)
+		exists, queryErr := kvsvc.Exist(ctx, "earth", project, domain, labels)
+		assert.NoError(t, queryErr)
+		assert.Equal(t, true, exists)
+	})
+	t.Run("determine whether key 'earth' exists with nil labels, expected: not exists", func(t *testing.T) {
+		exists, queryErr := kvsvc.Exist(context.TODO(), "earth", project, domain, nil)
+		assert.NoError(t, queryErr)
+		assert.Equal(t, false, exists)
+	})
+	t.Run("search wrong key, expected: not exists", func(t *testing.T) {
+		exists, queryErr := kvsvc.Exist(context.TODO(), "x.x.x.x.x.x", project, domain, labels)
+		assert.NoError(t, queryErr)
+		assert.Equal(t, false, exists)
+	})
+
+}