From 43a7ed6bb0bd80d6f556d0ba6ba40ab53da1059f Mon Sep 17 00:00:00 2001 From: devinyan Date: Sun, 7 May 2017 22:25:40 +0800 Subject: [PATCH 01/14] github test --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 27da73961..11bbecb4d 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Use Helm to... - Intelligently manage your Kubernetes manifest files - Manage releases of Helm packages + ## Helm in a Handbasket Helm is a tool that streamlines installing and managing Kubernetes applications. From 7096d16fe6b183b872aea90d51fd805d7a2b6112 Mon Sep 17 00:00:00 2001 From: devinyan Date: Sun, 7 May 2017 22:29:12 +0800 Subject: [PATCH 02/14] "helm status" add the filter of kind and instance name. Add the desrcibe of pod. --- _proto/hapi/services/tiller.proto | 4 + cmd/helm/status.go | 11 +- docs/helm/helm_status.md | 3 + pkg/helm/option.go | 4 +- pkg/kube/client.go | 151 +++++++++++++++++++++++--- pkg/kube/result.go | 29 +++++ pkg/tiller/environment/environment.go | 2 +- pkg/tiller/release_modules.go | 6 +- pkg/tiller/release_server.go | 7 +- 9 files changed, 193 insertions(+), 24 deletions(-) diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index f16d68238..53ff6c276 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -154,6 +154,10 @@ message GetReleaseStatusRequest { string name = 1; // Version is the version of the release int32 version = 2; + // Kind is the kind of the resource to display + string kind = 3; + // Instance is the instance of the resource to display + string instance = 4; } // GetReleaseStatusResponse is the response indicating the status of the named release. diff --git a/cmd/helm/status.go b/cmd/helm/status.go index b635e6186..c26edd74e 100644 --- a/cmd/helm/status.go +++ b/cmd/helm/status.go @@ -47,7 +47,9 @@ type statusCmd struct { release string out io.Writer client helm.Interface - version int32 + kind string + instance string + version int32 } func newStatusCmd(client helm.Interface, out io.Writer) *cobra.Command { @@ -73,13 +75,18 @@ func newStatusCmd(client helm.Interface, out io.Writer) *cobra.Command { }, } + cmd.PersistentFlags().StringVar(&status.instance, "instance","","if set, display status of an instance in assigned kind.") + cmd.PersistentFlags().StringVar(&status.kind, "kind","","if set, display status of an assigned kind resource") cmd.PersistentFlags().Int32Var(&status.version, "revision", 0, "if set, display the status of the named release with revision") return cmd } func (s *statusCmd) run() error { - res, err := s.client.ReleaseStatus(s.release, helm.StatusReleaseVersion(s.version)) + + fmt.Printf("Kind=%s,instnace=%s",s.kind,s.instance) + + res, err := s.client.ReleaseStatus(s.release, helm.StatusReleaseVersion(s.version,s.kind,s.instance)) if err != nil { return prettyError(err) } diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 893c3325a..45ff700ef 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -29,6 +29,9 @@ helm status [flags] RELEASE_NAME --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") --tls-verify enable TLS for request and verify remote + --kind string if set, display status of an assigned kind resource (The kind of resorce is kubeneters + resource such as : service,ingress,deployment,pod,replicaset and so on) + --instance string if set, display status of an instance in assigned kind.(The paramater must along with "--kind") ``` ### Options inherited from parent commands diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 0604e244a..d04d6d91b 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -371,9 +371,11 @@ type StatusOption func(*options) // StatusReleaseVersion will instruct Tiller to retrieve the status // of a particular version of a release. -func StatusReleaseVersion(version int32) StatusOption { +func StatusReleaseVersion(version int32,kind string,instance string) StatusOption { return func(opts *options) { opts.statusReq.Version = version + opts.statusReq.Kind = kind + opts.statusReq.Instance = instance } } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 333e3ab37..875444b01 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -145,32 +145,65 @@ func (c *Client) Build(namespace string, reader io.Reader) (Result, error) { // Get gets kubernetes resources as pretty printed string // // Namespace will set the namespace -func (c *Client) Get(namespace string, reader io.Reader) (string, error) { +func (c *Client) Get(namespace string, reader io.Reader, filter FilterStruct) (string, error) { // Since we don't know what order the objects come in, let's group them by the types, so // that when we print them, they come looking good (headers apply to subgroups, etc.) objs := make(map[string][]runtime.Object) - infos, err := c.BuildUnstructured(namespace, reader) + + infoAllKinds, err := c.BuildUnstructured(namespace, reader) if err != nil { return "", err } + + infos := infoAllKinds.Filter(filter.Filter) + + var objPods map[string][]api.Pod + if (!filter.IsFilter()) || filter.IsPodType() { + objPods = c.getRelationPods(infoAllKinds) + } + + log.Printf("objPods %+v\n", objPods) + missing := []string{} - err = perform(infos, func(info *resource.Info) error { - log.Printf("Doing get for %s: %q", info.Mapping.GroupVersionKind.Kind, info.Name) - if err := info.Get(); err != nil { - log.Printf("WARNING: Failed Get for resource %q: %s", info.Name, err) - missing = append(missing, fmt.Sprintf("%v\t\t%s", info.Mapping.Resource, info.Name)) + if len(infos) !=0 { + err = perform(infos, func(info *resource.Info) error { + + if err := info.Get(); err != nil { + log.Printf("WARNING: Failed Get for resource %q: %s", info.Name, err) + missing = append(missing, fmt.Sprintf("%v\t\t%s", info.Mapping.Resource, info.Name)) + return nil + } + + // Use APIVersion/Kind as grouping mechanism. I'm not sure if you can have multiple + // versions per cluster, but this certainly won't hurt anything, so let's be safe. + gvk := info.ResourceMapping().GroupVersionKind + vk := gvk.Version + "/" + gvk.Kind + + if gvk.Kind != "Pod" { + objs[vk] = append(objs[vk], info.Object) + } else { + if !IsFoundPodInfo(objPods[vk], info) { + objs[vk] = append(objs[vk], info.Object) + } + } return nil + }) + if err != nil { + return "", err + } + }else{ + if !filter.IsFilter(){ + return "",ErrNoObjectsVisited + }else if (!filter.IsPodType()) || (len(objPods) == 0) { + return "",nil } + } - // Use APIVersion/Kind as grouping mechanism. I'm not sure if you can have multiple - // versions per cluster, but this certainly won't hurt anything, so let's be safe. - gvk := info.ResourceMapping().GroupVersionKind - vk := gvk.Version + "/" + gvk.Kind - objs[vk] = append(objs[vk], info.Object) - return nil - }) - if err != nil { - return "", err + //here, we will add the objPods to the objs + for key,podItems := range objPods{ + for _,pod := range podItems { + objs[key] = append(objs[key],&pod) + } } // Ok, now we have all the objects grouped by types (say, by v1/Pod, v1/Service, etc.), so @@ -595,3 +628,89 @@ func watchPodUntilComplete(timeout time.Duration, info *resource.Info) error { return err } + +func (c *Client) getRelationPods(infos []*resource.Info)(map[string][]api.Pod){ + var objPods = make(map[string][]api.Pod) + + for _, value := range infos { + objPods , _ = c.getSelectRelationPod(value,objPods) + } + return objPods +} + +func (c *Client) getSelectRelationPod(info *resource.Info,objPods map[string][]api.Pod)(map[string][]api.Pod,error){ + log.Printf("1222getSelectRelationPod Info: %+v",info) + log.Printf("222222getSelectRelationPod object: %+v",info.Object) + + err := info.Get() + if err != nil { + return objPods, err + } + + log.Printf("getSelectRelationPod object: %+v",info.Object) + + versioned, err := c.AsVersionedObject(info.Object) + if runtime.IsNotRegisteredError(err) { + return objPods,nil + } + if err != nil { + return objPods,err + } + + selector, err := getSelectorFromObject(versioned) + + log.Printf("getSelectRelationPod selector: %+v",selector) + if err != nil { + return objPods,err + } + client, _ := c.ClientSet() + + pods, err := client.Core().Pods(info.Namespace).List(metav1.ListOptions{ + FieldSelector: fields.Everything().String(), + LabelSelector: labels.Set(selector).AsSelector().String(), + }) + if err != nil { + return objPods,err + } + + for _, pod := range pods.Items { + + log.Printf("get select relation pod: %v/%v", pod.Namespace, pod.Name) + + if pod.APIVersion == "" { + pod.APIVersion = "v1" + } + + if pod.Kind == "" { + pod.Kind = "Pod" + } + + vk := pod.GroupVersionKind().Version + "/" + pod.GroupVersionKind().Kind + + if !IsFoundPod(objPods[vk], pod) { + objPods[vk] = append(objPods[vk], pod) + } + } + + return objPods,nil +} + +func IsFoundPod(podItem []api.Pod,pod api.Pod) bool { + for _,value := range podItem { + if (value.Namespace == pod.Namespace) && (value.Name==pod.Name) { + return true + } + } + + return false +} +func IsFoundPodInfo(podItem []api.Pod,podInfo *resource.Info) bool { + for _, value := range podItem { + if (value.Namespace == podInfo.Namespace) && (value.Name == podInfo.Name) { + return true + } + } + return false +} + + diff --git a/pkg/kube/result.go b/pkg/kube/result.go index 9f143feb5..8be71b3f9 100644 --- a/pkg/kube/result.go +++ b/pkg/kube/result.go @@ -21,6 +21,35 @@ import "k8s.io/kubernetes/pkg/kubectl/resource" // Result provides convenience methods for comparing collections of Infos. type Result []*resource.Info +type FilterStruct struct { + Kind string + Instance string +} + +func (fs *FilterStruct) Filter (info *resource.Info) bool{ + if info != nil { + if (fs.Kind == "") || (fs.Kind == info.Mapping.GroupVersionKind.Kind) { + if (fs.Instance == "") || (fs.Instance == info.Name) { + return true + } + } + } + return false +} +func (fs *FilterStruct) IsFilter() bool{ + if (fs.Kind == "") && (fs.Instance == "") { + return false + } + return true +} + +func (fs *FilterStruct) IsPodType() bool { + if (fs.Kind == "Pod") { + return true + } + return false +} + // Append adds an Info to the Result. func (r *Result) Append(val *resource.Info) { *r = append(*r, val) diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index 26516474b..b277b4e9e 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -123,7 +123,7 @@ type KubeClient interface { // // reader must contain a YAML stream (one or more YAML documents separated // by "\n---\n"). - Get(namespace string, reader io.Reader) (string, error) + Get(namespace string, reader io.Reader, filter kube.FilterStruct) (string, error) // Delete destroys one or more resources. // diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index e13b26de9..319a335e1 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -70,8 +70,8 @@ func (m *LocalReleaseModule) Rollback(current, target *release.Release, req *ser } // Status returns kubectl-like formatted status of release objects -func (m *LocalReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) { - return env.KubeClient.Get(r.Namespace, bytes.NewBufferString(r.Manifest)) +func (m *LocalReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment, filter kube.FilterStruct) (string, error) { + return env.KubeClient.Get(r.Namespace, bytes.NewBufferString(r.Manifest),filter) } // Delete deletes the release and returns manifests that were kept in the deletion process @@ -120,7 +120,7 @@ func (m *RemoteReleaseModule) Rollback(current, target *release.Release, req *se } // Status returns status retrieved from rudder.ReleaseStatus -func (m *RemoteReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) { +func (m *RemoteReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment, filter kube.FilterStruct) (string, error) { statusRequest := &rudderAPI.ReleaseStatusRequest{Release: r} resp, err := rudder.ReleaseStatus(statusRequest) return resp.Info.Status.Resources, err diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index adc4ddf3c..5be7343ea 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -41,6 +41,7 @@ import ( "k8s.io/helm/pkg/tiller/environment" "k8s.io/helm/pkg/timeconv" "k8s.io/helm/pkg/version" + "k8s.io/helm/pkg/kube" ) // releaseNameMaxLen is the maximum length of a release name. @@ -261,9 +262,13 @@ func (s *ReleaseServer) GetReleaseStatus(c ctx.Context, req *services.GetRelease Info: rel.Info, } + + var filter kube.FilterStruct = kube.FilterStruct{Kind:req.Kind,Instance:req.Instance} + // Ok, we got the status of the release as we had jotted down, now we need to match the // manifest we stashed away with reality from the cluster. - resp, err := s.ReleaseModule.Status(rel, req, s.env) + resp, err := s.ReleaseModule.Status(rel, req, s.env,filter) + if sc == release.Status_DELETED || sc == release.Status_FAILED { // Skip errors if this is already deleted or failed. return statusResp, nil From 8054f970ae21bbc9699a23318d7b82497b4bf4b8 Mon Sep 17 00:00:00 2001 From: devinyan Date: Sun, 7 May 2017 22:55:47 +0800 Subject: [PATCH 03/14] ci bugfix --- pkg/proto/hapi/services/tiller.pb.go | 4 ++++ pkg/tiller/release_modules.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index d3f8676fc..52fec8968 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -248,6 +248,10 @@ type GetReleaseStatusRequest struct { Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` // Version is the version of the release Version int32 `protobuf:"varint,2,opt,name=version" json:"version,omitempty"` + // Kind is the kind of the resource to display + Kind string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` + // Instance is the instance of the resource to display + Instance string `protobuf:"bytes,4,opt,name=instance" json:"instance,omitempty"` } func (m *GetReleaseStatusRequest) Reset() { *m = GetReleaseStatusRequest{} } diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 319a335e1..0a97abebe 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -40,7 +40,7 @@ type ReleaseModule interface { Create(r *release.Release, req *services.InstallReleaseRequest, env *environment.Environment) error Update(current, target *release.Release, req *services.UpdateReleaseRequest, env *environment.Environment) error Rollback(current, target *release.Release, req *services.RollbackReleaseRequest, env *environment.Environment) error - Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) + Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment,filter kube.FilterStruct) (string, error) Delete(r *release.Release, req *services.UninstallReleaseRequest, env *environment.Environment) (string, []error) } From 2bde5a0e75842b559fb6e757604eb4915c772c74 Mon Sep 17 00:00:00 2001 From: devinyan Date: Sun, 7 May 2017 23:46:51 +0800 Subject: [PATCH 04/14] ci debug fix 2 --- cmd/rudder/rudder.go | 4 ++-- pkg/rudder/client.go | 5 +++-- pkg/tiller/release_modules.go | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cmd/rudder/rudder.go b/cmd/rudder/rudder.go index 0a5a97bff..800678c76 100644 --- a/cmd/rudder/rudder.go +++ b/cmd/rudder/rudder.go @@ -126,10 +126,10 @@ func (r *ReleaseModuleServiceServer) UpgradeRelease(ctx context.Context, in *rud return &rudderAPI.UpgradeReleaseResponse{}, err } -func (r *ReleaseModuleServiceServer) ReleaseStatus(ctx context.Context, in *rudderAPI.ReleaseStatusRequest) (*rudderAPI.ReleaseStatusResponse, error) { +func (r *ReleaseModuleServiceServer) ReleaseStatus(ctx context.Context, in *rudderAPI.ReleaseStatusRequest, filter kube.FilterStruct) (*rudderAPI.ReleaseStatusResponse, error) { grpclog.Print("status") - resp, err := kubeClient.Get(in.Release.Namespace, bytes.NewBufferString(in.Release.Manifest)) + resp, err := kubeClient.Get(in.Release.Namespace, bytes.NewBufferString(in.Release.Manifest),filter) in.Release.Info.Status.Resources = resp return &rudderAPI.ReleaseStatusResponse{ Release: in.Release, diff --git a/pkg/rudder/client.go b/pkg/rudder/client.go index 219bb010a..dd957eb0f 100644 --- a/pkg/rudder/client.go +++ b/pkg/rudder/client.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc" rudderAPI "k8s.io/helm/pkg/proto/hapi/rudder" + "k8s.io/helm/pkg/kube" ) // GrpcPort specifies port on which rudder will spawn a server @@ -68,14 +69,14 @@ func RollbackRelease(req *rudderAPI.RollbackReleaseRequest) (*rudderAPI.Rollback } // ReleaseStatus calls Rudder ReleaseStatus method which should perform update -func ReleaseStatus(req *rudderAPI.ReleaseStatusRequest) (*rudderAPI.ReleaseStatusResponse, error) { +func ReleaseStatus(req *rudderAPI.ReleaseStatusRequest, filter kube.FilterStruct) (*rudderAPI.ReleaseStatusResponse, error) { conn, err := grpc.Dial(grpcAddr, grpc.WithInsecure()) if err != nil { return nil, err } defer conn.Close() client := rudderAPI.NewReleaseModuleServiceClient(conn) - return client.ReleaseStatus(context.Background(), req) + return client.ReleaseStatus(context.Background(), req,filter) } // DeleteRelease calls Rudder DeleteRelease method which should uninstall provided release diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index 0a97abebe..e59abd136 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -122,7 +122,7 @@ func (m *RemoteReleaseModule) Rollback(current, target *release.Release, req *se // Status returns status retrieved from rudder.ReleaseStatus func (m *RemoteReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment, filter kube.FilterStruct) (string, error) { statusRequest := &rudderAPI.ReleaseStatusRequest{Release: r} - resp, err := rudder.ReleaseStatus(statusRequest) + resp, err := rudder.ReleaseStatus(statusRequest,filter) return resp.Info.Status.Resources, err } From 9f4299e57a297fd2f707dd7934678638408e97c8 Mon Sep 17 00:00:00 2001 From: devinyan Date: Mon, 8 May 2017 10:41:19 +0800 Subject: [PATCH 05/14] bug fix 3 --- cmd/rudder/rudder.go | 3 ++- pkg/rudder/client.go | 6 +++--- pkg/tiller/release_modules.go | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cmd/rudder/rudder.go b/cmd/rudder/rudder.go index 800678c76..836a0452e 100644 --- a/cmd/rudder/rudder.go +++ b/cmd/rudder/rudder.go @@ -126,8 +126,9 @@ func (r *ReleaseModuleServiceServer) UpgradeRelease(ctx context.Context, in *rud return &rudderAPI.UpgradeReleaseResponse{}, err } -func (r *ReleaseModuleServiceServer) ReleaseStatus(ctx context.Context, in *rudderAPI.ReleaseStatusRequest, filter kube.FilterStruct) (*rudderAPI.ReleaseStatusResponse, error) { +func (r *ReleaseModuleServiceServer) ReleaseStatus(ctx context.Context, in *rudderAPI.ReleaseStatusRequest) (*rudderAPI.ReleaseStatusResponse, error) { grpclog.Print("status") + var filter kube.FilterStruct = kube.FilterStruct{Kind:"",Instance:""} resp, err := kubeClient.Get(in.Release.Namespace, bytes.NewBufferString(in.Release.Manifest),filter) in.Release.Info.Status.Resources = resp diff --git a/pkg/rudder/client.go b/pkg/rudder/client.go index dd957eb0f..6b7408f90 100644 --- a/pkg/rudder/client.go +++ b/pkg/rudder/client.go @@ -23,7 +23,7 @@ import ( "google.golang.org/grpc" rudderAPI "k8s.io/helm/pkg/proto/hapi/rudder" - "k8s.io/helm/pkg/kube" + ) // GrpcPort specifies port on which rudder will spawn a server @@ -69,14 +69,14 @@ func RollbackRelease(req *rudderAPI.RollbackReleaseRequest) (*rudderAPI.Rollback } // ReleaseStatus calls Rudder ReleaseStatus method which should perform update -func ReleaseStatus(req *rudderAPI.ReleaseStatusRequest, filter kube.FilterStruct) (*rudderAPI.ReleaseStatusResponse, error) { +func ReleaseStatus(req *rudderAPI.ReleaseStatusRequest) (*rudderAPI.ReleaseStatusResponse, error) { conn, err := grpc.Dial(grpcAddr, grpc.WithInsecure()) if err != nil { return nil, err } defer conn.Close() client := rudderAPI.NewReleaseModuleServiceClient(conn) - return client.ReleaseStatus(context.Background(), req,filter) + return client.ReleaseStatus(context.Background(), req) } // DeleteRelease calls Rudder DeleteRelease method which should uninstall provided release diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index e59abd136..c06241a45 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -120,9 +120,9 @@ func (m *RemoteReleaseModule) Rollback(current, target *release.Release, req *se } // Status returns status retrieved from rudder.ReleaseStatus -func (m *RemoteReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment, filter kube.FilterStruct) (string, error) { +func (m *RemoteReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) { statusRequest := &rudderAPI.ReleaseStatusRequest{Release: r} - resp, err := rudder.ReleaseStatus(statusRequest,filter) + resp, err := rudder.ReleaseStatus(statusRequest) return resp.Info.Status.Resources, err } From 3352a3bde7843ff93f5578f080068c82bc96a365 Mon Sep 17 00:00:00 2001 From: devinyan Date: Mon, 8 May 2017 11:07:35 +0800 Subject: [PATCH 06/14] ci bug fix 4 --- pkg/tiller/release_modules.go | 6 ++++-- pkg/tiller/release_server.go | 5 +---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pkg/tiller/release_modules.go b/pkg/tiller/release_modules.go index c06241a45..35b8e72be 100644 --- a/pkg/tiller/release_modules.go +++ b/pkg/tiller/release_modules.go @@ -40,7 +40,7 @@ type ReleaseModule interface { Create(r *release.Release, req *services.InstallReleaseRequest, env *environment.Environment) error Update(current, target *release.Release, req *services.UpdateReleaseRequest, env *environment.Environment) error Rollback(current, target *release.Release, req *services.RollbackReleaseRequest, env *environment.Environment) error - Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment,filter kube.FilterStruct) (string, error) + Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) Delete(r *release.Release, req *services.UninstallReleaseRequest, env *environment.Environment) (string, []error) } @@ -70,7 +70,9 @@ func (m *LocalReleaseModule) Rollback(current, target *release.Release, req *ser } // Status returns kubectl-like formatted status of release objects -func (m *LocalReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment, filter kube.FilterStruct) (string, error) { +func (m *LocalReleaseModule) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) { + var filter kube.FilterStruct = kube.FilterStruct{Kind:req.Kind,Instance:req.Instance} + return env.KubeClient.Get(r.Namespace, bytes.NewBufferString(r.Manifest),filter) } diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 5be7343ea..6179d7525 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -262,12 +262,9 @@ func (s *ReleaseServer) GetReleaseStatus(c ctx.Context, req *services.GetRelease Info: rel.Info, } - - var filter kube.FilterStruct = kube.FilterStruct{Kind:req.Kind,Instance:req.Instance} - // Ok, we got the status of the release as we had jotted down, now we need to match the // manifest we stashed away with reality from the cluster. - resp, err := s.ReleaseModule.Status(rel, req, s.env,filter) + resp, err := s.ReleaseModule.Status(rel, req, s.env) if sc == release.Status_DELETED || sc == release.Status_FAILED { // Skip errors if this is already deleted or failed. From 29e947fdcacfa5e7b3fd1b9e44aae34253b7b2bb Mon Sep 17 00:00:00 2001 From: devinyan Date: Mon, 8 May 2017 11:12:20 +0800 Subject: [PATCH 07/14] bug fix 5 --- pkg/tiller/release_server.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index 6179d7525..3bb86a170 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -41,7 +41,6 @@ import ( "k8s.io/helm/pkg/tiller/environment" "k8s.io/helm/pkg/timeconv" "k8s.io/helm/pkg/version" - "k8s.io/helm/pkg/kube" ) // releaseNameMaxLen is the maximum length of a release name. From bc0ea9708240c6c4cfc4acc806e961e42405bee3 Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 15:15:53 +0800 Subject: [PATCH 08/14] Edit the docs/helm/helm_status.md --- docs/helm/helm_status.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 45ff700ef..580dc56eb 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -23,15 +23,14 @@ helm status [flags] RELEASE_NAME ### Options ``` + --instance string if set, display status of an instance in assigned kind. + --kind string if set, display status of an assigned kind resource --revision int32 if set, display the status of the named release with revision --tls enable TLS for request --tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem") --tls-cert string path to TLS certificate file (default "$HELM_HOME/cert.pem") --tls-key string path to TLS key file (default "$HELM_HOME/key.pem") --tls-verify enable TLS for request and verify remote - --kind string if set, display status of an assigned kind resource (The kind of resorce is kubeneters - resource such as : service,ingress,deployment,pod,replicaset and so on) - --instance string if set, display status of an instance in assigned kind.(The paramater must along with "--kind") ``` ### Options inherited from parent commands From b1d86479c6a2a9ab54ce27542f868ff6c845f53c Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 15:43:30 +0800 Subject: [PATCH 09/14] CI test bug fixed --- pkg/helm/helm_test.go | 2 +- pkg/kube/client_test.go | 5 +++-- pkg/releasetesting/environment_test.go | 6 ++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/helm/helm_test.go b/pkg/helm/helm_test.go index bcaeec2f0..1ae5b33bf 100644 --- a/pkg/helm/helm_test.go +++ b/pkg/helm/helm_test.go @@ -285,7 +285,7 @@ func TestReleaseStatus_VerifyOptions(t *testing.T) { return errSkip }) - if _, err := NewClient(b4c).ReleaseStatus(releaseName, StatusReleaseVersion(revision)); err != errSkip { + if _, err := NewClient(b4c).ReleaseStatus(releaseName, StatusReleaseVersion(revision,"","")); err != errSkip { t.Fatalf("did not expect error but got (%v)\n``", err) } } diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 1f2032bb2..623cc86f6 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -323,8 +323,9 @@ func TestGet(t *testing.T) { c := &Client{Factory: f} // Test Success + var filter FilterStruct data := strings.NewReader("kind: Pod\napiVersion: v1\nmetadata:\n name: otter") - o, err := c.Get("default", data) + o, err := c.Get("default", data,filter) if err != nil { t.Errorf("Expected missing results, got %q", err) } @@ -334,7 +335,7 @@ func TestGet(t *testing.T) { // Test failure data = strings.NewReader("kind: Pod\napiVersion: v1\nmetadata:\n name: starfish") - o, err = c.Get("default", data) + o, err = c.Get("default", data,filter) if err != nil { t.Errorf("Expected missing results, got %q", err) } diff --git a/pkg/releasetesting/environment_test.go b/pkg/releasetesting/environment_test.go index deb8617f6..d0cc3165a 100644 --- a/pkg/releasetesting/environment_test.go +++ b/pkg/releasetesting/environment_test.go @@ -23,6 +23,7 @@ import ( "os" "testing" + "k8s.io/helm/pkg/kube" "k8s.io/helm/pkg/proto/hapi/release" tillerEnv "k8s.io/helm/pkg/tiller/environment" ) @@ -68,8 +69,9 @@ func TestDeleteTestPods(t *testing.T) { t.Errorf("Expected 0 errors, got at least one: %v", stream.messages) } + var filter kube.FilterStruct for _, testManifest := range mockTestSuite.TestManifests { - if _, err := mockTestEnv.KubeClient.Get(mockTestEnv.Namespace, bytes.NewBufferString(testManifest)); err == nil { + if _, err := mockTestEnv.KubeClient.Get(mockTestEnv.Namespace, bytes.NewBufferString(testManifest),filter); err == nil { t.Error("Expected error, got nil") } } @@ -122,7 +124,7 @@ func newGetFailingKubeClient() *getFailingKubeClient { } } -func (p *getFailingKubeClient) Get(ns string, r io.Reader) (string, error) { +func (p *getFailingKubeClient) Get(ns string, r io.Reader,filter kube.FilterStruct) (string, error) { return "", errors.New("In the end, they did not find Nemo.") } From 43714213742e6ba20c09ae8d3ab6c472e28bb89e Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 15:55:11 +0800 Subject: [PATCH 10/14] ci test fixed 2 --- pkg/tiller/environment/environment.go | 2 +- pkg/tiller/environment/environment_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index b277b4e9e..da7944415 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -170,7 +170,7 @@ func (p *PrintingKubeClient) Create(ns string, r io.Reader, timeout int64, shoul } // Get prints the values of what would be created with a real KubeClient. -func (p *PrintingKubeClient) Get(ns string, r io.Reader) (string, error) { +func (p *PrintingKubeClient) Get(ns string, r io.Reader,filter kube.FilterStruct) (string, error) { _, err := io.Copy(p.Out, r) return "", err } diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 716836438..122bc32ec 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -42,7 +42,7 @@ type mockKubeClient struct{} func (k *mockKubeClient) Create(ns string, r io.Reader, timeout int64, shouldWait bool) error { return nil } -func (k *mockKubeClient) Get(ns string, r io.Reader) (string, error) { +func (k *mockKubeClient) Get(ns string, r io.Reader,filter kube.FilterStruct) (string, error) { return "", nil } func (k *mockKubeClient) Delete(ns string, r io.Reader) error { From a357a1ce7092b1cba9c0aece8539674f8bbf099e Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 21:51:38 +0800 Subject: [PATCH 11/14] ci doc bug fixed --- scripts/completions.bash | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/completions.bash b/scripts/completions.bash index be9ca298b..ec75c7a7e 100644 --- a/scripts/completions.bash +++ b/scripts/completions.bash @@ -1367,6 +1367,8 @@ _helm_status() flags_with_completion=() flags_completion=() + flags+=("--instance=") + flags+=("--kind=") flags+=("--revision=") flags+=("--tls") local_nonpersistent_flags+=("--tls") From b0f369c1c20fed315b8d4fa7149aff6fb3844ac4 Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 22:03:11 +0800 Subject: [PATCH 12/14] ci doc bug fix 2 --- docs/man/man1/helm_status.1 | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/man/man1/helm_status.1 b/docs/man/man1/helm_status.1 index 380ef03a8..eeae31850 100644 --- a/docs/man/man1/helm_status.1 +++ b/docs/man/man1/helm_status.1 @@ -1,6 +1,4 @@ -.TH "HELM" "1" "Apr 2017" "Auto generated by spf13/cobra" "" -.nh -.ad l +.TH "HELM" "1" "May 2017" "Auto generated by spf13/cobra" "" "" .SH NAME @@ -26,6 +24,14 @@ The status consists of: .SH OPTIONS +.PP +\fB\-\-instance\fP="" + if set, display status of an instance in assigned kind. + +.PP +\fB\-\-kind\fP="" + if set, display status of an assigned kind resource + .PP \fB\-\-revision\fP=0 if set, display the status of the named release with revision @@ -80,4 +86,4 @@ The status consists of: .SH HISTORY .PP -16\-Apr\-2017 Auto generated by spf13/cobra +9\-May\-2017 Auto generated by spf13/cobra From 979e6f032c436e32f70f2ddf83e183f489aa9afd Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 22:14:38 +0800 Subject: [PATCH 13/14] bug fix 3 --- docs/man/man1/helm_status.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/man/man1/helm_status.1 b/docs/man/man1/helm_status.1 index eeae31850..8af58771c 100644 --- a/docs/man/man1/helm_status.1 +++ b/docs/man/man1/helm_status.1 @@ -1,4 +1,4 @@ -.TH "HELM" "1" "May 2017" "Auto generated by spf13/cobra" "" "" +.TH "HELM" "1" "Apr 2017" "Auto generated by spf13/cobra" "" .SH NAME @@ -86,4 +86,4 @@ The status consists of: .SH HISTORY .PP -9\-May\-2017 Auto generated by spf13/cobra +16\-Apr\-2017 Auto generated by spf13/cobra From 3fb274ad9bf79478435478d677b6fdf6bc67d9aa Mon Sep 17 00:00:00 2001 From: devinyan Date: Tue, 9 May 2017 22:29:55 +0800 Subject: [PATCH 14/14] update date --- docs/helm/helm_status.md | 2 +- docs/man/man1/helm_status.1 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/helm/helm_status.md b/docs/helm/helm_status.md index 580dc56eb..3fb2508e6 100644 --- a/docs/helm/helm_status.md +++ b/docs/helm/helm_status.md @@ -46,4 +46,4 @@ helm status [flags] RELEASE_NAME ### SEE ALSO * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 16-Apr-2017 +###### Auto generated by spf13/cobra on 9-May-2017 diff --git a/docs/man/man1/helm_status.1 b/docs/man/man1/helm_status.1 index 8af58771c..eeae31850 100644 --- a/docs/man/man1/helm_status.1 +++ b/docs/man/man1/helm_status.1 @@ -1,4 +1,4 @@ -.TH "HELM" "1" "Apr 2017" "Auto generated by spf13/cobra" "" +.TH "HELM" "1" "May 2017" "Auto generated by spf13/cobra" "" "" .SH NAME @@ -86,4 +86,4 @@ The status consists of: .SH HISTORY .PP -16\-Apr\-2017 Auto generated by spf13/cobra +9\-May\-2017 Auto generated by spf13/cobra