Add flag to stream pod logs in release testing

pull/4081/head
Frank Hamand 7 years ago
parent b6660cd5c9
commit 1e7c00e097

@ -329,6 +329,8 @@ message TestReleaseRequest {
int64 timeout = 2;
// cleanup specifies whether or not to attempt pod deletion after test completes
bool cleanup = 3;
// logs specifies whether or not to stream logs from the test pods
bool logs = 4;
}
// TestReleaseResponse represents a message from executing a test

@ -39,6 +39,7 @@ type releaseTestCmd struct {
client helm.Interface
timeout int64
cleanup bool
logs bool
}
func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command {
@ -66,6 +67,7 @@ func newReleaseTestCmd(c helm.Interface, out io.Writer) *cobra.Command {
f := cmd.Flags()
f.Int64Var(&rlsTest.timeout, "timeout", 300, "time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks)")
f.BoolVar(&rlsTest.cleanup, "cleanup", false, "delete test pods upon completion")
f.BoolVar(&rlsTest.logs, "logs", false, "show logs from test pods")
return cmd
}
@ -75,6 +77,7 @@ func (t *releaseTestCmd) run() (err error) {
t.name,
helm.ReleaseTestTimeout(t.timeout),
helm.ReleaseTestCleanup(t.cleanup),
helm.ReleaseTestLogs(t.logs),
)
testErr := &testErr{}

@ -20,6 +20,7 @@ helm test [RELEASE]
```
--cleanup delete test pods upon completion
--logs show logs from test pods
--timeout int time in seconds to wait for any individual Kubernetes operation (like Jobs for hooks) (default 300)
--tls enable TLS for request
--tls-ca-cert string path to TLS CA certificate file (default "$HELM_HOME/ca.pem")
@ -42,4 +43,4 @@ helm test [RELEASE]
### SEE ALSO
* [helm](helm.md) - The Helm package manager for Kubernetes.
###### Auto generated by spf13/cobra on 8-Mar-2018
###### Auto generated by spf13/cobra on 18-May-2018

@ -227,6 +227,13 @@ func ReleaseTestCleanup(cleanup bool) ReleaseTestOption {
}
}
// ReleaseTestLogs is a boolean value representing whether to stream 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) {

@ -631,9 +631,19 @@ func scrubValidationError(err error) error {
return err
}
// WaitAndGetRunningPodPhase waits up to a timeout for a pod to enter running phase.
// Also returns on PodFailed or PodSucceeded. (As we can't go back to Running from these phases).
func (c *Client) WaitAndGetRunningPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return c.waitAndGetPodPhase(namespace, reader, timeout, []core.PodPhase{core.PodRunning, core.PodFailed, core.PodSucceeded})
}
// WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase
// and returns said phase (PodSucceeded or PodFailed qualify).
func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return c.waitAndGetPodPhase(namespace, reader, timeout, []core.PodPhase{core.PodFailed, core.PodSucceeded})
}
func (c *Client) waitAndGetPodPhase(namespace string, reader io.Reader, timeout time.Duration, phases []core.PodPhase) (core.PodPhase, error) {
infos, err := c.Build(namespace, reader)
if err != nil {
return core.PodUnknown, err
@ -645,7 +655,7 @@ func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader,
return core.PodUnknown, fmt.Errorf("%s is not a Pod", info.Name)
}
if err := c.watchPodUntilComplete(timeout, info); err != nil {
if err := c.watchPodUntilPhase(timeout, info, phases); err != nil {
return core.PodUnknown, err
}
@ -657,7 +667,7 @@ func (c *Client) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader,
return status, nil
}
func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Info) error {
func (c *Client) watchPodUntilPhase(timeout time.Duration, info *resource.Info, phases []core.PodPhase) error {
w, err := resource.NewHelper(info.Client, info.Mapping).WatchSingle(info.Namespace, info.Name, info.ResourceVersion)
if err != nil {
return err
@ -665,13 +675,13 @@ func (c *Client) watchPodUntilComplete(timeout time.Duration, info *resource.Inf
c.Log("Watching pod %s for completion with timeout of %v", info.Name, timeout)
_, err = watch.Until(timeout, w, func(e watch.Event) (bool, error) {
return isPodComplete(e)
return isPodInPhase(e, phases)
})
return err
}
func isPodComplete(event watch.Event) (bool, error) {
func isPodInPhase(event watch.Event, phases []core.PodPhase) (bool, error) {
o, ok := event.Object.(*core.Pod)
if !ok {
return true, fmt.Errorf("expected a *core.Pod, got %T", event.Object)
@ -679,10 +689,13 @@ func isPodComplete(event watch.Event) (bool, error) {
if event.Type == watch.Deleted {
return false, fmt.Errorf("pod not found")
}
switch o.Status.Phase {
case core.PodFailed, core.PodSucceeded:
for _, phase := range phases {
if phase == o.Status.Phase {
return true, nil
}
}
return false, nil
}

@ -844,6 +844,8 @@ type TestReleaseRequest struct {
Timeout int64 `protobuf:"varint,2,opt,name=timeout" json:"timeout,omitempty"`
// cleanup specifies whether or not to attempt pod deletion after test completes
Cleanup bool `protobuf:"varint,3,opt,name=cleanup" json:"cleanup,omitempty"`
// logs specifies whether or not to stream logs from the test pods
Logs bool `protobuf:"varint,4,opt,name=logs" json:"logs,omitempty"`
}
func (m *TestReleaseRequest) Reset() { *m = TestReleaseRequest{} }
@ -872,6 +874,13 @@ func (m *TestReleaseRequest) GetCleanup() bool {
return false
}
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" json:"msg,omitempty"`
@ -1376,83 +1385,83 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1235 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0xc4,
0x17, 0xaf, 0xf3, 0x9d, 0x93, 0x6e, 0xfe, 0xd9, 0x69, 0xda, 0xba, 0xfe, 0x2f, 0xa8, 0x18, 0xc1,
0x66, 0x17, 0x36, 0x85, 0xc0, 0x0d, 0x12, 0x42, 0xea, 0x66, 0xa3, 0xb6, 0x50, 0xba, 0x92, 0xb3,
0x5d, 0x24, 0x04, 0x44, 0x6e, 0x32, 0x69, 0xcd, 0x3a, 0x76, 0xf0, 0x8c, 0xcb, 0xf6, 0x96, 0x3b,
0xde, 0x8a, 0x77, 0xe0, 0x92, 0x4b, 0x78, 0x10, 0x34, 0x5f, 0xae, 0x27, 0xb5, 0x5b, 0xd3, 0x9b,
0x78, 0x66, 0xce, 0xf7, 0xef, 0x9c, 0x39, 0x73, 0x02, 0xd6, 0x85, 0xbb, 0xf4, 0xf6, 0x08, 0x8e,
0x2e, 0xbd, 0x29, 0x26, 0x7b, 0xd4, 0xf3, 0x7d, 0x1c, 0xf5, 0x97, 0x51, 0x48, 0x43, 0xd4, 0x65,
0xb4, 0xbe, 0xa2, 0xf5, 0x05, 0xcd, 0xda, 0xe2, 0x12, 0xd3, 0x0b, 0x37, 0xa2, 0xe2, 0x57, 0x70,
0x5b, 0xdb, 0xe9, 0xf3, 0x30, 0x98, 0x7b, 0xe7, 0x92, 0x20, 0x4c, 0x44, 0xd8, 0xc7, 0x2e, 0xc1,
0xea, 0xab, 0x09, 0x29, 0x9a, 0x17, 0xcc, 0x43, 0x49, 0xf8, 0xbf, 0x46, 0xa0, 0x98, 0xd0, 0x49,
0x14, 0x07, 0x92, 0xb8, 0xa3, 0x11, 0x09, 0x75, 0x69, 0x4c, 0x34, 0x63, 0x97, 0x38, 0x22, 0x5e,
0x18, 0xa8, 0xaf, 0xa0, 0xd9, 0x7f, 0x94, 0x60, 0xe3, 0xd8, 0x23, 0xd4, 0x11, 0x82, 0xc4, 0xc1,
0xbf, 0xc4, 0x98, 0x50, 0xd4, 0x85, 0xaa, 0xef, 0x2d, 0x3c, 0x6a, 0x1a, 0xbb, 0x46, 0xaf, 0xec,
0x88, 0x0d, 0xda, 0x82, 0x5a, 0x38, 0x9f, 0x13, 0x4c, 0xcd, 0xd2, 0xae, 0xd1, 0x6b, 0x3a, 0x72,
0x87, 0xbe, 0x82, 0x3a, 0x09, 0x23, 0x3a, 0x39, 0xbb, 0x32, 0xcb, 0xbb, 0x46, 0xaf, 0x3d, 0xf8,
0xa0, 0x9f, 0x85, 0x53, 0x9f, 0x59, 0x1a, 0x87, 0x11, 0xed, 0xb3, 0x9f, 0xe7, 0x57, 0x4e, 0x8d,
0xf0, 0x2f, 0xd3, 0x3b, 0xf7, 0x7c, 0x8a, 0x23, 0xb3, 0x22, 0xf4, 0x8a, 0x1d, 0x3a, 0x00, 0xe0,
0x7a, 0xc3, 0x68, 0x86, 0x23, 0xb3, 0xca, 0x55, 0xf7, 0x0a, 0xa8, 0x7e, 0xc9, 0xf8, 0x9d, 0x26,
0x51, 0x4b, 0xf4, 0x25, 0xac, 0x0b, 0x48, 0x26, 0xd3, 0x70, 0x86, 0x89, 0x59, 0xdb, 0x2d, 0xf7,
0xda, 0x83, 0x1d, 0xa1, 0x4a, 0xc1, 0x3f, 0x16, 0xa0, 0x0d, 0xc3, 0x19, 0x76, 0x5a, 0x82, 0x9d,
0xad, 0x09, 0x7a, 0x04, 0xcd, 0xc0, 0x5d, 0x60, 0xb2, 0x74, 0xa7, 0xd8, 0xac, 0x73, 0x0f, 0xaf,
0x0f, 0xec, 0x9f, 0xa0, 0xa1, 0x8c, 0xdb, 0x03, 0xa8, 0x89, 0xd0, 0x50, 0x0b, 0xea, 0xa7, 0x27,
0xdf, 0x9c, 0xbc, 0xfc, 0xee, 0xa4, 0xb3, 0x86, 0x1a, 0x50, 0x39, 0xd9, 0xff, 0x76, 0xd4, 0x31,
0xd0, 0x43, 0x78, 0x70, 0xbc, 0x3f, 0x7e, 0x35, 0x71, 0x46, 0xc7, 0xa3, 0xfd, 0xf1, 0xe8, 0x45,
0xa7, 0x64, 0xbf, 0x0b, 0xcd, 0xc4, 0x67, 0x54, 0x87, 0xf2, 0xfe, 0x78, 0x28, 0x44, 0x5e, 0x8c,
0xc6, 0xc3, 0x8e, 0x61, 0xff, 0x6e, 0x40, 0x57, 0x4f, 0x11, 0x59, 0x86, 0x01, 0xc1, 0x2c, 0x47,
0xd3, 0x30, 0x0e, 0x92, 0x1c, 0xf1, 0x0d, 0x42, 0x50, 0x09, 0xf0, 0x5b, 0x95, 0x21, 0xbe, 0x66,
0x9c, 0x34, 0xa4, 0xae, 0xcf, 0xb3, 0x53, 0x76, 0xc4, 0x06, 0x7d, 0x0a, 0x0d, 0x19, 0x3a, 0x31,
0x2b, 0xbb, 0xe5, 0x5e, 0x6b, 0xb0, 0xa9, 0x03, 0x22, 0x2d, 0x3a, 0x09, 0x9b, 0x7d, 0x00, 0xdb,
0x07, 0x58, 0x79, 0x22, 0xf0, 0x52, 0x15, 0xc3, 0xec, 0xba, 0x0b, 0xcc, 0x9d, 0x61, 0x76, 0xdd,
0x05, 0x46, 0x26, 0xd4, 0x65, 0xb9, 0x71, 0x77, 0xaa, 0x8e, 0xda, 0xda, 0x14, 0xcc, 0x9b, 0x8a,
0x64, 0x5c, 0x59, 0x9a, 0x3e, 0x84, 0x0a, 0xbb, 0x09, 0x5c, 0x4d, 0x6b, 0x80, 0x74, 0x3f, 0x8f,
0x82, 0x79, 0xe8, 0x70, 0xba, 0x9e, 0xaa, 0xf2, 0x6a, 0xaa, 0x0e, 0xd3, 0x56, 0x87, 0x61, 0x40,
0x71, 0x40, 0xef, 0xe7, 0xff, 0x31, 0xec, 0x64, 0x68, 0x92, 0x01, 0xec, 0x41, 0x5d, 0xba, 0xc6,
0xb5, 0xe5, 0xe2, 0xaa, 0xb8, 0xec, 0xbf, 0x4b, 0xd0, 0x3d, 0x5d, 0xce, 0x5c, 0x8a, 0x15, 0xe9,
0x16, 0xa7, 0x1e, 0x43, 0x95, 0x77, 0x14, 0x89, 0xc5, 0x43, 0xa1, 0x5b, 0xb4, 0x9d, 0x21, 0xfb,
0x75, 0x04, 0x1d, 0x3d, 0x85, 0xda, 0xa5, 0xeb, 0xc7, 0x98, 0x70, 0x20, 0x12, 0xd4, 0x24, 0x27,
0x6f, 0x47, 0x8e, 0xe4, 0x40, 0xdb, 0x50, 0x9f, 0x45, 0x57, 0xac, 0x9f, 0xf0, 0x2b, 0xd8, 0x70,
0x6a, 0xb3, 0xe8, 0xca, 0x89, 0x03, 0xf4, 0x3e, 0x3c, 0x98, 0x79, 0xc4, 0x3d, 0xf3, 0xf1, 0xe4,
0x22, 0x0c, 0xdf, 0x10, 0x7e, 0x0b, 0x1b, 0xce, 0xba, 0x3c, 0x3c, 0x64, 0x67, 0xc8, 0x62, 0x95,
0x34, 0x8d, 0xb0, 0x4b, 0xb1, 0x59, 0xe3, 0xf4, 0x64, 0xcf, 0x30, 0xa4, 0xde, 0x02, 0x87, 0x31,
0xe5, 0x57, 0xa7, 0xec, 0xa8, 0x2d, 0x7a, 0x0f, 0xd6, 0x23, 0x4c, 0x30, 0x9d, 0x48, 0x2f, 0x1b,
0x5c, 0xb2, 0xc5, 0xcf, 0x5e, 0x0b, 0xb7, 0x10, 0x54, 0x7e, 0x75, 0x3d, 0x6a, 0x36, 0x39, 0x89,
0xaf, 0x85, 0x58, 0x4c, 0xb0, 0x12, 0x03, 0x25, 0x16, 0x13, 0x2c, 0xc5, 0xba, 0x50, 0x9d, 0x87,
0xd1, 0x14, 0x9b, 0x2d, 0x4e, 0x13, 0x1b, 0xfb, 0x10, 0x36, 0x57, 0x40, 0xbe, 0x6f, 0xbe, 0xfe,
0x31, 0x60, 0xcb, 0x09, 0x7d, 0xff, 0xcc, 0x9d, 0xbe, 0x29, 0x90, 0xb1, 0x14, 0xb8, 0xa5, 0xdb,
0xc1, 0x2d, 0x67, 0x80, 0x9b, 0x2a, 0xc2, 0x8a, 0x56, 0x84, 0x1a, 0xec, 0xd5, 0x7c, 0xd8, 0x6b,
0x3a, 0xec, 0x0a, 0xd3, 0x7a, 0x0a, 0xd3, 0x04, 0xb0, 0x46, 0x1a, 0xb0, 0xaf, 0x61, 0xfb, 0x46,
0x94, 0xf7, 0x85, 0xec, 0xcf, 0x12, 0x6c, 0x1e, 0x05, 0x84, 0xba, 0xbe, 0xbf, 0x82, 0x58, 0x52,
0xcf, 0x46, 0xe1, 0x7a, 0x2e, 0xfd, 0x97, 0x7a, 0x2e, 0x6b, 0x90, 0xab, 0xfc, 0x54, 0x52, 0xf9,
0x29, 0x54, 0xe3, 0x5a, 0x67, 0xa9, 0xad, 0x74, 0x16, 0xf4, 0x0e, 0x80, 0x28, 0x4a, 0xae, 0x5c,
0x40, 0xdb, 0xe4, 0x27, 0x27, 0xb2, 0x91, 0xa8, 0x6c, 0x34, 0xb2, 0xb3, 0x91, 0xae, 0xf0, 0x1e,
0x74, 0x94, 0x3f, 0xd3, 0x68, 0xc6, 0x7d, 0x92, 0x55, 0xde, 0x96, 0xe7, 0xc3, 0x68, 0xc6, 0xbc,
0xb2, 0x8f, 0x60, 0x6b, 0x15, 0xd4, 0xfb, 0x26, 0xe8, 0x37, 0x03, 0xb6, 0x4f, 0x03, 0x2f, 0x33,
0x45, 0x59, 0x45, 0x7d, 0x03, 0xb4, 0x52, 0x06, 0x68, 0x5d, 0xa8, 0x2e, 0xe3, 0xe8, 0x1c, 0xcb,
0x24, 0x88, 0x4d, 0x1a, 0x8d, 0x8a, 0x86, 0x86, 0x3d, 0x01, 0xf3, 0xa6, 0x0f, 0xf7, 0x8c, 0x88,
0x79, 0x9d, 0xbc, 0x19, 0x4d, 0xf1, 0x3e, 0xd8, 0x1b, 0xf0, 0xf0, 0x00, 0xd3, 0xd7, 0xe2, 0x02,
0xc9, 0xf0, 0xec, 0x11, 0xa0, 0xf4, 0xe1, 0xb5, 0x3d, 0x79, 0xa4, 0xdb, 0x53, 0x03, 0x94, 0xe2,
0x57, 0x5c, 0xf6, 0x17, 0x5c, 0xf7, 0xa1, 0x47, 0x68, 0x18, 0x5d, 0xdd, 0x06, 0x5d, 0x07, 0xca,
0x0b, 0xf7, 0xad, 0x7c, 0x52, 0xd8, 0xd2, 0x3e, 0xe0, 0x1e, 0x24, 0xa2, 0xd2, 0x83, 0xf4, 0x03,
0x6d, 0x14, 0x7b, 0xa0, 0x7f, 0x00, 0xf4, 0x0a, 0x27, 0xb3, 0xc2, 0x1d, 0x6f, 0x9b, 0x4a, 0x42,
0x49, 0x2f, 0x49, 0x13, 0xea, 0x53, 0x1f, 0xbb, 0x41, 0xbc, 0x94, 0x69, 0x53, 0x5b, 0xfb, 0x47,
0xd8, 0xd0, 0xb4, 0x4b, 0x3f, 0x59, 0x3c, 0xe4, 0x5c, 0x6a, 0x67, 0x4b, 0xf4, 0x39, 0xd4, 0xc4,
0x00, 0xc5, 0x75, 0xb7, 0x07, 0x8f, 0x74, 0xbf, 0xb9, 0x92, 0x38, 0x90, 0x13, 0x97, 0x23, 0x79,
0x07, 0x7f, 0x35, 0xa0, 0xad, 0x46, 0x02, 0x31, 0xde, 0x21, 0x0f, 0xd6, 0xd3, 0xb3, 0x0f, 0x7a,
0x92, 0x3f, 0xfd, 0xad, 0x8c, 0xb0, 0xd6, 0xd3, 0x22, 0xac, 0x22, 0x02, 0x7b, 0xed, 0x13, 0x03,
0x11, 0xe8, 0xac, 0x8e, 0x24, 0xe8, 0x59, 0xb6, 0x8e, 0x9c, 0x19, 0xc8, 0xea, 0x17, 0x65, 0x57,
0x66, 0xd1, 0x25, 0xaf, 0x19, 0x7d, 0x8e, 0x40, 0x77, 0xaa, 0xd1, 0x47, 0x17, 0x6b, 0xaf, 0x30,
0x7f, 0x62, 0xf7, 0x67, 0x78, 0xa0, 0xbd, 0x85, 0x28, 0x07, 0xad, 0xac, 0xa9, 0xc4, 0xfa, 0xa8,
0x10, 0x6f, 0x62, 0x6b, 0x01, 0x6d, 0xbd, 0x49, 0xa1, 0x1c, 0x05, 0x99, 0xef, 0x83, 0xf5, 0x71,
0x31, 0xe6, 0xc4, 0x1c, 0x81, 0xce, 0x6a, 0x0f, 0xc9, 0xcb, 0x63, 0x4e, 0xbf, 0xcb, 0xcb, 0x63,
0x5e, 0x6b, 0xb2, 0xd7, 0x90, 0x0b, 0x70, 0xdd, 0x42, 0xd0, 0xe3, 0xdc, 0x84, 0xe8, 0x9d, 0xc7,
0xea, 0xdd, 0xcd, 0x98, 0x98, 0x58, 0xc2, 0xff, 0x56, 0x5e, 0x63, 0x94, 0x03, 0x4d, 0xf6, 0x68,
0x62, 0x3d, 0x2b, 0xc8, 0xbd, 0x12, 0x94, 0xec, 0x4a, 0xb7, 0x04, 0xa5, 0xb7, 0xbc, 0x5b, 0x82,
0x5a, 0x69, 0x70, 0xf6, 0x1a, 0xf2, 0xa0, 0xed, 0xc4, 0x81, 0x34, 0xcd, 0xda, 0x02, 0xca, 0x91,
0xbe, 0xd9, 0xd5, 0xac, 0x27, 0x05, 0x38, 0xaf, 0xef, 0xf7, 0x73, 0xf8, 0xbe, 0xa1, 0x58, 0xcf,
0x6a, 0xfc, 0xdf, 0xef, 0x67, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5d, 0xc3, 0xd5, 0x55, 0xeb,
0x0f, 0x00, 0x00,
// 1242 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x57, 0xdd, 0x6e, 0xe3, 0x44,
0x14, 0xae, 0xf3, 0x9f, 0x93, 0x6e, 0xc8, 0x4e, 0xd3, 0xd6, 0x35, 0x0b, 0x2a, 0x46, 0xb0, 0xd9,
0x85, 0x4d, 0x21, 0x70, 0x83, 0x84, 0x90, 0xba, 0xd9, 0xa8, 0x2d, 0x94, 0xae, 0xe4, 0x6c, 0x17,
0x09, 0x09, 0x22, 0x37, 0x99, 0xb4, 0x66, 0x1d, 0x3b, 0x78, 0xc6, 0x65, 0x7b, 0xcb, 0x1d, 0x6f,
0xc5, 0x3b, 0x70, 0xc9, 0x25, 0x3c, 0x08, 0x9a, 0x3f, 0xd7, 0x93, 0xda, 0xad, 0xe9, 0x4d, 0x3c,
0x33, 0xe7, 0xff, 0x3b, 0x67, 0xce, 0x9c, 0x80, 0x75, 0xe1, 0x2e, 0xbd, 0x3d, 0x82, 0xa3, 0x4b,
0x6f, 0x8a, 0xc9, 0x1e, 0xf5, 0x7c, 0x1f, 0x47, 0xfd, 0x65, 0x14, 0xd2, 0x10, 0x75, 0x19, 0xad,
0xaf, 0x68, 0x7d, 0x41, 0xb3, 0xb6, 0xb8, 0xc4, 0xf4, 0xc2, 0x8d, 0xa8, 0xf8, 0x15, 0xdc, 0xd6,
0x76, 0xfa, 0x3c, 0x0c, 0xe6, 0xde, 0xb9, 0x24, 0x08, 0x13, 0x11, 0xf6, 0xb1, 0x4b, 0xb0, 0xfa,
0x6a, 0x42, 0x8a, 0xe6, 0x05, 0xf3, 0x50, 0x12, 0xde, 0xd5, 0x08, 0x14, 0x13, 0x3a, 0x89, 0xe2,
0x40, 0x12, 0x77, 0x34, 0x22, 0xa1, 0x2e, 0x8d, 0x89, 0x66, 0xec, 0x12, 0x47, 0xc4, 0x0b, 0x03,
0xf5, 0x15, 0x34, 0xfb, 0xcf, 0x12, 0x6c, 0x1c, 0x7b, 0x84, 0x3a, 0x42, 0x90, 0x38, 0xf8, 0xd7,
0x18, 0x13, 0x8a, 0xba, 0x50, 0xf5, 0xbd, 0x85, 0x47, 0x4d, 0x63, 0xd7, 0xe8, 0x95, 0x1d, 0xb1,
0x41, 0x5b, 0x50, 0x0b, 0xe7, 0x73, 0x82, 0xa9, 0x59, 0xda, 0x35, 0x7a, 0x4d, 0x47, 0xee, 0xd0,
0x37, 0x50, 0x27, 0x61, 0x44, 0x27, 0x67, 0x57, 0x66, 0x79, 0xd7, 0xe8, 0xb5, 0x07, 0x1f, 0xf5,
0xb3, 0x70, 0xea, 0x33, 0x4b, 0xe3, 0x30, 0xa2, 0x7d, 0xf6, 0xf3, 0xfc, 0xca, 0xa9, 0x11, 0xfe,
0x65, 0x7a, 0xe7, 0x9e, 0x4f, 0x71, 0x64, 0x56, 0x84, 0x5e, 0xb1, 0x43, 0x07, 0x00, 0x5c, 0x6f,
0x18, 0xcd, 0x70, 0x64, 0x56, 0xb9, 0xea, 0x5e, 0x01, 0xd5, 0x2f, 0x19, 0xbf, 0xd3, 0x24, 0x6a,
0x89, 0xbe, 0x86, 0x75, 0x01, 0xc9, 0x64, 0x1a, 0xce, 0x30, 0x31, 0x6b, 0xbb, 0xe5, 0x5e, 0x7b,
0xb0, 0x23, 0x54, 0x29, 0xf8, 0xc7, 0x02, 0xb4, 0x61, 0x38, 0xc3, 0x4e, 0x4b, 0xb0, 0xb3, 0x35,
0x41, 0x8f, 0xa0, 0x19, 0xb8, 0x0b, 0x4c, 0x96, 0xee, 0x14, 0x9b, 0x75, 0xee, 0xe1, 0xf5, 0x81,
0xfd, 0x33, 0x34, 0x94, 0x71, 0x7b, 0x00, 0x35, 0x11, 0x1a, 0x6a, 0x41, 0xfd, 0xf4, 0xe4, 0xbb,
0x93, 0x97, 0x3f, 0x9c, 0x74, 0xd6, 0x50, 0x03, 0x2a, 0x27, 0xfb, 0xdf, 0x8f, 0x3a, 0x06, 0x7a,
0x08, 0x0f, 0x8e, 0xf7, 0xc7, 0xaf, 0x26, 0xce, 0xe8, 0x78, 0xb4, 0x3f, 0x1e, 0xbd, 0xe8, 0x94,
0xec, 0xf7, 0xa1, 0x99, 0xf8, 0x8c, 0xea, 0x50, 0xde, 0x1f, 0x0f, 0x85, 0xc8, 0x8b, 0xd1, 0x78,
0xd8, 0x31, 0xec, 0x3f, 0x0c, 0xe8, 0xea, 0x29, 0x22, 0xcb, 0x30, 0x20, 0x98, 0xe5, 0x68, 0x1a,
0xc6, 0x41, 0x92, 0x23, 0xbe, 0x41, 0x08, 0x2a, 0x01, 0x7e, 0xab, 0x32, 0xc4, 0xd7, 0x8c, 0x93,
0x86, 0xd4, 0xf5, 0x79, 0x76, 0xca, 0x8e, 0xd8, 0xa0, 0xcf, 0xa1, 0x21, 0x43, 0x27, 0x66, 0x65,
0xb7, 0xdc, 0x6b, 0x0d, 0x36, 0x75, 0x40, 0xa4, 0x45, 0x27, 0x61, 0xb3, 0x0f, 0x60, 0xfb, 0x00,
0x2b, 0x4f, 0x04, 0x5e, 0xaa, 0x62, 0x98, 0x5d, 0x77, 0x81, 0xb9, 0x33, 0xcc, 0xae, 0xbb, 0xc0,
0xc8, 0x84, 0xba, 0x2c, 0x37, 0xee, 0x4e, 0xd5, 0x51, 0x5b, 0x9b, 0x82, 0x79, 0x53, 0x91, 0x8c,
0x2b, 0x4b, 0xd3, 0xc7, 0x50, 0x61, 0x37, 0x81, 0xab, 0x69, 0x0d, 0x90, 0xee, 0xe7, 0x51, 0x30,
0x0f, 0x1d, 0x4e, 0xd7, 0x53, 0x55, 0x5e, 0x4d, 0xd5, 0x61, 0xda, 0xea, 0x30, 0x0c, 0x28, 0x0e,
0xe8, 0xfd, 0xfc, 0x3f, 0x86, 0x9d, 0x0c, 0x4d, 0x32, 0x80, 0x3d, 0xa8, 0x4b, 0xd7, 0xb8, 0xb6,
0x5c, 0x5c, 0x15, 0x97, 0xfd, 0x4f, 0x09, 0xba, 0xa7, 0xcb, 0x99, 0x4b, 0xb1, 0x22, 0xdd, 0xe2,
0xd4, 0x63, 0xa8, 0xf2, 0x8e, 0x22, 0xb1, 0x78, 0x28, 0x74, 0x8b, 0xb6, 0x33, 0x64, 0xbf, 0x8e,
0xa0, 0xa3, 0xa7, 0x50, 0xbb, 0x74, 0xfd, 0x18, 0x13, 0x0e, 0x44, 0x82, 0x9a, 0xe4, 0xe4, 0xed,
0xc8, 0x91, 0x1c, 0x68, 0x1b, 0xea, 0xb3, 0xe8, 0x8a, 0xf5, 0x13, 0x7e, 0x05, 0x1b, 0x4e, 0x6d,
0x16, 0x5d, 0x39, 0x71, 0x80, 0x3e, 0x84, 0x07, 0x33, 0x8f, 0xb8, 0x67, 0x3e, 0x9e, 0x5c, 0x84,
0xe1, 0x1b, 0xc2, 0x6f, 0x61, 0xc3, 0x59, 0x97, 0x87, 0x87, 0xec, 0x0c, 0x59, 0xac, 0x92, 0xa6,
0x11, 0x76, 0x29, 0x36, 0x6b, 0x9c, 0x9e, 0xec, 0x19, 0x86, 0xd4, 0x5b, 0xe0, 0x30, 0xa6, 0xfc,
0xea, 0x94, 0x1d, 0xb5, 0x45, 0x1f, 0xc0, 0x7a, 0x84, 0x09, 0xa6, 0x13, 0xe9, 0x65, 0x83, 0x4b,
0xb6, 0xf8, 0xd9, 0x6b, 0xe1, 0x16, 0x82, 0xca, 0x6f, 0xae, 0x47, 0xcd, 0x26, 0x27, 0xf1, 0xb5,
0x10, 0x8b, 0x09, 0x56, 0x62, 0xa0, 0xc4, 0x62, 0x82, 0xa5, 0x58, 0x17, 0xaa, 0xf3, 0x30, 0x9a,
0x62, 0xb3, 0xc5, 0x69, 0x62, 0x63, 0x1f, 0xc2, 0xe6, 0x0a, 0xc8, 0xf7, 0xcd, 0xd7, 0xbf, 0x06,
0x6c, 0x39, 0xa1, 0xef, 0x9f, 0xb9, 0xd3, 0x37, 0x05, 0x32, 0x96, 0x02, 0xb7, 0x74, 0x3b, 0xb8,
0xe5, 0x0c, 0x70, 0x53, 0x45, 0x58, 0xd1, 0x8a, 0x50, 0x83, 0xbd, 0x9a, 0x0f, 0x7b, 0x4d, 0x87,
0x5d, 0x61, 0x5a, 0x4f, 0x61, 0x9a, 0x00, 0xd6, 0x48, 0x03, 0xf6, 0x2d, 0x6c, 0xdf, 0x88, 0xf2,
0xbe, 0x90, 0xfd, 0x55, 0x82, 0xcd, 0xa3, 0x80, 0x50, 0xd7, 0xf7, 0x57, 0x10, 0x4b, 0xea, 0xd9,
0x28, 0x5c, 0xcf, 0xa5, 0xff, 0x53, 0xcf, 0x65, 0x0d, 0x72, 0x95, 0x9f, 0x4a, 0x2a, 0x3f, 0x85,
0x6a, 0x5c, 0xeb, 0x2c, 0xb5, 0x95, 0xce, 0x82, 0xde, 0x03, 0x10, 0x45, 0xc9, 0x95, 0x0b, 0x68,
0x9b, 0xfc, 0xe4, 0x44, 0x36, 0x12, 0x95, 0x8d, 0x46, 0x76, 0x36, 0xd2, 0x15, 0xde, 0x83, 0x8e,
0xf2, 0x67, 0x1a, 0xcd, 0xb8, 0x4f, 0xb2, 0xca, 0xdb, 0xf2, 0x7c, 0x18, 0xcd, 0x98, 0x57, 0xf6,
0x11, 0x6c, 0xad, 0x82, 0x7a, 0xdf, 0x04, 0xfd, 0x6e, 0xc0, 0xf6, 0x69, 0xe0, 0x65, 0xa6, 0x28,
0xab, 0xa8, 0x6f, 0x80, 0x56, 0xca, 0x00, 0xad, 0x0b, 0xd5, 0x65, 0x1c, 0x9d, 0x63, 0x99, 0x04,
0xb1, 0x49, 0xa3, 0x51, 0xd1, 0xd0, 0xb0, 0x27, 0x60, 0xde, 0xf4, 0xe1, 0x9e, 0x11, 0x31, 0xaf,
0x93, 0x37, 0xa3, 0x29, 0xde, 0x07, 0x7b, 0x03, 0x1e, 0x1e, 0x60, 0xfa, 0x5a, 0x5c, 0x20, 0x19,
0x9e, 0x3d, 0x02, 0x94, 0x3e, 0xbc, 0xb6, 0x27, 0x8f, 0x74, 0x7b, 0x6a, 0x80, 0x52, 0xfc, 0x8a,
0xcb, 0xfe, 0x8a, 0xeb, 0x3e, 0xf4, 0x08, 0x0d, 0xa3, 0xab, 0xdb, 0xa0, 0xeb, 0x40, 0x79, 0xe1,
0xbe, 0x95, 0x4f, 0x0a, 0x5b, 0xda, 0x07, 0xdc, 0x83, 0x44, 0x54, 0x7a, 0x90, 0x7e, 0xa0, 0x8d,
0x62, 0x0f, 0xf4, 0x12, 0xd0, 0x2b, 0x9c, 0xcc, 0x0a, 0x77, 0xbc, 0x6d, 0x2a, 0x09, 0x25, 0xbd,
0x24, 0x4d, 0xa8, 0x4f, 0x7d, 0xec, 0x06, 0xf1, 0x52, 0xa6, 0x4d, 0x6d, 0x99, 0x1e, 0x3f, 0x3c,
0x27, 0xf2, 0x89, 0xe0, 0x6b, 0xfb, 0x27, 0xd8, 0xd0, 0x2c, 0x4a, 0xdf, 0x59, 0x8c, 0xe4, 0x5c,
0x5a, 0x64, 0x4b, 0xf4, 0x25, 0xd4, 0xc4, 0x50, 0xc5, 0xed, 0xb5, 0x07, 0x8f, 0xf4, 0x58, 0xb8,
0x92, 0x38, 0x90, 0x53, 0x98, 0x23, 0x79, 0x07, 0x7f, 0x37, 0xa0, 0xad, 0xc6, 0x04, 0x31, 0xf2,
0x21, 0x0f, 0xd6, 0xd3, 0xf3, 0x10, 0x7a, 0x92, 0x3f, 0x11, 0xae, 0x8c, 0xb5, 0xd6, 0xd3, 0x22,
0xac, 0x22, 0x02, 0x7b, 0xed, 0x33, 0x03, 0x11, 0xe8, 0xac, 0x8e, 0x29, 0xe8, 0x59, 0xb6, 0x8e,
0x9c, 0xb9, 0xc8, 0xea, 0x17, 0x65, 0x57, 0x66, 0xd1, 0x25, 0xaf, 0x23, 0x7d, 0xb6, 0x40, 0x77,
0xaa, 0xd1, 0xc7, 0x19, 0x6b, 0xaf, 0x30, 0x7f, 0x62, 0xf7, 0x17, 0x78, 0xa0, 0xbd, 0x8f, 0x28,
0x07, 0xad, 0xac, 0x49, 0xc5, 0xfa, 0xa4, 0x10, 0x6f, 0x62, 0x6b, 0x01, 0x6d, 0xbd, 0x71, 0xa1,
0x1c, 0x05, 0x99, 0x6f, 0x86, 0xf5, 0x69, 0x31, 0xe6, 0xc4, 0x1c, 0x81, 0xce, 0x6a, 0x5f, 0xc9,
0xcb, 0x63, 0x4e, 0x0f, 0xcc, 0xcb, 0x63, 0x5e, 0xbb, 0xb2, 0xd7, 0x90, 0x0b, 0x70, 0xdd, 0x56,
0xd0, 0xe3, 0xdc, 0x84, 0xe8, 0xdd, 0xc8, 0xea, 0xdd, 0xcd, 0x98, 0x98, 0x58, 0xc2, 0x3b, 0x2b,
0x2f, 0x34, 0xca, 0x81, 0x26, 0x7b, 0x5c, 0xb1, 0x9e, 0x15, 0xe4, 0x5e, 0x09, 0x4a, 0x76, 0xaa,
0x5b, 0x82, 0xd2, 0xdb, 0xe0, 0x2d, 0x41, 0xad, 0x34, 0x3d, 0x7b, 0x0d, 0x79, 0xd0, 0x76, 0xe2,
0x40, 0x9a, 0x66, 0x6d, 0x01, 0xe5, 0x48, 0xdf, 0xec, 0x74, 0xd6, 0x93, 0x02, 0x9c, 0xd7, 0xf7,
0xfb, 0x39, 0xfc, 0xd8, 0x50, 0xac, 0x67, 0x35, 0xfe, 0x8f, 0xf8, 0x8b, 0xff, 0x02, 0x00, 0x00,
0xff, 0xff, 0x78, 0xb4, 0x88, 0x6b, 0xff, 0x0f, 0x00, 0x00,
}

@ -17,6 +17,7 @@ limitations under the License.
package releasetesting
import (
"bufio"
"bytes"
"fmt"
"log"
@ -35,6 +36,7 @@ type Environment struct {
KubeClient environment.KubeClient
Stream services.ReleaseService_RunReleaseTestServer
Timeout int64
StreamLogs bool
}
func (env *Environment) createTestPod(test *test) error {
@ -111,6 +113,51 @@ func (env *Environment) streamMessage(msg string, status release.TestRun_Status)
return env.Stream.Send(resp)
}
func (env *Environment) beginLogStream(t *test) error {
if _, err := env.KubeClient.WaitAndGetRunningPodPhase(env.Namespace, bytes.NewBufferString(t.manifest), time.Duration(env.Timeout)*time.Second); err != nil {
return err
}
infos, err := env.KubeClient.BuildUnstructured(env.Namespace, bytes.NewBufferString(t.manifest))
if err != nil {
return err
}
// A test manifest is always a single pod, so we don't need to be overly
// careful here. This is checked earlier in the test run (in `newTest`)
pod := infos[0].AsInternal().(*core.Pod)
opt := &core.PodLogOptions{
Container: pod.Spec.Containers[0].Name,
Follow: true,
Previous: false,
Timestamps: false,
}
env.Stream.Send(&services.TestReleaseResponse{
Msg: fmt.Sprintf("Streaming logs from container \"%s\"", opt.Container),
Status: release.TestRun_RUNNING,
})
req, err := env.KubeClient.LogsForObject(pod, opt, time.Duration(env.Timeout)*time.Second)
if err != nil {
return err
}
readCloser, err := req.Stream()
if err != nil {
return err
}
defer readCloser.Close()
scanner := bufio.NewScanner(readCloser)
for scanner.Scan() {
resp := &services.TestReleaseResponse{Msg: scanner.Text(), Status: release.TestRun_RUNNING}
env.Stream.Send(resp)
}
return err
}
// DeleteTestPods deletes resources given in testManifests
func (env *Environment) DeleteTestPods(testManifests []string) {
for _, testManifest := range testManifests {

@ -92,7 +92,26 @@ func (ts *TestSuite) Run(env *Environment) error {
resourceCleanExit := true
status := core.PodUnknown
if resourceCreated {
logChan := make(chan bool)
if env.StreamLogs {
go func() {
if err := env.beginLogStream(test); err != nil {
// We don't want to fail the tests if logging failed for whatever reason,
// so use UNKNOWN state not ERROR.
env.streamMessage(err.Error(), release.TestRun_UNKNOWN)
}
logChan <- true
}()
}
status, err = env.getTestPodStatus(test)
// Wait for log streaming to finish, which should be before
// the pod finishes anyway.
if env.StreamLogs {
<-logChan
}
if err != nil {
resourceCleanExit = false
if streamErr := env.streamError(test.result.Info); streamErr != nil {

@ -26,6 +26,8 @@ import (
"io"
"time"
"k8s.io/apimachinery/pkg/runtime"
restclient "k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/kubectl/resource"
@ -143,6 +145,12 @@ type KubeClient interface {
// WaitAndGetCompletedPodPhase waits up to a timeout until a pod enters a completed phase
// and returns said phase (PodSucceeded or PodFailed qualify).
WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error)
// WaitAndGetRunningPodPhase waits up to a timeout for a pod to enter running phase.
// Also returns on PodFailed or PodSucceeded (As we can't go back to Running from these phases).
WaitAndGetRunningPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error)
LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error)
}
// PrintingKubeClient implements KubeClient, but simply prints the reader to
@ -199,6 +207,17 @@ func (p *PrintingKubeClient) WaitAndGetCompletedPodPhase(namespace string, reade
return core.PodUnknown, err
}
// WaitAndGetRunningPodPhase implements KubeClient WaitAndGetRunningPodPhase.
func (p *PrintingKubeClient) WaitAndGetRunningPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
_, err := io.Copy(p.Out, reader)
return core.PodRunning, err
}
// LogsForObject implements KubeClient LogsForObject.
func (p *PrintingKubeClient) LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error) {
return nil, nil
}
// Environment provides the context for executing a client request.
//
// All services in a context are concurrency safe.

@ -22,6 +22,8 @@ import (
"testing"
"time"
"k8s.io/apimachinery/pkg/runtime"
restclient "k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/kubectl/resource"
@ -64,6 +66,12 @@ func (k *mockKubeClient) BuildUnstructured(ns string, reader io.Reader) (kube.Re
func (k *mockKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return core.PodUnknown, nil
}
func (k *mockKubeClient) WaitAndGetRunningPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return core.PodRunning, nil
}
func (k *mockKubeClient) LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error) {
return nil, nil
}
func (k *mockKubeClient) WaitAndGetCompletedPodStatus(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return "", nil

@ -30,6 +30,8 @@ import (
"github.com/golang/protobuf/ptypes/timestamp"
"golang.org/x/net/context"
"google.golang.org/grpc/metadata"
"k8s.io/apimachinery/pkg/runtime"
restclient "k8s.io/client-go/rest"
"k8s.io/kubernetes/pkg/apis/core"
"k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
"k8s.io/kubernetes/pkg/kubectl/resource"
@ -559,6 +561,12 @@ func (kc *mockHooksKubeClient) BuildUnstructured(ns string, reader io.Reader) (k
func (kc *mockHooksKubeClient) WaitAndGetCompletedPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return core.PodUnknown, nil
}
func (kc *mockHooksKubeClient) WaitAndGetRunningPodPhase(namespace string, reader io.Reader, timeout time.Duration) (core.PodPhase, error) {
return core.PodRunning, nil
}
func (kc *mockHooksKubeClient) LogsForObject(object, options runtime.Object, timeout time.Duration) (*restclient.Request, error) {
return nil, nil
}
func deletePolicyStub(kubeClient *mockHooksKubeClient) *ReleaseServer {
e := environment.New()

@ -41,6 +41,7 @@ func (s *ReleaseServer) RunReleaseTest(req *services.TestReleaseRequest, stream
KubeClient: s.env.KubeClient,
Timeout: req.Timeout,
Stream: stream,
StreamLogs: req.Logs,
}
s.Log("running tests for release %s", rel.Name)
tSuite, err := reltesting.NewTestSuite(rel)

Loading…
Cancel
Save