From af38bf1ef76c7fe34091ea0f4bbc9550d3329247 Mon Sep 17 00:00:00 2001 From: Yuki Yugui Sonoda Date: Tue, 15 Jul 2014 22:53:39 +0900 Subject: [PATCH 1/6] Fixes golint errors in pkg/api --- pkg/api/types.go | 2 +- pkg/api/validation.go | 1 + pkg/kubelet/kubelet.go | 2 +- pkg/kubelet/kubelet_server_test.go | 4 ++-- pkg/kubelet/kubelet_test.go | 10 +++++----- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index 2a5c550f937..61ac813efe1 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -156,7 +156,7 @@ type Percentile struct { // ContainerStats represents statistical information of a container type ContainerStats struct { - CpuUsagePercentiles []Percentile `json:"cpu_usage_percentiles,omitempty"` + CPUUsagePercentiles []Percentile `json:"cpu_usage_percentiles,omitempty"` MemoryUsagePercentiles []Percentile `json:"memory_usage_percentiles,omitempty"` MaxMemoryUsage uint64 `json:"max_memory_usage,omitempty"` } diff --git a/pkg/api/validation.go b/pkg/api/validation.go index a73373efa97..a29dec05c0d 100644 --- a/pkg/api/validation.go +++ b/pkg/api/validation.go @@ -247,6 +247,7 @@ func ValidateManifest(manifest *ContainerManifest) []error { return []error(allErrs) } +// ValidateService tests if required fields in the service are set. func ValidateService(service *Service) []error { allErrs := errorList{} if service.ID == "" { diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 5bf45fcd0c8..ac4ab99ef47 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -963,7 +963,7 @@ func (kl *Kubelet) statsFromContainerPath(containerPath string) (*api.ContainerS percentiles[i].Percentage = p.Percentage percentiles[i].Value = p.Value } - ret.CpuUsagePercentiles = percentiles + ret.CPUUsagePercentiles = percentiles } if len(info.StatsPercentiles.MemoryUsagePercentiles) > 0 { percentiles := make([]api.Percentile, len(info.StatsPercentiles.MemoryUsagePercentiles)) diff --git a/pkg/kubelet/kubelet_server_test.go b/pkg/kubelet/kubelet_server_test.go index bb00612ba95..38ad6261392 100644 --- a/pkg/kubelet/kubelet_server_test.go +++ b/pkg/kubelet/kubelet_server_test.go @@ -150,7 +150,7 @@ func TestContainerStats(t *testing.T) { fw := makeServerTest() expectedStats := &api.ContainerStats{ MaxMemoryUsage: 1024001, - CpuUsagePercentiles: []api.Percentile{ + CPUUsagePercentiles: []api.Percentile{ {50, 150}, {80, 180}, {90, 190}, @@ -190,7 +190,7 @@ func TestMachineStats(t *testing.T) { fw := makeServerTest() expectedStats := &api.ContainerStats{ MaxMemoryUsage: 1024001, - CpuUsagePercentiles: []api.Percentile{ + CPUUsagePercentiles: []api.Percentile{ {50, 150}, {80, 180}, {90, 190}, diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index a3a74381e19..9f9e9a902b7 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -966,7 +966,7 @@ func TestGetContainerStats(t *testing.T) { {80, 180}, {90, 190}, }, - CpuUsagePercentiles: []info.Percentile{ + CPUUsagePercentiles: []info.Percentile{ {51, 101}, {81, 181}, {91, 191}, @@ -995,7 +995,7 @@ func TestGetContainerStats(t *testing.T) { if stats.MaxMemoryUsage != containerInfo.StatsPercentiles.MaxMemoryUsage { t.Errorf("wrong max memory usage") } - areSamePercentiles(containerInfo.StatsPercentiles.CpuUsagePercentiles, stats.CpuUsagePercentiles, t) + areSamePercentiles(containerInfo.StatsPercentiles.CpuUsagePercentiles, stats.CPUUsagePercentiles, t) areSamePercentiles(containerInfo.StatsPercentiles.MemoryUsagePercentiles, stats.MemoryUsagePercentiles, t) mockCadvisor.AssertExpectations(t) } @@ -1036,7 +1036,7 @@ func TestGetMachineStats(t *testing.T) { if stats.MaxMemoryUsage != containerInfo.StatsPercentiles.MaxMemoryUsage { t.Errorf("wrong max memory usage") } - areSamePercentiles(containerInfo.StatsPercentiles.CpuUsagePercentiles, stats.CpuUsagePercentiles, t) + areSamePercentiles(containerInfo.StatsPercentiles.CpuUsagePercentiles, stats.CPUUsagePercentiles, t) areSamePercentiles(containerInfo.StatsPercentiles.MemoryUsagePercentiles, stats.MemoryUsagePercentiles, t) mockCadvisor.AssertExpectations(t) } @@ -1060,8 +1060,8 @@ func TestGetContainerStatsWithoutCadvisor(t *testing.T) { if stats.MaxMemoryUsage != 0 { t.Errorf("MaxMemoryUsage is %v even if there's no cadvisor", stats.MaxMemoryUsage) } - if len(stats.CpuUsagePercentiles) > 0 { - t.Errorf("Cpu usage percentiles is not empty (%+v) even if there's no cadvisor", stats.CpuUsagePercentiles) + if len(stats.CPUUsagePercentiles) > 0 { + t.Errorf("Cpu usage percentiles is not empty (%+v) even if there's no cadvisor", stats.CPUUsagePercentiles) } if len(stats.MemoryUsagePercentiles) > 0 { t.Errorf("Memory usage percentiles is not empty (%+v) even if there's no cadvisor", stats.MemoryUsagePercentiles) From c6b27bb87d5336ef284315d0f5272b49743345f9 Mon Sep 17 00:00:00 2001 From: Yuki Yugui Sonoda Date: Tue, 15 Jul 2014 22:54:00 +0900 Subject: [PATCH 2/6] Fixes golint errors in pkg/kubecfg --- pkg/kubecfg/resource_printer.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/kubecfg/resource_printer.go b/pkg/kubecfg/resource_printer.go index 39864f75859..52e26278fdc 100644 --- a/pkg/kubecfg/resource_printer.go +++ b/pkg/kubecfg/resource_printer.go @@ -237,10 +237,12 @@ func (h *HumanReadablePrinter) PrintObj(obj interface{}, output io.Writer) error } } +// TemplatePrinter is an implementation of ResourcePrinter which formats data with a Go Template. type TemplatePrinter struct { Template *template.Template } +// Print parses the data as JSON, and re-formats it with the Go Template. func (t *TemplatePrinter) Print(data []byte, w io.Writer) error { obj, err := api.Decode(data) if err != nil { @@ -249,6 +251,7 @@ func (t *TemplatePrinter) Print(data []byte, w io.Writer) error { return t.PrintObj(obj, w) } +// PrintObj formats the obj with the Go Template. func (t *TemplatePrinter) PrintObj(obj interface{}, w io.Writer) error { return t.Template.Execute(w, obj) } From edac5ce0b8a89830fb27d89e488df4a23a49aec0 Mon Sep 17 00:00:00 2001 From: Yuki Yugui Sonoda Date: Tue, 15 Jul 2014 22:54:23 +0900 Subject: [PATCH 3/6] Fixes golint errors in pkg/kubelet --- cmd/kubelet/kubelet.go | 1 + pkg/kubelet/health_check.go | 6 ++++++ pkg/kubelet/kubelet.go | 3 +-- pkg/kubelet/kubelet_server.go | 10 +++++----- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/kubelet/kubelet.go b/cmd/kubelet/kubelet.go index 91e69938bb9..fc558d68f17 100644 --- a/cmd/kubelet/kubelet.go +++ b/cmd/kubelet/kubelet.go @@ -27,6 +27,7 @@ import ( "os/exec" "time" + _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/coreos/go-etcd/etcd" diff --git a/pkg/kubelet/health_check.go b/pkg/kubelet/health_check.go index 62a015df08d..f784b13979a 100644 --- a/pkg/kubelet/health_check.go +++ b/pkg/kubelet/health_check.go @@ -25,14 +25,17 @@ import ( "github.com/golang/glog" ) +// HealthCheckStatus is an enum type which describes a status of health check. type HealthCheckStatus int +// These are the valid values of HealthCheckStatus. const ( CheckHealthy HealthCheckStatus = 0 CheckUnhealthy HealthCheckStatus = 1 CheckUnknown HealthCheckStatus = 2 ) +// HealthChecker hides implementation details of checking health of containers. type HealthChecker interface { HealthCheck(container api.Container) (HealthCheckStatus, error) } @@ -57,6 +60,8 @@ type MuxHealthChecker struct { checkers map[string]HealthChecker } +// HealthCheck delegates the health-checking of the container to one of the bundled implementations. +// It chooses an implementation according to container.LivenessProbe.Type. func (m *MuxHealthChecker) HealthCheck(container api.Container) (HealthCheckStatus, error) { checker, ok := m.checkers[container.LivenessProbe.Type] if !ok || checker == nil { @@ -81,6 +86,7 @@ func (h *HTTPHealthChecker) findPort(container api.Container, portName string) i return -1 } +// HealthCheck checks if the container is healthy by trying sending HTTP Get requests to the container. func (h *HTTPHealthChecker) HealthCheck(container api.Container) (HealthCheckStatus, error) { params := container.LivenessProbe.HTTPGet if params == nil { diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index ac4ab99ef47..9a89f129931 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -34,7 +34,6 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/coreos/go-etcd/etcd" @@ -145,7 +144,7 @@ func (kl *Kubelet) RunKubelet(dockerEndpoint, configPath, manifestURL, etcdServe } if address != "" { glog.Infof("Starting to listen on %s:%d", address, port) - handler := KubeletServer{ + handler := Server{ Kubelet: kl, UpdateChannel: updateChannel, DelegateHandler: http.DefaultServeMux, diff --git a/pkg/kubelet/kubelet_server.go b/pkg/kubelet/kubelet_server.go index adfc13e283e..8dfd68bb909 100644 --- a/pkg/kubelet/kubelet_server.go +++ b/pkg/kubelet/kubelet_server.go @@ -31,8 +31,8 @@ import ( "gopkg.in/v1/yaml" ) -// KubeletServer is a http.Handler which exposes kubelet functionality over HTTP. -type KubeletServer struct { +// Server is a http.Handler which exposes kubelet functionality over HTTP. +type Server struct { Kubelet kubeletInterface UpdateChannel chan<- manifestUpdate DelegateHandler http.Handler @@ -46,11 +46,11 @@ type kubeletInterface interface { GetPodInfo(name string) (api.PodInfo, error) } -func (s *KubeletServer) error(w http.ResponseWriter, err error) { +func (s *Server) error(w http.ResponseWriter, err error) { http.Error(w, fmt.Sprintf("Internal Error: %v", err), http.StatusInternalServerError) } -func (s *KubeletServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { +func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { defer apiserver.MakeLogged(req, &w).Log() u, err := url.ParseRequestURI(req.RequestURI) @@ -110,7 +110,7 @@ func (s *KubeletServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { } } -func (s *KubeletServer) serveStats(w http.ResponseWriter, req *http.Request) { +func (s *Server) serveStats(w http.ResponseWriter, req *http.Request) { // /stats// components := strings.Split(strings.TrimPrefix(path.Clean(req.URL.Path), "/"), "/") var stats *api.ContainerStats From a702be8e635db6bc1bcf93315611abbb7935fd67 Mon Sep 17 00:00:00 2001 From: "Yuki Sonoda (Yugui)" Date: Wed, 16 Jul 2014 18:46:22 +0900 Subject: [PATCH 4/6] Fixes new golint errors in pkg/kubelet after merge --- pkg/kubelet/kubelet.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 9561537666b..6e5bb93f328 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -48,8 +48,8 @@ const defaultChanSize = 1024 // taken from lmctfy https://github.com/google/lmctfy/blob/master/lmctfy/controllers/cpu_controller.cc const minShares = 2 -const sharesPerCpu = 1024 -const milliCpuToCpu = 1000 +const sharesPerCPU = 1024 +const milliCPUToCPU = 1000 // CadvisorInterface is an abstract interface for testability. It abstracts the interface of "github.com/google/cadvisor/client".Client. type CadvisorInterface interface { @@ -274,9 +274,9 @@ func makePortsAndBindings(container *api.Container) (map[docker.Port]struct{}, m return exposedPorts, portBindings } -func milliCpuToShares(milliCpu int) int { - // Conceptually (milliCpu / milliCpuToCpu) * sharesPerCpu, but factored to improve rounding. - shares := (milliCpu * sharesPerCpu) / milliCpuToCpu +func milliCPUToShares(milliCPU int) int { + // Conceptually (milliCPU / milliCPUToCPU) * sharesPerCPU, but factored to improve rounding. + shares := (milliCPU * sharesPerCPU) / milliCPUToCPU if shares < minShares { return minShares } @@ -298,7 +298,7 @@ func (kl *Kubelet) runContainer(manifest *api.ContainerManifest, container *api. Hostname: container.Name, Image: container.Image, Memory: int64(container.Memory), - CpuShares: int64(milliCpuToShares(container.CPU)), + CpuShares: int64(milliCPUToShares(container.CPU)), Volumes: volumes, WorkingDir: container.WorkingDir, }, @@ -864,7 +864,7 @@ func (kl *Kubelet) statsFromContainerPath(containerPath string, req *info.Contai return cinfo, nil } -// GetContainerStats returns stats (from Cadvisor) for a container. +// GetContainerInfo returns stats (from Cadvisor) for a container. func (kl *Kubelet) GetContainerInfo(podID, containerName string, req *info.ContainerInfoRequest) (*info.ContainerInfo, error) { if kl.CadvisorClient == nil { return nil, nil From c1eee00a571fe33c699c7d61523385356cb7433b Mon Sep 17 00:00:00 2001 From: "Yuki Sonoda (Yugui)" Date: Wed, 16 Jul 2014 21:25:51 +0900 Subject: [PATCH 5/6] Correct an error message --- pkg/kubelet/kubelet_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 0d32062f734..dbfb884a323 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -1064,7 +1064,7 @@ func TestGetContainerStatsWithoutCadvisor(t *testing.T) { t.Errorf("MaxMemoryUsage is %v even if there's no cadvisor", stats.StatsPercentiles.MaxMemoryUsage) } if len(stats.StatsPercentiles.CpuUsagePercentiles) > 0 { - t.Errorf("Cpu usage percentiles is not empty (%+v) even if there's no cadvisor", stats.StatsPercentiles.CpuUsagePercentiles) + t.Errorf("CPU usage percentiles is not empty (%+v) even if there's no cadvisor", stats.StatsPercentiles.CpuUsagePercentiles) } if len(stats.StatsPercentiles.MemoryUsagePercentiles) > 0 { t.Errorf("Memory usage percentiles is not empty (%+v) even if there's no cadvisor", stats.StatsPercentiles.MemoryUsagePercentiles) From d2db5cdffc4dfc6b5f9f4c2c01bedb8d47d3e866 Mon Sep 17 00:00:00 2001 From: "Yuki Sonoda (Yugui)" Date: Wed, 16 Jul 2014 21:26:12 +0900 Subject: [PATCH 6/6] Fix a build failure of a test --- pkg/kubelet/kubelet_server_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/kubelet_server_test.go b/pkg/kubelet/kubelet_server_test.go index fce6913be8e..0db9b2f9a4e 100644 --- a/pkg/kubelet/kubelet_server_test.go +++ b/pkg/kubelet/kubelet_server_test.go @@ -53,7 +53,7 @@ func (fk *fakeKubelet) GetMachineStats(req *info.ContainerInfoRequest) (*info.Co type serverTestFramework struct { updateChan chan manifestUpdate updateReader *channelReader - serverUnderTest *KubeletServer + serverUnderTest *Server fakeKubelet *fakeKubelet testHTTPServer *httptest.Server } @@ -64,7 +64,7 @@ func makeServerTest() *serverTestFramework { } fw.updateReader = startReading(fw.updateChan) fw.fakeKubelet = &fakeKubelet{} - fw.serverUnderTest = &KubeletServer{ + fw.serverUnderTest = &Server{ Kubelet: fw.fakeKubelet, UpdateChannel: fw.updateChan, }