From adf249e2830a793e2aa04cd87158d671969e10a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lex=20Gonz=C3=A1lez?= Date: Wed, 14 Feb 2018 19:42:14 +0100 Subject: [PATCH] Add extra info to verbose requests to PodSandboxStatus MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If PodSandboxStatusRequest.Verbose is true now we are returning the cri-o version in a JSON object for debug purposes. In the future extra information (to be defined) should be added to the response In order to avoid problems when we execute the tests in parallel the fixtures for new test sandbox and container are creating their own random IDs and returning them in case you need to refer to them. Finally, "make testunit" is being run as root to solve a problem with a `chown` that couldn't be performed otherwise. This commit closes #1144 Signed-off-by: Álex González --- .travis.yml | 6 +- server/config_test.go | 6 -- server/sandbox_status.go | 21 ++++++ server/sandbox_status_test.go | 119 ++++++++++++++++++++++++++++++++++ server/utils_test.go | 6 ++ 5 files changed, 149 insertions(+), 9 deletions(-) create mode 100644 server/sandbox_status_test.go diff --git a/.travis.yml b/.travis.yml index 92ffa2c1..2bf7349a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,15 +35,15 @@ jobs: go: tip - stage: Build and Verify script: - - make testunit + - sudo "PATH=$PATH" make testunit - make go: 1.8.x - script: - - make testunit + - sudo "PATH=$PATH" make testunit - make go: 1.9.x - script: - - make testunit + - sudo "PATH=$PATH" make testunit - make go: tip - stage: Integration Test diff --git a/server/config_test.go b/server/config_test.go index 9d8ddf04..00a5f117 100644 --- a/server/config_test.go +++ b/server/config_test.go @@ -10,12 +10,6 @@ import ( const fixturePath = "fixtures/crio.conf" -func must(t *testing.T, err error) { - if err != nil { - t.Error(err) - } -} - func assertAllFieldsEquality(t *testing.T, c Config) { testCases := []struct { fieldValue, expected interface{} diff --git a/server/sandbox_status.go b/server/sandbox_status.go index d0921562..3f734411 100644 --- a/server/sandbox_status.go +++ b/server/sandbox_status.go @@ -1,9 +1,11 @@ package server import ( + "encoding/json" "time" "github.com/kubernetes-incubator/cri-o/oci" + "github.com/kubernetes-incubator/cri-o/version" "github.com/sirupsen/logrus" "golang.org/x/net/context" pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" @@ -55,6 +57,25 @@ func (s *Server) PodSandboxStatus(ctx context.Context, req *pb.PodSandboxStatusR }, } + if req.Verbose { + resp = amendVerboseInfo(resp) + } + logrus.Debugf("PodSandboxStatusResponse: %+v", resp) return resp, nil } + +// VersionPayload is a helper struct to create the JSON payload to show the version +type VersionPayload struct { + Version string `json:"version"` +} + +func amendVerboseInfo(resp *pb.PodSandboxStatusResponse) *pb.PodSandboxStatusResponse { + resp.Info = make(map[string]string) + bs, err := json.Marshal(VersionPayload{Version: version.Version}) + if err != nil { + return resp // Just ignore the error and don't marshal the info + } + resp.Info["version"] = string(bs) + return resp +} diff --git a/server/sandbox_status_test.go b/server/sandbox_status_test.go new file mode 100644 index 00000000..5fc1e835 --- /dev/null +++ b/server/sandbox_status_test.go @@ -0,0 +1,119 @@ +package server + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "math/rand" + "os" + "testing" + "time" + + "github.com/kubernetes-incubator/cri-o/lib" + "github.com/kubernetes-incubator/cri-o/lib/sandbox" + "github.com/kubernetes-incubator/cri-o/oci" + "github.com/kubernetes-incubator/cri-o/version" + pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" +) + +func init() { + rand.Seed(time.Now().UTC().UnixNano()) +} + +func newTestContainerServerOrFailNow(t *testing.T) (cs *lib.ContainerServer, dirsToCleanUp []string) { + tmpdir := os.Getenv("TMPDIR") + + config := lib.DefaultConfig() + runRoot, err := ioutil.TempDir(tmpdir, "") + if err != nil { + t.Fatal(err) + } + config.RootConfig.RunRoot = runRoot + root, err := ioutil.TempDir(tmpdir, "") + if err != nil { + t.Fatal(err) + } + config.RootConfig.Root = root + config.RootConfig.Storage = "vfs" + cs, err = lib.New(config) + if err != nil { + t.Fatal(err) + } + return cs, []string{runRoot, root} +} + +func newTestSandboxOrFailNow(t *testing.T) (string, *sandbox.Sandbox) { + id := fmt.Sprintf("id-for-sandbox-%d", rand.Int()) + + sb, err := sandbox.New(id, "", "", "", "", nil, nil, "", "", nil, "", "", false, false, "", "", nil) + if err != nil { + t.Fatal(err) + } + return id, sb +} + +func newTestContainerOrFailNow(t *testing.T) *oci.Container { + id := fmt.Sprintf("id-for-container-%d", rand.Int()) + + c, err := oci.NewContainer(id, "", "", "", nil, nil, nil, nil, "", "", "", nil, "", false, false, false, false, false, "", time.Now(), "") + if err != nil { + t.Fatal(err) + } + return c +} + +func setupServer(t *testing.T) (*Server, string, func()) { + containerServer, fs := newTestContainerServerOrFailNow(t) + teardown := func() { + for _, f := range fs { + defer os.RemoveAll(f) + } + } + + server := &Server{ContainerServer: containerServer} + sandboxID, sb := newTestSandboxOrFailNow(t) + sb.SetInfraContainer(newTestContainerOrFailNow(t)) + server.PodIDIndex().Add(sandboxID) + server.ContainerServer.AddSandbox(sb) + + return server, sandboxID, teardown +} + +func TestPodSandboxStatus(t *testing.T) { + server, sandboxID, teardown := setupServer(t) + defer teardown() + + t.Run("Without verbose information", func(t *testing.T) { + resp, err := server.PodSandboxStatus(nil, &pb.PodSandboxStatusRequest{ + PodSandboxId: sandboxID, + }) + if err != nil { + t.Fatal(err) + } + + if resp.Status == nil { + t.Error("expected non nil resp.Status") + } + if resp.Info != nil { + t.Error("expected nil resp.Info") + } + }) + + t.Run("With verbose information", func(t *testing.T) { + resp, err := server.PodSandboxStatus(nil, &pb.PodSandboxStatusRequest{ + PodSandboxId: sandboxID, + Verbose: true, + }) + if err != nil { + t.Fatal(err) + } + + marshaledVersion := resp.Info["version"] + var versionPayload VersionPayload + must(t, json.Unmarshal([]byte(marshaledVersion), &versionPayload)) + + if version.Version != versionPayload.Version { + t.Errorf("expected: %s\ngot: %s", version.Version, versionPayload.Version) + } + }) +} diff --git a/server/utils_test.go b/server/utils_test.go index 94340c20..4936677c 100644 --- a/server/utils_test.go +++ b/server/utils_test.go @@ -15,6 +15,12 @@ const ( dnsPath = "fixtures/resolv.conf" ) +func must(t *testing.T, err error) { + if err != nil { + t.Error(err) + } +} + func TestParseDNSOptions(t *testing.T) { testCases := []struct { Servers, Searches, Options []string