Unverified Commit 024f168b authored by Matthew Fisher's avatar Matthew Fisher Committed by GitHub

Merge pull request #6612 from bacongobbler/rebase-6167

feat(test): add `--logs` to `helm test`
parents 66e0c0b4 9b9dcebe
......@@ -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
......
......@@ -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{}
......
......@@ -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
......@@ -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) {
......
......@@ -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 {
......
......@@ -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)
......@@ -1311,6 +1311,8 @@ type TestReleaseRequest struct {
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"`
// 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,
}
......@@ -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)
}
}
......@@ -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},
}
}
......@@ -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)
......
......@@ -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
}
......
......@@ -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
......
......@@ -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)
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment