You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by mi...@apache.org on 2023/03/22 04:53:06 UTC

[shardingsphere-on-cloud] branch main updated: feat(pitr): implement show backup record func (#273)

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

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new 2e11512  feat(pitr): implement show backup record func (#273)
2e11512 is described below

commit 2e115128cff4f052d7826b0e5e04519443653881
Author: Xu-Wentao <cu...@yahoo.com>
AuthorDate: Wed Mar 22 12:53:00 2023 +0800

    feat(pitr): implement show backup record func (#273)
---
 pitr/cli/go.mod                    |   2 +
 pitr/cli/go.sum                    |  22 +++----
 pitr/cli/internal/cmd/show.go      | 123 ++++++++++++++++++++++++++++++++-----
 pitr/cli/internal/cmd/show_test.go |  99 +++++++++++++++++++++++++++++
 4 files changed, 221 insertions(+), 25 deletions(-)

diff --git a/pitr/cli/go.mod b/pitr/cli/go.mod
index fe896f4..1ae202c 100644
--- a/pitr/cli/go.mod
+++ b/pitr/cli/go.mod
@@ -6,6 +6,7 @@ require (
 	gitee.com/opengauss/openGauss-connector-go-pq v1.0.4
 	github.com/golang/mock v1.6.0
 	github.com/google/uuid v1.3.0
+	github.com/modood/table v0.0.0-20220527013332-8d47e76dad33
 	github.com/onsi/ginkgo/v2 v2.9.1
 	github.com/onsi/gomega v1.27.3
 	github.com/spf13/cobra v1.6.1
@@ -21,6 +22,7 @@ require (
 	github.com/kr/pretty v0.3.0 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/rogpeppe/go-internal v1.8.0 // indirect
+	github.com/smartystreets/goconvey v1.7.2 // indirect
 	github.com/spf13/pflag v1.0.5 // indirect
 	github.com/stretchr/testify v1.8.1 // indirect
 	github.com/tjfoc/gmsm v1.4.1 // indirect
diff --git a/pitr/cli/go.sum b/pitr/cli/go.sum
index 5aa05a8..1a906ea 100644
--- a/pitr/cli/go.sum
+++ b/pitr/cli/go.sum
@@ -35,7 +35,6 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
 github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -48,9 +47,13 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
 github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
@@ -59,12 +62,10 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/onsi/ginkgo/v2 v2.3.1 h1:8SbseP7qM32WcvE6VaN6vfXxv698izmsJ1UQX9ve7T8=
-github.com/onsi/ginkgo/v2 v2.3.1/go.mod h1:Sv4yQXwG5VmF7tm3Q5Z+RWUpPo24LF1mpnz2crUb8Ys=
+github.com/modood/table v0.0.0-20220527013332-8d47e76dad33 h1:T5IbS9C1G2zeHb6eBy6OfIvj5tfQB23kGFpewCJuGDg=
+github.com/modood/table v0.0.0-20220527013332-8d47e76dad33/go.mod h1:41qyXVI5QH9/ObyPj27CGCVau5v/njfc3Gjj7yzr0HQ=
 github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
 github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo=
-github.com/onsi/gomega v1.22.1 h1:pY8O4lBfsHKZHM/6nrxkhVPUznOlIu3quZcKP/M20KI=
-github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM=
 github.com/onsi/gomega v1.27.3 h1:5VwIwnBY3vbBDOJrNtA4rVdiTZCsq9B5F12pvy1Drmk=
 github.com/onsi/gomega v1.27.3/go.mod h1:5vG284IBtfDAmDyrK+eGyZmUgUlmi+Wngqo557cZ6Gw=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -77,6 +78,10 @@ github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
 github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
 github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
+github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg=
+github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM=
 github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
 github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -123,8 +128,6 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
-golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -141,21 +144,18 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
-golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
diff --git a/pitr/cli/internal/cmd/show.go b/pitr/cli/internal/cmd/show.go
index 3860bb6..92506a5 100644
--- a/pitr/cli/internal/cmd/show.go
+++ b/pitr/cli/internal/cmd/show.go
@@ -18,11 +18,19 @@
 package cmd
 
 import (
+	"encoding/json"
 	"fmt"
-
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/xerr"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/logging"
 	"github.com/spf13/cobra"
+	"os"
+)
 
-	"github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/logging"
+var (
+	CSN      string
+	RecordID string
 )
 
 var Show = &cobra.Command{
@@ -59,28 +67,115 @@ var Show = &cobra.Command{
 		}
 		logging.Info(fmt.Sprintf("flags:agentPort:%d", agentPort))
 
-		csn, err := cmd.Flags().GetString(csn)
+		CSN, err = cmd.Flags().GetString(csn)
 		if err != nil {
 			logging.Error(err.Error())
 		}
-		logging.Info(fmt.Sprintf("flags:csn:%s", csn))
+		logging.Info(fmt.Sprintf("flags:csn:%s", CSN))
 
-		id, err := cmd.Flags().GetString(backupRecordID)
+		RecordID, err = cmd.Flags().GetString(backupRecordID)
 		if err != nil {
 			logging.Error(err.Error())
 		}
-		logging.Info(fmt.Sprintf("flags:id:%s", id))
+		logging.Info(fmt.Sprintf("flags:id:%s", RecordID))
 
-		logging.Info("Restore...")
+		logging.Info("Show backup history ...")
+
+		if err := show(); err != nil {
+			logging.Error(err.Error())
+		}
 	},
 }
 
-func init() {
-	var (
-		csn string
-		id  string
-	)
+func show() error {
+	root := fmt.Sprintf("%s/%s", os.Getenv("HOME"), ".gs_pitr")
+	logging.Info(fmt.Sprintf("Default backup path: %s\n", root))
 
-	Show.PersistentFlags().StringVarP(&csn, "csn", "", "", "commit sequence number")
-	Show.PersistentFlags().StringVarP(&id, "id", "", "", "backup record id")
+	ls, err := pkg.NewLocalStorage(root)
+	if err != nil {
+		return xerr.NewCliErr(fmt.Sprintf("connect to local storage failed, err:%s", err.Error()))
+	}
+	// show backup record by csn
+	if CSN != "" {
+		bak, err := ls.ReadByCSN(csn)
+		if bak == nil {
+			fmt.Println("Didn't find backup record by csn: ", CSN)
+			return nil
+		}
+		if err != nil {
+			return xerr.NewCliErr(fmt.Sprintf("read backup record failed, err:%s", err.Error()))
+		}
+		if err := formatRecord([]model.LsBackup{*bak}); err != nil {
+			return err
+		}
+		return nil
+	}
+	// show backup record by id
+	if RecordID != "" {
+		bak, err := ls.ReadByID(RecordID)
+		if bak == nil {
+			fmt.Println("Didn't find backup record by record id: ", RecordID)
+			return nil
+		}
+		if err != nil {
+			return xerr.NewCliErr(fmt.Sprintf("read backup record failed, err:%s", err.Error()))
+		}
+		if err := formatRecord([]model.LsBackup{*bak}); err != nil {
+			return err
+		}
+		return nil
+	}
+
+	// show all backup record
+	backupList, err := ls.ReadAll()
+	if len(backupList) == 0 {
+		fmt.Println("Didn't find any backup record.")
+		return nil
+	}
+	if err != nil {
+		return xerr.NewCliErr(fmt.Sprintf("read backup record failed, err:%s", err.Error()))
+	}
+
+	if err := formatRecord(backupList); err != nil {
+		return err
+	}
+
+	return nil
+}
+func formatRecord(backups []model.LsBackup, mode ...string) error {
+	var m string
+
+	if len(mode) == 0 {
+		m = "json"
+	} else {
+		m = mode[0]
+	}
+	switch m {
+	case "json":
+		return formatRecordJson(backups)
+	case "table":
+		// TODO format record table
+		return nil
+	default:
+		return formatRecordJson(backups)
+	}
+}
+
+func formatRecordJson(backups []model.LsBackup) error {
+	var ds []string
+	for _, backup := range backups {
+		data, err := json.MarshalIndent(backup, "", "\t")
+		if err != nil {
+			logging.Error(err.Error())
+			return xerr.NewCliErr("format backup record failed, indent failed.")
+		}
+		ds = append(ds, string(data))
+	}
+	fmt.Println(ds)
+	return nil
+}
+
+func init() {
+	Show.PersistentFlags().StringVarP(&CSN, "csn", "", "", "commit sequence number")
+	Show.PersistentFlags().StringVarP(&RecordID, "id", "", "", "backup record id")
 }
diff --git a/pitr/cli/internal/cmd/show_test.go b/pitr/cli/internal/cmd/show_test.go
new file mode 100644
index 0000000..65f4582
--- /dev/null
+++ b/pitr/cli/internal/cmd/show_test.go
@@ -0,0 +1,99 @@
+/*
+ * 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 cmd
+
+import (
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+	"time"
+)
+
+var _ = Describe("Show", func() {
+	Context("when show backup history", func() {
+		It("format output", func() {
+			bak := &model.LsBackup{
+				Info: &model.BackupMetaInfo{
+					ID:        "back-id",
+					CSN:       "csn",
+					StartTime: time.Now().Unix(),
+					EndTime:   time.Now().Add(time.Second * 10).Unix(),
+				},
+				DnList: []*model.DataNode{
+					{
+						IP:        "127.0.0.1",
+						Port:      3306,
+						Status:    "Running",
+						BackupID:  "back-id",
+						StartTime: time.Now().Unix(),
+						EndTime:   time.Now().Add(time.Second * 10).Unix(),
+					},
+					{
+						IP:        "127.0.0.2",
+						Port:      3306,
+						Status:    "Completed",
+						BackupID:  "back-id",
+						StartTime: time.Now().Unix(),
+						EndTime:   time.Now().Add(time.Second * 10).Unix(),
+					},
+				},
+				SsBackup: &model.SsBackup{
+					Status: "Running",
+					ClusterInfo: &model.ClusterInfo{
+						MetaData: model.MetaData{
+							Databases: model.Databases{
+								ShardingDb: "sharding_db",
+								AnotherDb:  "",
+							},
+							Props: "props",
+							Rules: "rules",
+						},
+						SnapshotInfo: model.SnapshotInfo{},
+					},
+					StorageNodes: []*model.StorageNode{
+						{
+							IP:       "127.0.0.1",
+							Port:     3306,
+							Username: "username",
+							Password: "password",
+							Database: "database",
+							Remark:   "remark",
+						},
+						{
+							IP:       "127.0.0.2",
+							Port:     3306,
+							Username: "username",
+							Password: "password",
+							Database: "database",
+							Remark:   "remark",
+						},
+					},
+				},
+			}
+			err := formatRecord([]model.LsBackup{*bak, *bak})
+			Expect(err).To(BeNil())
+		})
+	})
+	Context("search backup history", func() {
+		It("no record", func() {
+			Expect(show()).To(BeNil())
+		})
+	})
+
+})