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