diff --git a/_proto/hapi/services/tiller.proto b/_proto/hapi/services/tiller.proto index d58c323d6..7ea3b5c9f 100644 --- a/_proto/hapi/services/tiller.proto +++ b/_proto/hapi/services/tiller.proto @@ -352,6 +352,8 @@ message TestReleaseRequest { bool parallel = 4; // maximum number of test pods to run in parallel uint32 max_parallel = 5; + // logs specifies whether or not to dump the logs from the test pods + bool logs = 6; } // TestReleaseResponse represents a message from executing a test diff --git a/cmd/helm/release_testing.go b/cmd/helm/release_testing.go index a0bf0b87c..2dc740aa8 100644 --- a/cmd/helm/release_testing.go +++ b/cmd/helm/release_testing.go @@ -41,6 +41,7 @@ type releaseTestCmd struct { cleanup bool parallel bool maxParallel uint32 + logs bool } func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { @@ -71,6 +72,7 @@ func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command { f.BoolVar(&rlsTest.cleanup, "cleanup", false, "Delete test pods upon completion") f.BoolVar(&rlsTest.parallel, "parallel", false, "Run test pods in parallel") f.Uint32Var(&rlsTest.maxParallel, "max", 20, "Maximum number of test pods to run in parallel") + f.BoolVar(&rlsTest.logs, "logs", false, "Dump the logs from test pods (this runs after all tests are complete, but before any cleanup") // set defaults from environment settings.InitTLS(f) @@ -85,6 +87,7 @@ func (t *releaseTestCmd) run() (err error) { helm.ReleaseTestCleanup(t.cleanup), helm.ReleaseTestParallel(t.parallel), helm.ReleaseTestMaxParallel(t.maxParallel), + helm.ReleaseTestLogs(t.logs), ) testErr := &testErr{} diff --git a/docs/helm/helm_test.md b/docs/helm/helm_test.md index dc141bb6e..b94948734 100644 --- a/docs/helm/helm_test.md +++ b/docs/helm/helm_test.md @@ -20,6 +20,7 @@ helm test [RELEASE] [flags] ``` --cleanup Delete test pods upon completion -h, --help help for test + --logs Dump the logs from test pods (this runs after all tests are complete, but before any cleanup --max uint32 Maximum number of test pods to run in parallel (default 20) --parallel Run test pods in parallel --timeout int Time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300) @@ -47,4 +48,4 @@ helm test [RELEASE] [flags] * [helm](helm.md) - The Helm package manager for Kubernetes. -###### Auto generated by spf13/cobra on 25-Jul-2019 +###### Auto generated by spf13/cobra on 8-Oct-2019 diff --git a/pkg/helm/option.go b/pkg/helm/option.go index 1374f53a7..1eb0f133c 100644 --- a/pkg/helm/option.go +++ b/pkg/helm/option.go @@ -241,6 +241,13 @@ func ReleaseTestMaxParallel(max uint32) ReleaseTestOption { } } +// ReleaseTestLogs is a boolean value representing whether to dump the logs from test pods +func ReleaseTestLogs(logs bool) ReleaseTestOption { + return func(opts *options) { + opts.testReq.Logs = logs + } +} + // RollbackTimeout specifies the number of seconds before kubernetes calls timeout func RollbackTimeout(timeout int64) RollbackOption { return func(opts *options) { diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 4d181d1ed..0d2ca20e6 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -31,7 +31,7 @@ import ( "k8s.io/apimachinery/pkg/api/meta" - "github.com/evanphx/json-patch" + jsonpatch "github.com/evanphx/json-patch" appsv1 "k8s.io/api/apps/v1" appsv1beta1 "k8s.io/api/apps/v1beta1" appsv1beta2 "k8s.io/api/apps/v1beta2" @@ -935,7 +935,7 @@ func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, } func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Info) error { - lw := cachetools.NewListWatchFromClient(info.Client, info.Mapping.Resource.Resource, info.Namespace, fields.Everything()) + lw := cachetools.NewListWatchFromClient(info.Client, info.Mapping.Resource.Resource, info.Namespace, fields.ParseSelectorOrDie(fmt.Sprintf("metadata.name=%s", info.Name))) c.Log("Watching pod %s for completion with timeout of %v", info.Name, timeout) ctx, cancel := watchtools.ContextWithOptionalTimeout(context.Background(), timeout) @@ -947,6 +947,20 @@ func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Inf return err } +// GetPodLogs takes pod name and namespace and returns the current logs (streaming is NOT enabled). +func (c *Client) GetPodLogs(name, ns string) (io.ReadCloser, error) { + client, err := c.KubernetesClientSet() + if err != nil { + return nil, err + } + req := client.CoreV1().Pods(ns).GetLogs(name, &v1.PodLogOptions{}) + logReader, err := req.Stream() + if err != nil { + return nil, fmt.Errorf("error in opening log stream, got: %s", err) + } + return logReader, nil +} + func isPodComplete(event watch.Event) (bool, error) { o, ok := event.Object.(*v1.Pod) if !ok { diff --git a/pkg/proto/hapi/services/tiller.pb.go b/pkg/proto/hapi/services/tiller.pb.go index 03503fdcc..220accc2a 100644 --- a/pkg/proto/hapi/services/tiller.pb.go +++ b/pkg/proto/hapi/services/tiller.pb.go @@ -53,7 +53,7 @@ func (x ListSort_SortBy) String() string { return proto.EnumName(ListSort_SortBy_name, int32(x)) } func (ListSort_SortBy) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{1, 0} + return fileDescriptor_tiller_0094511522f6b040, []int{1, 0} } // SortOrder defines sort orders to augment sorting operations. @@ -77,7 +77,7 @@ func (x ListSort_SortOrder) String() string { return proto.EnumName(ListSort_SortOrder_name, int32(x)) } func (ListSort_SortOrder) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{1, 1} + return fileDescriptor_tiller_0094511522f6b040, []int{1, 1} } // ListReleasesRequest requests a list of releases. @@ -114,7 +114,7 @@ func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } func (*ListReleasesRequest) ProtoMessage() {} func (*ListReleasesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{0} + return fileDescriptor_tiller_0094511522f6b040, []int{0} } func (m *ListReleasesRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListReleasesRequest.Unmarshal(m, b) @@ -194,7 +194,7 @@ func (m *ListSort) Reset() { *m = ListSort{} } func (m *ListSort) String() string { return proto.CompactTextString(m) } func (*ListSort) ProtoMessage() {} func (*ListSort) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{1} + return fileDescriptor_tiller_0094511522f6b040, []int{1} } func (m *ListSort) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListSort.Unmarshal(m, b) @@ -234,7 +234,7 @@ func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } func (*ListReleasesResponse) ProtoMessage() {} func (*ListReleasesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{2} + return fileDescriptor_tiller_0094511522f6b040, []int{2} } func (m *ListReleasesResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_ListReleasesResponse.Unmarshal(m, b) @@ -297,7 +297,7 @@ func (m *GetReleaseStatusRequest) Reset() { *m = GetReleaseStatusRequest func (m *GetReleaseStatusRequest) String() string { return proto.CompactTextString(m) } func (*GetReleaseStatusRequest) ProtoMessage() {} func (*GetReleaseStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{3} + return fileDescriptor_tiller_0094511522f6b040, []int{3} } func (m *GetReleaseStatusRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetReleaseStatusRequest.Unmarshal(m, b) @@ -348,7 +348,7 @@ func (m *GetReleaseStatusResponse) Reset() { *m = GetReleaseStatusRespon func (m *GetReleaseStatusResponse) String() string { return proto.CompactTextString(m) } func (*GetReleaseStatusResponse) ProtoMessage() {} func (*GetReleaseStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{4} + return fileDescriptor_tiller_0094511522f6b040, []int{4} } func (m *GetReleaseStatusResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetReleaseStatusResponse.Unmarshal(m, b) @@ -404,7 +404,7 @@ func (m *GetReleaseContentRequest) Reset() { *m = GetReleaseContentReque func (m *GetReleaseContentRequest) String() string { return proto.CompactTextString(m) } func (*GetReleaseContentRequest) ProtoMessage() {} func (*GetReleaseContentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{5} + return fileDescriptor_tiller_0094511522f6b040, []int{5} } func (m *GetReleaseContentRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetReleaseContentRequest.Unmarshal(m, b) @@ -451,7 +451,7 @@ func (m *GetReleaseContentResponse) Reset() { *m = GetReleaseContentResp func (m *GetReleaseContentResponse) String() string { return proto.CompactTextString(m) } func (*GetReleaseContentResponse) ProtoMessage() {} func (*GetReleaseContentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{6} + return fileDescriptor_tiller_0094511522f6b040, []int{6} } func (m *GetReleaseContentResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetReleaseContentResponse.Unmarshal(m, b) @@ -519,7 +519,7 @@ func (m *UpdateReleaseRequest) Reset() { *m = UpdateReleaseRequest{} } func (m *UpdateReleaseRequest) String() string { return proto.CompactTextString(m) } func (*UpdateReleaseRequest) ProtoMessage() {} func (*UpdateReleaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{7} + return fileDescriptor_tiller_0094511522f6b040, []int{7} } func (m *UpdateReleaseRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateReleaseRequest.Unmarshal(m, b) @@ -649,7 +649,7 @@ func (m *UpdateReleaseResponse) Reset() { *m = UpdateReleaseResponse{} } func (m *UpdateReleaseResponse) String() string { return proto.CompactTextString(m) } func (*UpdateReleaseResponse) ProtoMessage() {} func (*UpdateReleaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{8} + return fileDescriptor_tiller_0094511522f6b040, []int{8} } func (m *UpdateReleaseResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UpdateReleaseResponse.Unmarshal(m, b) @@ -707,7 +707,7 @@ func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} func (m *RollbackReleaseRequest) String() string { return proto.CompactTextString(m) } func (*RollbackReleaseRequest) ProtoMessage() {} func (*RollbackReleaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{9} + return fileDescriptor_tiller_0094511522f6b040, []int{9} } func (m *RollbackReleaseRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RollbackReleaseRequest.Unmarshal(m, b) @@ -809,7 +809,7 @@ func (m *RollbackReleaseResponse) Reset() { *m = RollbackReleaseResponse func (m *RollbackReleaseResponse) String() string { return proto.CompactTextString(m) } func (*RollbackReleaseResponse) ProtoMessage() {} func (*RollbackReleaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{10} + return fileDescriptor_tiller_0094511522f6b040, []int{10} } func (m *RollbackReleaseResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_RollbackReleaseResponse.Unmarshal(m, b) @@ -874,7 +874,7 @@ func (m *InstallReleaseRequest) Reset() { *m = InstallReleaseRequest{} } func (m *InstallReleaseRequest) String() string { return proto.CompactTextString(m) } func (*InstallReleaseRequest) ProtoMessage() {} func (*InstallReleaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{11} + return fileDescriptor_tiller_0094511522f6b040, []int{11} } func (m *InstallReleaseRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InstallReleaseRequest.Unmarshal(m, b) @@ -990,7 +990,7 @@ func (m *InstallReleaseResponse) Reset() { *m = InstallReleaseResponse{} func (m *InstallReleaseResponse) String() string { return proto.CompactTextString(m) } func (*InstallReleaseResponse) ProtoMessage() {} func (*InstallReleaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{12} + return fileDescriptor_tiller_0094511522f6b040, []int{12} } func (m *InstallReleaseResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_InstallReleaseResponse.Unmarshal(m, b) @@ -1038,7 +1038,7 @@ func (m *UninstallReleaseRequest) Reset() { *m = UninstallReleaseRequest func (m *UninstallReleaseRequest) String() string { return proto.CompactTextString(m) } func (*UninstallReleaseRequest) ProtoMessage() {} func (*UninstallReleaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{13} + return fileDescriptor_tiller_0094511522f6b040, []int{13} } func (m *UninstallReleaseRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UninstallReleaseRequest.Unmarshal(m, b) @@ -1108,7 +1108,7 @@ func (m *UninstallReleaseResponse) Reset() { *m = UninstallReleaseRespon func (m *UninstallReleaseResponse) String() string { return proto.CompactTextString(m) } func (*UninstallReleaseResponse) ProtoMessage() {} func (*UninstallReleaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{14} + return fileDescriptor_tiller_0094511522f6b040, []int{14} } func (m *UninstallReleaseResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_UninstallReleaseResponse.Unmarshal(m, b) @@ -1153,7 +1153,7 @@ func (m *GetVersionRequest) Reset() { *m = GetVersionRequest{} } func (m *GetVersionRequest) String() string { return proto.CompactTextString(m) } func (*GetVersionRequest) ProtoMessage() {} func (*GetVersionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{15} + return fileDescriptor_tiller_0094511522f6b040, []int{15} } func (m *GetVersionRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetVersionRequest.Unmarshal(m, b) @@ -1184,7 +1184,7 @@ func (m *GetVersionResponse) Reset() { *m = GetVersionResponse{} } func (m *GetVersionResponse) String() string { return proto.CompactTextString(m) } func (*GetVersionResponse) ProtoMessage() {} func (*GetVersionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{16} + return fileDescriptor_tiller_0094511522f6b040, []int{16} } func (m *GetVersionResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetVersionResponse.Unmarshal(m, b) @@ -1226,7 +1226,7 @@ func (m *GetHistoryRequest) Reset() { *m = GetHistoryRequest{} } func (m *GetHistoryRequest) String() string { return proto.CompactTextString(m) } func (*GetHistoryRequest) ProtoMessage() {} func (*GetHistoryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{17} + return fileDescriptor_tiller_0094511522f6b040, []int{17} } func (m *GetHistoryRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetHistoryRequest.Unmarshal(m, b) @@ -1272,7 +1272,7 @@ func (m *GetHistoryResponse) Reset() { *m = GetHistoryResponse{} } func (m *GetHistoryResponse) String() string { return proto.CompactTextString(m) } func (*GetHistoryResponse) ProtoMessage() {} func (*GetHistoryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{18} + return fileDescriptor_tiller_0094511522f6b040, []int{18} } func (m *GetHistoryResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_GetHistoryResponse.Unmarshal(m, b) @@ -1310,7 +1310,9 @@ type TestReleaseRequest struct { // parallel specifies whether or not to run test pods in parallel Parallel bool `protobuf:"varint,4,opt,name=parallel,proto3" json:"parallel,omitempty"` // maximum number of test pods to run in parallel - MaxParallel uint32 `protobuf:"varint,5,opt,name=max_parallel,json=maxParallel,proto3" json:"max_parallel,omitempty"` + MaxParallel uint32 `protobuf:"varint,5,opt,name=max_parallel,json=maxParallel,proto3" json:"max_parallel,omitempty"` + // logs specifies whether or not to dump the logs from the test pods + Logs bool `protobuf:"varint,6,opt,name=logs,proto3" json:"logs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1320,7 +1322,7 @@ func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} } func (m *TestReleaseRequest) String() string { return proto.CompactTextString(m) } func (*TestReleaseRequest) ProtoMessage() {} func (*TestReleaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{19} + return fileDescriptor_tiller_0094511522f6b040, []int{19} } func (m *TestReleaseRequest) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TestReleaseRequest.Unmarshal(m, b) @@ -1375,6 +1377,13 @@ func (m *TestReleaseRequest) GetMaxParallel() uint32 { return 0 } +func (m *TestReleaseRequest) GetLogs() bool { + if m != nil { + return m.Logs + } + return false +} + // TestReleaseResponse represents a message from executing a test type TestReleaseResponse struct { Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` @@ -1388,7 +1397,7 @@ func (m *TestReleaseResponse) Reset() { *m = TestReleaseResponse{} } func (m *TestReleaseResponse) String() string { return proto.CompactTextString(m) } func (*TestReleaseResponse) ProtoMessage() {} func (*TestReleaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tiller_45351572bedcef6e, []int{20} + return fileDescriptor_tiller_0094511522f6b040, []int{20} } func (m *TestReleaseResponse) XXX_Unmarshal(b []byte) error { return xxx_messageInfo_TestReleaseResponse.Unmarshal(m, b) @@ -1898,93 +1907,94 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{ Metadata: "hapi/services/tiller.proto", } -func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor_tiller_45351572bedcef6e) } - -var fileDescriptor_tiller_45351572bedcef6e = []byte{ - // 1357 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x6e, 0x1b, 0x45, - 0x14, 0x8e, 0xbd, 0xfe, 0x3d, 0x4e, 0x5c, 0x77, 0x9a, 0x26, 0x5b, 0x53, 0x50, 0x58, 0x44, 0xeb, - 0x16, 0xea, 0x40, 0xe0, 0x06, 0x09, 0x21, 0xa5, 0x6e, 0x48, 0x0a, 0x21, 0x45, 0x9b, 0xb6, 0x48, - 0x48, 0xc8, 0x9a, 0xd8, 0xe3, 0x76, 0xe9, 0x7a, 0xc7, 0xec, 0xcc, 0x86, 0xe4, 0x11, 0xb8, 0xe4, - 0x9a, 0x5b, 0xae, 0x79, 0x06, 0x6e, 0x79, 0x06, 0x5e, 0x06, 0xcd, 0xdf, 0xc6, 0xb3, 0xde, 0x75, - 0x4d, 0x6e, 0xe2, 0x9d, 0x39, 0x67, 0xce, 0xcf, 0xf7, 0xcd, 0x39, 0x73, 0x5a, 0xe8, 0xbe, 0xc6, - 0xb3, 0x60, 0x97, 0x91, 0xf8, 0x3c, 0x18, 0x11, 0xb6, 0xcb, 0x83, 0x30, 0x24, 0x71, 0x7f, 0x16, - 0x53, 0x4e, 0xd1, 0xa6, 0x90, 0xf5, 0x8d, 0xac, 0xaf, 0x64, 0xdd, 0x2d, 0x79, 0x62, 0xf4, 0x1a, - 0xc7, 0x5c, 0xfd, 0x55, 0xda, 0xdd, 0xed, 0xf9, 0x7d, 0x1a, 0x4d, 0x82, 0x57, 0x5a, 0xa0, 0x5c, - 0xc4, 0x24, 0x24, 0x98, 0x11, 0xf3, 0x6b, 0x1d, 0x32, 0xb2, 0x20, 0x9a, 0x50, 0x2d, 0x78, 0xc7, - 0x12, 0x70, 0xc2, 0xf8, 0x30, 0x4e, 0x22, 0x2d, 0xbc, 0x63, 0x09, 0x19, 0xc7, 0x3c, 0x61, 0x96, - 0xb3, 0x73, 0x12, 0xb3, 0x80, 0x46, 0xe6, 0x57, 0xc9, 0xbc, 0xbf, 0xcb, 0x70, 0xeb, 0x38, 0x60, - 0xdc, 0x57, 0x07, 0x99, 0x4f, 0x7e, 0x49, 0x08, 0xe3, 0x68, 0x13, 0xaa, 0x61, 0x30, 0x0d, 0xb8, - 0x5b, 0xda, 0x29, 0xf5, 0x1c, 0x5f, 0x2d, 0xd0, 0x16, 0xd4, 0xe8, 0x64, 0xc2, 0x08, 0x77, 0xcb, - 0x3b, 0xa5, 0x5e, 0xd3, 0xd7, 0x2b, 0xf4, 0x15, 0xd4, 0x19, 0x8d, 0xf9, 0xf0, 0xec, 0xd2, 0x75, - 0x76, 0x4a, 0xbd, 0xf6, 0xde, 0x87, 0xfd, 0x3c, 0x9c, 0xfa, 0xc2, 0xd3, 0x29, 0x8d, 0x79, 0x5f, - 0xfc, 0x79, 0x7c, 0xe9, 0xd7, 0x98, 0xfc, 0x15, 0x76, 0x27, 0x41, 0xc8, 0x49, 0xec, 0x56, 0x94, - 0x5d, 0xb5, 0x42, 0x87, 0x00, 0xd2, 0x2e, 0x8d, 0xc7, 0x24, 0x76, 0xab, 0xd2, 0x74, 0x6f, 0x05, - 0xd3, 0xcf, 0x84, 0xbe, 0xdf, 0x64, 0xe6, 0x13, 0x7d, 0x09, 0xeb, 0x0a, 0x92, 0xe1, 0x88, 0x8e, - 0x09, 0x73, 0x6b, 0x3b, 0x4e, 0xaf, 0xbd, 0x77, 0x47, 0x99, 0x32, 0xf0, 0x9f, 0x2a, 0xd0, 0x06, - 0x74, 0x4c, 0xfc, 0x96, 0x52, 0x17, 0xdf, 0x0c, 0xdd, 0x85, 0x66, 0x84, 0xa7, 0x84, 0xcd, 0xf0, - 0x88, 0xb8, 0x75, 0x19, 0xe1, 0xd5, 0x86, 0x17, 0x41, 0xc3, 0x38, 0xf7, 0x1e, 0x43, 0x4d, 0xa5, - 0x86, 0x5a, 0x50, 0x7f, 0x71, 0xf2, 0xed, 0xc9, 0xb3, 0x1f, 0x4e, 0x3a, 0x6b, 0xa8, 0x01, 0x95, - 0x93, 0xfd, 0xef, 0x0e, 0x3a, 0x25, 0x74, 0x13, 0x36, 0x8e, 0xf7, 0x4f, 0x9f, 0x0f, 0xfd, 0x83, - 0xe3, 0x83, 0xfd, 0xd3, 0x83, 0x27, 0x9d, 0x32, 0x6a, 0x03, 0x0c, 0x8e, 0xf6, 0xfd, 0xe7, 0x43, - 0xa9, 0xe2, 0x78, 0xef, 0x41, 0x33, 0xcd, 0x01, 0xd5, 0xc1, 0xd9, 0x3f, 0x1d, 0x28, 0x13, 0x4f, - 0x0e, 0x4e, 0x07, 0x9d, 0x92, 0xf7, 0x5b, 0x09, 0x36, 0x6d, 0xca, 0xd8, 0x8c, 0x46, 0x8c, 0x08, - 0xce, 0x46, 0x34, 0x89, 0x52, 0xce, 0xe4, 0x02, 0x21, 0xa8, 0x44, 0xe4, 0xc2, 0x30, 0x26, 0xbf, - 0x85, 0x26, 0xa7, 0x1c, 0x87, 0x92, 0x2d, 0xc7, 0x57, 0x0b, 0xf4, 0x29, 0x34, 0x34, 0x14, 0xcc, - 0xad, 0xec, 0x38, 0xbd, 0xd6, 0xde, 0x6d, 0x1b, 0x20, 0xed, 0xd1, 0x4f, 0xd5, 0xbc, 0x43, 0xd8, - 0x3e, 0x24, 0x26, 0x12, 0x85, 0x9f, 0xb9, 0x41, 0xc2, 0x2f, 0x9e, 0x12, 0x19, 0x8c, 0xf0, 0x8b, - 0xa7, 0x04, 0xb9, 0x50, 0xd7, 0xd7, 0x4f, 0x86, 0x53, 0xf5, 0xcd, 0xd2, 0xe3, 0xe0, 0x2e, 0x1a, - 0xd2, 0x79, 0xe5, 0x59, 0xba, 0x07, 0x15, 0x51, 0x19, 0xd2, 0x4c, 0x6b, 0x0f, 0xd9, 0x71, 0x3e, - 0x8d, 0x26, 0xd4, 0x97, 0x72, 0x9b, 0x3a, 0x27, 0x4b, 0xdd, 0xd1, 0xbc, 0xd7, 0x01, 0x8d, 0x38, - 0x89, 0xf8, 0xf5, 0xe2, 0x3f, 0x86, 0x3b, 0x39, 0x96, 0x74, 0x02, 0xbb, 0x50, 0xd7, 0xa1, 0x49, - 0x6b, 0x85, 0xb8, 0x1a, 0x2d, 0xef, 0x1f, 0x07, 0x36, 0x5f, 0xcc, 0xc6, 0x98, 0x13, 0x23, 0x5a, - 0x12, 0xd4, 0x7d, 0xa8, 0xca, 0x0e, 0xa3, 0xb1, 0xb8, 0xa9, 0x6c, 0xab, 0x36, 0x34, 0x10, 0x7f, - 0x7d, 0x25, 0x47, 0x0f, 0xa1, 0x76, 0x8e, 0xc3, 0x84, 0x30, 0x09, 0x44, 0x8a, 0x9a, 0xd6, 0x94, - 0xed, 0xc9, 0xd7, 0x1a, 0x68, 0x1b, 0xea, 0xe3, 0xf8, 0x52, 0xf4, 0x17, 0x59, 0x92, 0x0d, 0xbf, - 0x36, 0x8e, 0x2f, 0xfd, 0x24, 0x42, 0x1f, 0xc0, 0xc6, 0x38, 0x60, 0xf8, 0x2c, 0x24, 0xc3, 0xd7, - 0x94, 0xbe, 0x61, 0xb2, 0x2a, 0x1b, 0xfe, 0xba, 0xde, 0x3c, 0x12, 0x7b, 0xa8, 0x2b, 0x6e, 0xd2, - 0x28, 0x26, 0x98, 0x13, 0xb7, 0x26, 0xe5, 0xe9, 0x5a, 0x60, 0xc8, 0x83, 0x29, 0xa1, 0x09, 0x97, - 0xa5, 0xe4, 0xf8, 0x66, 0x89, 0xde, 0x87, 0xf5, 0x98, 0x30, 0xc2, 0x87, 0x3a, 0xca, 0x86, 0x3c, - 0xd9, 0x92, 0x7b, 0x2f, 0x55, 0x58, 0x08, 0x2a, 0xbf, 0xe2, 0x80, 0xbb, 0x4d, 0x29, 0x92, 0xdf, - 0xea, 0x58, 0xc2, 0x88, 0x39, 0x06, 0xe6, 0x58, 0xc2, 0x88, 0x3e, 0xb6, 0x09, 0xd5, 0x09, 0x8d, - 0x47, 0xc4, 0x6d, 0x49, 0x99, 0x5a, 0xa0, 0x1d, 0x68, 0x8d, 0x09, 0x1b, 0xc5, 0xc1, 0x8c, 0x0b, - 0x46, 0xd7, 0x25, 0xa6, 0xf3, 0x5b, 0x22, 0x0f, 0x96, 0x9c, 0x9d, 0x50, 0x4e, 0x98, 0xbb, 0xa1, - 0xf2, 0x30, 0x6b, 0x74, 0x0f, 0x6e, 0x8c, 0x42, 0x82, 0xa3, 0x64, 0x36, 0xa4, 0xd1, 0x70, 0x82, - 0x83, 0xd0, 0x6d, 0x4b, 0x95, 0x0d, 0xbd, 0xfd, 0x2c, 0xfa, 0x1a, 0x07, 0xa1, 0x77, 0x04, 0xb7, - 0x33, 0x54, 0x5e, 0xf7, 0x56, 0xfc, 0x55, 0x86, 0x2d, 0x9f, 0x86, 0xe1, 0x19, 0x1e, 0xbd, 0x59, - 0xe1, 0x5e, 0xcc, 0x51, 0x58, 0x5e, 0x4e, 0xa1, 0x93, 0x43, 0xe1, 0xdc, 0x55, 0xaf, 0x58, 0x57, - 0xdd, 0x22, 0xb7, 0x5a, 0x4c, 0x6e, 0xcd, 0x26, 0xd7, 0x30, 0x57, 0x9f, 0x63, 0x2e, 0xa5, 0xa5, - 0xb1, 0x84, 0x96, 0xe6, 0x22, 0x2d, 0x39, 0xd0, 0x43, 0x1e, 0xf4, 0xdf, 0xc0, 0xf6, 0x02, 0x5e, - 0xd7, 0x05, 0xff, 0x77, 0x07, 0x6e, 0x3f, 0x8d, 0x18, 0xc7, 0x61, 0x98, 0xc1, 0x3e, 0xad, 0xbf, - 0xd2, 0xca, 0xf5, 0x57, 0xfe, 0x3f, 0xf5, 0xe7, 0x58, 0xe4, 0x19, 0xa6, 0x2b, 0x73, 0x4c, 0xaf, - 0x54, 0x93, 0x56, 0x27, 0xac, 0x65, 0x3a, 0x21, 0x7a, 0x17, 0x40, 0x15, 0x91, 0x34, 0xae, 0x48, - 0x6a, 0xca, 0x9d, 0x13, 0xdd, 0xf8, 0x0c, 0xaf, 0x8d, 0x7c, 0x5e, 0xe7, 0x2b, 0xb2, 0x07, 0x1d, - 0x13, 0xcf, 0x28, 0x1e, 0xcb, 0x98, 0x34, 0x41, 0x6d, 0xbd, 0x3f, 0x88, 0xc7, 0x22, 0xaa, 0x2c, - 0xd7, 0xad, 0xe5, 0x25, 0xb8, 0x6e, 0x97, 0xa0, 0xf7, 0x14, 0xb6, 0xb2, 0x94, 0x5c, 0x97, 0xde, - 0x3f, 0x4b, 0xb0, 0xfd, 0x22, 0x0a, 0x72, 0x09, 0xce, 0x2b, 0xae, 0x05, 0xc8, 0xcb, 0x39, 0x90, - 0x6f, 0x42, 0x75, 0x96, 0xc4, 0xaf, 0x88, 0xa6, 0x50, 0x2d, 0xe6, 0xb1, 0xac, 0xd8, 0x58, 0x66, - 0xd0, 0xa8, 0x2e, 0xa0, 0xe1, 0x0d, 0xc1, 0x5d, 0x8c, 0xf2, 0x9a, 0x39, 0x8b, 0xbc, 0xd2, 0x37, - 0xb4, 0xa9, 0xde, 0x4b, 0xef, 0x16, 0xdc, 0x3c, 0x24, 0xfc, 0xa5, 0x2a, 0x75, 0x0d, 0x80, 0x77, - 0x00, 0x68, 0x7e, 0xf3, 0xca, 0x9f, 0xde, 0xb2, 0xfd, 0x99, 0x01, 0xd3, 0xe8, 0x1b, 0x2d, 0xef, - 0x0b, 0x69, 0xfb, 0x28, 0x60, 0x9c, 0xc6, 0x97, 0xcb, 0xc0, 0xed, 0x80, 0x33, 0xc5, 0x17, 0xfa, - 0x89, 0x15, 0x9f, 0xde, 0xa1, 0x8c, 0x20, 0x3d, 0xaa, 0x23, 0x98, 0x1f, 0x58, 0x4a, 0xab, 0x0d, - 0x2c, 0x7f, 0x94, 0x00, 0x3d, 0x27, 0xe9, 0xf0, 0xf4, 0x96, 0xc7, 0xde, 0xf0, 0x54, 0xb6, 0x79, - 0x72, 0xa1, 0xae, 0x1b, 0x8d, 0x66, 0xd6, 0x2c, 0xc5, 0x6d, 0x9d, 0xe1, 0x18, 0x87, 0x21, 0x09, - 0xf5, 0xbb, 0x99, 0xae, 0xc5, 0x3b, 0x35, 0xc5, 0x17, 0xc3, 0x54, 0x2e, 0xe8, 0xdd, 0xf0, 0x5b, - 0x53, 0x7c, 0xf1, 0xbd, 0xde, 0xf2, 0x7e, 0x82, 0x5b, 0x56, 0x70, 0x3a, 0x4f, 0x81, 0x07, 0x7b, - 0xa5, 0x83, 0x13, 0x9f, 0xe8, 0x73, 0xa8, 0xa9, 0x01, 0x55, 0x86, 0xd6, 0xde, 0xbb, 0x6b, 0xe7, - 0x2d, 0x8d, 0x24, 0x91, 0x9e, 0x68, 0x7d, 0xad, 0xbb, 0xf7, 0x6f, 0x03, 0xda, 0x66, 0xc4, 0x52, - 0xe3, 0x33, 0x0a, 0x60, 0x7d, 0x7e, 0x96, 0x44, 0x0f, 0x8a, 0xa7, 0xeb, 0xcc, 0x3f, 0x11, 0xba, - 0x0f, 0x57, 0x51, 0x55, 0x19, 0x78, 0x6b, 0x9f, 0x94, 0x10, 0x83, 0x4e, 0x76, 0xc4, 0x43, 0x8f, - 0xf2, 0x6d, 0x14, 0xcc, 0x94, 0xdd, 0xfe, 0xaa, 0xea, 0xc6, 0x2d, 0x3a, 0x97, 0x77, 0xce, 0x9e, - 0xcb, 0xd0, 0x5b, 0xcd, 0xd8, 0xa3, 0x60, 0x77, 0x77, 0x65, 0xfd, 0xd4, 0xef, 0xcf, 0xb0, 0x61, - 0xbd, 0xfa, 0xa8, 0x00, 0xad, 0xbc, 0x29, 0xaf, 0xfb, 0xd1, 0x4a, 0xba, 0xa9, 0xaf, 0x29, 0xb4, - 0xed, 0x36, 0x88, 0x0a, 0x0c, 0xe4, 0xbe, 0x5f, 0xdd, 0x8f, 0x57, 0x53, 0x4e, 0xdd, 0x31, 0xe8, - 0x64, 0x7b, 0x50, 0x11, 0x8f, 0x05, 0x1d, 0xb5, 0x88, 0xc7, 0xa2, 0xd6, 0xe6, 0xad, 0x21, 0x0c, - 0x70, 0xd5, 0x82, 0xd0, 0xfd, 0x42, 0x42, 0xec, 0xce, 0xd5, 0xed, 0xbd, 0x5d, 0x31, 0x75, 0x31, - 0x83, 0x1b, 0x99, 0x69, 0x01, 0x15, 0x40, 0x93, 0x3f, 0x84, 0x75, 0x1f, 0xad, 0xa8, 0x9d, 0x49, - 0x4a, 0x77, 0xb5, 0x25, 0x49, 0xd9, 0x2d, 0x73, 0x49, 0x52, 0x99, 0x06, 0xe9, 0xad, 0xa1, 0x00, - 0xda, 0x7e, 0x12, 0x69, 0xd7, 0xa2, 0x2d, 0xa0, 0x82, 0xd3, 0x8b, 0x4d, 0xb1, 0xfb, 0x60, 0x05, - 0xcd, 0xab, 0xfa, 0x7e, 0x0c, 0x3f, 0x36, 0x8c, 0xea, 0x59, 0x4d, 0xfe, 0xef, 0xc2, 0x67, 0xff, - 0x05, 0x00, 0x00, 0xff, 0xff, 0xba, 0xd8, 0xb0, 0xb9, 0x4b, 0x11, 0x00, 0x00, +func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor_tiller_0094511522f6b040) } + +var fileDescriptor_tiller_0094511522f6b040 = []byte{ + // 1369 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x72, 0x1b, 0xc5, + 0x12, 0xb6, 0xb4, 0xfa, 0x6d, 0xd9, 0x8a, 0x32, 0x71, 0xec, 0x8d, 0x4e, 0xce, 0x29, 0x9f, 0xa5, + 0x48, 0x94, 0x40, 0x64, 0x30, 0xdc, 0x50, 0x45, 0x51, 0xe5, 0x28, 0xc6, 0x0e, 0x18, 0x87, 0x5a, + 0x27, 0xa1, 0x8a, 0x2a, 0x4a, 0x35, 0x96, 0x46, 0xce, 0x92, 0xd5, 0x8e, 0xd8, 0x99, 0x35, 0xf6, + 0x23, 0x70, 0xc9, 0x3b, 0x70, 0x0d, 0xaf, 0xc0, 0x2d, 0xcf, 0xc0, 0xcb, 0x50, 0xf3, 0xb7, 0xd6, + 0xac, 0x76, 0x15, 0xe1, 0x1b, 0xed, 0xcc, 0x74, 0x4f, 0x77, 0xcf, 0xf7, 0x4d, 0xf7, 0xb4, 0x0d, + 0xdd, 0x37, 0x78, 0x16, 0xec, 0x32, 0x12, 0x5f, 0x04, 0x23, 0xc2, 0x76, 0x79, 0x10, 0x86, 0x24, + 0xee, 0xcf, 0x62, 0xca, 0x29, 0xda, 0x14, 0xb2, 0xbe, 0x91, 0xf5, 0x95, 0xac, 0xbb, 0x25, 0x77, + 0x8c, 0xde, 0xe0, 0x98, 0xab, 0x5f, 0xa5, 0xdd, 0xdd, 0x9e, 0x5f, 0xa7, 0xd1, 0x24, 0x38, 0xd7, + 0x02, 0xe5, 0x22, 0x26, 0x21, 0xc1, 0x8c, 0x98, 0xaf, 0xb5, 0xc9, 0xc8, 0x82, 0x68, 0x42, 0xb5, + 0xe0, 0x3f, 0x96, 0x80, 0x13, 0xc6, 0x87, 0x71, 0x12, 0x69, 0xe1, 0x3d, 0x4b, 0xc8, 0x38, 0xe6, + 0x09, 0xb3, 0x9c, 0x5d, 0x90, 0x98, 0x05, 0x34, 0x32, 0x5f, 0x25, 0xf3, 0xfe, 0x2c, 0xc3, 0x9d, + 0xe3, 0x80, 0x71, 0x5f, 0x6d, 0x64, 0x3e, 0xf9, 0x29, 0x21, 0x8c, 0xa3, 0x4d, 0xa8, 0x86, 0xc1, + 0x34, 0xe0, 0x6e, 0x69, 0xa7, 0xd4, 0x73, 0x7c, 0x35, 0x41, 0x5b, 0x50, 0xa3, 0x93, 0x09, 0x23, + 0xdc, 0x2d, 0xef, 0x94, 0x7a, 0x4d, 0x5f, 0xcf, 0xd0, 0x17, 0x50, 0x67, 0x34, 0xe6, 0xc3, 0xb3, + 0x2b, 0xd7, 0xd9, 0x29, 0xf5, 0xda, 0x7b, 0xef, 0xf7, 0xf3, 0x70, 0xea, 0x0b, 0x4f, 0xa7, 0x34, + 0xe6, 0x7d, 0xf1, 0xf3, 0xf4, 0xca, 0xaf, 0x31, 0xf9, 0x15, 0x76, 0x27, 0x41, 0xc8, 0x49, 0xec, + 0x56, 0x94, 0x5d, 0x35, 0x43, 0x87, 0x00, 0xd2, 0x2e, 0x8d, 0xc7, 0x24, 0x76, 0xab, 0xd2, 0x74, + 0x6f, 0x05, 0xd3, 0x2f, 0x84, 0xbe, 0xdf, 0x64, 0x66, 0x88, 0x3e, 0x87, 0x75, 0x05, 0xc9, 0x70, + 0x44, 0xc7, 0x84, 0xb9, 0xb5, 0x1d, 0xa7, 0xd7, 0xde, 0xbb, 0xa7, 0x4c, 0x19, 0xf8, 0x4f, 0x15, + 0x68, 0x03, 0x3a, 0x26, 0x7e, 0x4b, 0xa9, 0x8b, 0x31, 0x43, 0xf7, 0xa1, 0x19, 0xe1, 0x29, 0x61, + 0x33, 0x3c, 0x22, 0x6e, 0x5d, 0x46, 0x78, 0xbd, 0xe0, 0x45, 0xd0, 0x30, 0xce, 0xbd, 0xa7, 0x50, + 0x53, 0x47, 0x43, 0x2d, 0xa8, 0xbf, 0x3a, 0xf9, 0xfa, 0xe4, 0xc5, 0x77, 0x27, 0x9d, 0x35, 0xd4, + 0x80, 0xca, 0xc9, 0xfe, 0x37, 0x07, 0x9d, 0x12, 0xba, 0x0d, 0x1b, 0xc7, 0xfb, 0xa7, 0x2f, 0x87, + 0xfe, 0xc1, 0xf1, 0xc1, 0xfe, 0xe9, 0xc1, 0xb3, 0x4e, 0x19, 0xb5, 0x01, 0x06, 0x47, 0xfb, 0xfe, + 0xcb, 0xa1, 0x54, 0x71, 0xbc, 0xff, 0x41, 0x33, 0x3d, 0x03, 0xaa, 0x83, 0xb3, 0x7f, 0x3a, 0x50, + 0x26, 0x9e, 0x1d, 0x9c, 0x0e, 0x3a, 0x25, 0xef, 0x97, 0x12, 0x6c, 0xda, 0x94, 0xb1, 0x19, 0x8d, + 0x18, 0x11, 0x9c, 0x8d, 0x68, 0x12, 0xa5, 0x9c, 0xc9, 0x09, 0x42, 0x50, 0x89, 0xc8, 0xa5, 0x61, + 0x4c, 0x8e, 0x85, 0x26, 0xa7, 0x1c, 0x87, 0x92, 0x2d, 0xc7, 0x57, 0x13, 0xf4, 0x31, 0x34, 0x34, + 0x14, 0xcc, 0xad, 0xec, 0x38, 0xbd, 0xd6, 0xde, 0x5d, 0x1b, 0x20, 0xed, 0xd1, 0x4f, 0xd5, 0xbc, + 0x43, 0xd8, 0x3e, 0x24, 0x26, 0x12, 0x85, 0x9f, 0xb9, 0x41, 0xc2, 0x2f, 0x9e, 0x12, 0x19, 0x8c, + 0xf0, 0x8b, 0xa7, 0x04, 0xb9, 0x50, 0xd7, 0xd7, 0x4f, 0x86, 0x53, 0xf5, 0xcd, 0xd4, 0xe3, 0xe0, + 0x2e, 0x1a, 0xd2, 0xe7, 0xca, 0xb3, 0xf4, 0x00, 0x2a, 0x22, 0x33, 0xa4, 0x99, 0xd6, 0x1e, 0xb2, + 0xe3, 0x7c, 0x1e, 0x4d, 0xa8, 0x2f, 0xe5, 0x36, 0x75, 0x4e, 0x96, 0xba, 0xa3, 0x79, 0xaf, 0x03, + 0x1a, 0x71, 0x12, 0xf1, 0x9b, 0xc5, 0x7f, 0x0c, 0xf7, 0x72, 0x2c, 0xe9, 0x03, 0xec, 0x42, 0x5d, + 0x87, 0x26, 0xad, 0x15, 0xe2, 0x6a, 0xb4, 0xbc, 0xbf, 0x1c, 0xd8, 0x7c, 0x35, 0x1b, 0x63, 0x4e, + 0x8c, 0x68, 0x49, 0x50, 0x0f, 0xa1, 0x2a, 0x2b, 0x8c, 0xc6, 0xe2, 0xb6, 0xb2, 0xad, 0xca, 0xd0, + 0x40, 0xfc, 0xfa, 0x4a, 0x8e, 0x1e, 0x43, 0xed, 0x02, 0x87, 0x09, 0x61, 0x12, 0x88, 0x14, 0x35, + 0xad, 0x29, 0xcb, 0x93, 0xaf, 0x35, 0xd0, 0x36, 0xd4, 0xc7, 0xf1, 0x95, 0xa8, 0x2f, 0x32, 0x25, + 0x1b, 0x7e, 0x6d, 0x1c, 0x5f, 0xf9, 0x49, 0x84, 0xde, 0x83, 0x8d, 0x71, 0xc0, 0xf0, 0x59, 0x48, + 0x86, 0x6f, 0x28, 0x7d, 0xcb, 0x64, 0x56, 0x36, 0xfc, 0x75, 0xbd, 0x78, 0x24, 0xd6, 0x50, 0x57, + 0xdc, 0xa4, 0x51, 0x4c, 0x30, 0x27, 0x6e, 0x4d, 0xca, 0xd3, 0xb9, 0xc0, 0x90, 0x07, 0x53, 0x42, + 0x13, 0x2e, 0x53, 0xc9, 0xf1, 0xcd, 0x14, 0xfd, 0x1f, 0xd6, 0x63, 0xc2, 0x08, 0x1f, 0xea, 0x28, + 0x1b, 0x72, 0x67, 0x4b, 0xae, 0xbd, 0x56, 0x61, 0x21, 0xa8, 0xfc, 0x8c, 0x03, 0xee, 0x36, 0xa5, + 0x48, 0x8e, 0xd5, 0xb6, 0x84, 0x11, 0xb3, 0x0d, 0xcc, 0xb6, 0x84, 0x11, 0xbd, 0x6d, 0x13, 0xaa, + 0x13, 0x1a, 0x8f, 0x88, 0xdb, 0x92, 0x32, 0x35, 0x41, 0x3b, 0xd0, 0x1a, 0x13, 0x36, 0x8a, 0x83, + 0x19, 0x17, 0x8c, 0xae, 0x4b, 0x4c, 0xe7, 0x97, 0xc4, 0x39, 0x58, 0x72, 0x76, 0x42, 0x39, 0x61, + 0xee, 0x86, 0x3a, 0x87, 0x99, 0xa3, 0x07, 0x70, 0x6b, 0x14, 0x12, 0x1c, 0x25, 0xb3, 0x21, 0x8d, + 0x86, 0x13, 0x1c, 0x84, 0x6e, 0x5b, 0xaa, 0x6c, 0xe8, 0xe5, 0x17, 0xd1, 0x97, 0x38, 0x08, 0xbd, + 0x23, 0xb8, 0x9b, 0xa1, 0xf2, 0xa6, 0xb7, 0xe2, 0xf7, 0x32, 0x6c, 0xf9, 0x34, 0x0c, 0xcf, 0xf0, + 0xe8, 0xed, 0x0a, 0xf7, 0x62, 0x8e, 0xc2, 0xf2, 0x72, 0x0a, 0x9d, 0x1c, 0x0a, 0xe7, 0xae, 0x7a, + 0xc5, 0xba, 0xea, 0x16, 0xb9, 0xd5, 0x62, 0x72, 0x6b, 0x36, 0xb9, 0x86, 0xb9, 0xfa, 0x1c, 0x73, + 0x29, 0x2d, 0x8d, 0x25, 0xb4, 0x34, 0x17, 0x69, 0xc9, 0x81, 0x1e, 0xf2, 0xa0, 0xff, 0x0a, 0xb6, + 0x17, 0xf0, 0xba, 0x29, 0xf8, 0xbf, 0x3a, 0x70, 0xf7, 0x79, 0xc4, 0x38, 0x0e, 0xc3, 0x0c, 0xf6, + 0x69, 0xfe, 0x95, 0x56, 0xce, 0xbf, 0xf2, 0xbf, 0xc9, 0x3f, 0xc7, 0x22, 0xcf, 0x30, 0x5d, 0x99, + 0x63, 0x7a, 0xa5, 0x9c, 0xb4, 0x2a, 0x61, 0x2d, 0x53, 0x09, 0xd1, 0x7f, 0x01, 0x54, 0x12, 0x49, + 0xe3, 0x8a, 0xa4, 0xa6, 0x5c, 0x39, 0xd1, 0x85, 0xcf, 0xf0, 0xda, 0xc8, 0xe7, 0x75, 0x3e, 0x23, + 0x7b, 0xd0, 0x31, 0xf1, 0x8c, 0xe2, 0xb1, 0x8c, 0x49, 0x13, 0xd4, 0xd6, 0xeb, 0x83, 0x78, 0x2c, + 0xa2, 0xca, 0x72, 0xdd, 0x5a, 0x9e, 0x82, 0xeb, 0x76, 0x0a, 0x7a, 0xcf, 0x61, 0x2b, 0x4b, 0xc9, + 0x4d, 0xe9, 0xfd, 0xad, 0x04, 0xdb, 0xaf, 0xa2, 0x20, 0x97, 0xe0, 0xbc, 0xe4, 0x5a, 0x80, 0xbc, + 0x9c, 0x03, 0xf9, 0x26, 0x54, 0x67, 0x49, 0x7c, 0x4e, 0x34, 0x85, 0x6a, 0x32, 0x8f, 0x65, 0xc5, + 0xc6, 0x32, 0x83, 0x46, 0x75, 0x01, 0x0d, 0x6f, 0x08, 0xee, 0x62, 0x94, 0x37, 0x3c, 0xb3, 0x38, + 0x57, 0xfa, 0x86, 0x36, 0xd5, 0x7b, 0xe9, 0xdd, 0x81, 0xdb, 0x87, 0x84, 0xbf, 0x56, 0xa9, 0xae, + 0x01, 0xf0, 0x0e, 0x00, 0xcd, 0x2f, 0x5e, 0xfb, 0xd3, 0x4b, 0xb6, 0x3f, 0xd3, 0x60, 0x1a, 0x7d, + 0xa3, 0xe5, 0x7d, 0x26, 0x6d, 0x1f, 0x05, 0x8c, 0xd3, 0xf8, 0x6a, 0x19, 0xb8, 0x1d, 0x70, 0xa6, + 0xf8, 0x52, 0x3f, 0xb1, 0x62, 0xe8, 0x1d, 0xca, 0x08, 0xd2, 0xad, 0x3a, 0x82, 0xf9, 0x86, 0xa5, + 0xb4, 0x5a, 0xc3, 0xf2, 0x47, 0x09, 0xd0, 0x4b, 0x92, 0x36, 0x4f, 0xef, 0x78, 0xec, 0x0d, 0x4f, + 0x65, 0x9b, 0x27, 0x17, 0xea, 0xba, 0xd0, 0x68, 0x66, 0xcd, 0x54, 0xdc, 0xd6, 0x19, 0x8e, 0x71, + 0x18, 0x92, 0x50, 0xbf, 0x9b, 0xe9, 0x5c, 0xbc, 0x53, 0x53, 0x7c, 0x39, 0x4c, 0xe5, 0x82, 0xde, + 0x0d, 0xbf, 0x35, 0xc5, 0x97, 0xdf, 0x1a, 0x15, 0x04, 0x95, 0x90, 0x9e, 0x33, 0xfd, 0x66, 0xca, + 0xb1, 0xf7, 0x03, 0xdc, 0xb1, 0x02, 0xd6, 0x67, 0x17, 0x18, 0xb1, 0x73, 0x1d, 0xb0, 0x18, 0xa2, + 0x4f, 0xa1, 0xa6, 0x9a, 0x56, 0x19, 0x6e, 0x7b, 0xef, 0xbe, 0x8d, 0x85, 0x34, 0x92, 0x44, 0xba, + 0xcb, 0xf5, 0xb5, 0xee, 0xde, 0xdf, 0x0d, 0x68, 0x9b, 0xb6, 0x4b, 0xb5, 0xd4, 0x28, 0x80, 0xf5, + 0xf9, 0xfe, 0x12, 0x3d, 0x2a, 0xee, 0xb8, 0x33, 0x7f, 0x36, 0x74, 0x1f, 0xaf, 0xa2, 0xaa, 0x4e, + 0xe0, 0xad, 0x7d, 0x54, 0x42, 0x0c, 0x3a, 0xd9, 0xb6, 0x0f, 0x3d, 0xc9, 0xb7, 0x51, 0xd0, 0x67, + 0x76, 0xfb, 0xab, 0xaa, 0x1b, 0xb7, 0xe8, 0x42, 0xde, 0x43, 0xbb, 0x57, 0x43, 0xef, 0x34, 0x63, + 0xb7, 0x87, 0xdd, 0xdd, 0x95, 0xf5, 0x53, 0xbf, 0x3f, 0xc2, 0x86, 0xd5, 0x09, 0xa0, 0x02, 0xb4, + 0xf2, 0x3a, 0xbf, 0xee, 0x07, 0x2b, 0xe9, 0xa6, 0xbe, 0xa6, 0xd0, 0xb6, 0x4b, 0x23, 0x2a, 0x30, + 0x90, 0xfb, 0xa6, 0x75, 0x3f, 0x5c, 0x4d, 0x39, 0x75, 0xc7, 0xa0, 0x93, 0xad, 0x4b, 0x45, 0x3c, + 0x16, 0x54, 0xd9, 0x22, 0x1e, 0x8b, 0xca, 0x9d, 0xb7, 0x86, 0x30, 0xc0, 0x75, 0x59, 0x42, 0x0f, + 0x0b, 0x09, 0xb1, 0xab, 0x59, 0xb7, 0xf7, 0x6e, 0xc5, 0xd4, 0xc5, 0x0c, 0x6e, 0x65, 0x3a, 0x08, + 0x54, 0x00, 0x4d, 0x7e, 0x63, 0xd6, 0x7d, 0xb2, 0xa2, 0x76, 0xe6, 0x50, 0xba, 0xd2, 0x2d, 0x39, + 0x94, 0x5d, 0x46, 0x97, 0x1c, 0x2a, 0x53, 0x34, 0xbd, 0x35, 0x14, 0x40, 0xdb, 0x4f, 0x22, 0xed, + 0x5a, 0x94, 0x05, 0x54, 0xb0, 0x7b, 0xb1, 0x50, 0x76, 0x1f, 0xad, 0xa0, 0x79, 0x9d, 0xdf, 0x4f, + 0xe1, 0xfb, 0x86, 0x51, 0x3d, 0xab, 0xc9, 0xff, 0x38, 0x7c, 0xf2, 0x4f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x8a, 0x23, 0x76, 0x0d, 0x5f, 0x11, 0x00, 0x00, } diff --git a/pkg/releasetesting/environment.go b/pkg/releasetesting/environment.go index e4184b5f4..4da012a1f 100644 --- a/pkg/releasetesting/environment.go +++ b/pkg/releasetesting/environment.go @@ -19,17 +19,22 @@ package releasetesting import ( "bytes" "fmt" + "io/ioutil" "log" + "strings" "sync" "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/tiller/environment" ) +// logEscaper is necessary for escaping control characters found in the log stream. +var logEscaper = strings.NewReplacer("%", "%%") + // Environment encapsulates information about where test suite executes and returns results type Environment struct { Namespace string @@ -126,3 +131,31 @@ func (env *Environment) DeleteTestPods(testManifests []string) { } } } + +// GetLogs collects the logs from the pods created in testManifests +func (env *Environment) GetLogs(testManifests []string) { + for _, testManifest := range testManifests { + infos, err := env.KubeClient.Build(env.Namespace, bytes.NewBufferString(testManifest)) + if err != nil { + env.streamError(err.Error()) + continue + } + if len(infos) == 0 { + env.streamError(fmt.Sprint("Pod manifest is invalid. Unable to obtain the logs")) + continue + } + podName := infos[0].Object.(*v1.Pod).Name + lr, err := env.KubeClient.GetPodLogs(podName, env.Namespace) + if err != nil { + env.streamError(err.Error()) + continue + } + logs, err := ioutil.ReadAll(lr) + if err != nil { + env.streamError(err.Error()) + continue + } + msg := fmt.Sprintf("\nPOD LOGS: %s\n%s", podName, logEscaper.Replace(string(logs))) + env.streamMessage(msg, release.TestRun_RUNNING) + } +} diff --git a/pkg/releasetesting/environment_test.go b/pkg/releasetesting/environment_test.go index d9377b0f3..4daaa6bdb 100644 --- a/pkg/releasetesting/environment_test.go +++ b/pkg/releasetesting/environment_test.go @@ -89,6 +89,24 @@ func TestDeleteTestPodsFailingDelete(t *testing.T) { } } +func TestGetTestPodLogs(t *testing.T) { + mockTestSuite := testSuiteFixture([]string{manifestWithTestSuccessHook}) + mockTestEnv := newMockTestingEnvironment() + mockTestEnv.KubeClient = newGetLogKubeClient() + + mockTestEnv.GetLogs(mockTestSuite.TestManifests) + + expectedMessage := "ERROR: Pod manifest is invalid. Unable to obtain the logs" + + stream := mockTestEnv.Stream.(*mockStream) + if len(stream.messages) != 1 { + t.Errorf("Expected 1 message, got: %v", len(stream.messages)) + } + if stream.messages[0].Msg != expectedMessage { + t.Errorf("Expected message '%s', got: %v", expectedMessage, stream.messages[0].Msg) + } +} + func TestStreamMessage(t *testing.T) { mockTestEnv := newMockTestingEnvironment() @@ -181,3 +199,13 @@ func newCreateFailingKubeClient() *createFailingKubeClient { func (p *createFailingKubeClient) Create(ns string, r io.Reader, t int64, shouldWait bool) error { return errors.New("We ran out of budget and couldn't create finding-nemo") } + +type getLogKubeClient struct { + tillerEnv.PrintingKubeClient +} + +func newGetLogKubeClient() *getLogKubeClient { + return &getLogKubeClient{ + PrintingKubeClient: tillerEnv.PrintingKubeClient{Out: ioutil.Discard}, + } +} diff --git a/pkg/tiller/environment/environment.go b/pkg/tiller/environment/environment.go index d3a478ea0..ee557c464 100644 --- a/pkg/tiller/environment/environment.go +++ b/pkg/tiller/environment/environment.go @@ -175,6 +175,8 @@ type KubeClient interface { // and returns said phase (PodSucceeded or PodFailed qualify). WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) + GetPodLogs(name, namespace string) (io.ReadCloser, error) + WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error } @@ -255,6 +257,11 @@ func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reade return v1.PodUnknown, err } +// GetPodLogs implements KubeClient GetPodLogs. +func (p *PrintingKubeClient) GetPodLogs(name, ns string) (io.ReadCloser, error) { + return nil, nil +} + // WaitUntilCRDEstablished implements KubeClient WaitUntilCRDEstablished. func (p *PrintingKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { _, err := io.Copy(p.Out, reader) diff --git a/pkg/tiller/environment/environment_test.go b/pkg/tiller/environment/environment_test.go index 962ff4d93..bace300c1 100644 --- a/pkg/tiller/environment/environment_test.go +++ b/pkg/tiller/environment/environment_test.go @@ -78,6 +78,10 @@ func (k *mockKubeClient) WaitAndGetCompletedPodStatus(namespace string, reader i return "", nil } +func (k *mockKubeClient) GetPodLogs(name, namespace string) (io.ReadCloser, error) { + return nil, nil +} + func (k *mockKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { return nil } diff --git a/pkg/tiller/release_server_test.go b/pkg/tiller/release_server_test.go index 227af6cfc..144850d22 100644 --- a/pkg/tiller/release_server_test.go +++ b/pkg/tiller/release_server_test.go @@ -679,6 +679,9 @@ func (kc *mockHooksKubeClient) Validate(ns string, reader io.Reader) error { func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (v1.PodPhase, error) { return v1.PodUnknown, nil } +func (kc *mockHooksKubeClient) GetPodLogs(name, namespace string) (io.ReadCloser, error) { + return nil, nil +} func (kc *mockHooksKubeClient) WaitUntilCRDEstablished(reader io.Reader, timeout time.Duration) error { return nil diff --git a/pkg/tiller/release_testing.go b/pkg/tiller/release_testing.go index 2e6728e5e..e546dfd63 100644 --- a/pkg/tiller/release_testing.go +++ b/pkg/tiller/release_testing.go @@ -69,6 +69,10 @@ func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream Results: tSuite.Results, } + if req.Logs { + testEnv.GetLogs(tSuite.TestManifests) + } + if req.Cleanup { testEnv.DeleteTestPods(tSuite.TestManifests) }