github.com/umeshredd/helm@v3.0.0-alpha.1+incompatible/pkg/releasetesting/environment.go (about)

     1  /*
     2  Copyright The Helm Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package releasetesting
    18  
    19  import (
    20  	"bytes"
    21  	"fmt"
    22  	"log"
    23  	"time"
    24  
    25  	v1 "k8s.io/api/core/v1"
    26  
    27  	"helm.sh/helm/pkg/kube"
    28  	"helm.sh/helm/pkg/release"
    29  )
    30  
    31  // Environment encapsulates information about where test suite executes and returns results
    32  type Environment struct {
    33  	Namespace  string
    34  	KubeClient kube.Interface
    35  	Messages   chan *release.TestReleaseResponse
    36  	Timeout    time.Duration
    37  }
    38  
    39  func (env *Environment) createTestPod(test *test) error {
    40  	b := bytes.NewBufferString(test.manifest)
    41  	if err := env.KubeClient.Create(b); err != nil {
    42  		test.result.Info = err.Error()
    43  		test.result.Status = release.TestRunFailure
    44  		return err
    45  	}
    46  
    47  	return nil
    48  }
    49  
    50  func (env *Environment) getTestPodStatus(test *test) (v1.PodPhase, error) {
    51  	status, err := env.KubeClient.WaitAndGetCompletedPodPhase(test.name, env.Timeout)
    52  	if err != nil {
    53  		log.Printf("Error getting status for pod %s: %s", test.result.Name, err)
    54  		test.result.Info = err.Error()
    55  		test.result.Status = release.TestRunUnknown
    56  		return status, err
    57  	}
    58  
    59  	return status, err
    60  }
    61  
    62  func (env *Environment) streamResult(r *release.TestRun) error {
    63  	switch r.Status {
    64  	case release.TestRunSuccess:
    65  		if err := env.streamSuccess(r.Name); err != nil {
    66  			return err
    67  		}
    68  	case release.TestRunFailure:
    69  		if err := env.streamFailed(r.Name); err != nil {
    70  			return err
    71  		}
    72  
    73  	default:
    74  		if err := env.streamUnknown(r.Name, r.Info); err != nil {
    75  			return err
    76  		}
    77  	}
    78  	return nil
    79  }
    80  
    81  func (env *Environment) streamRunning(name string) error {
    82  	msg := "RUNNING: " + name
    83  	return env.streamMessage(msg, release.TestRunRunning)
    84  }
    85  
    86  func (env *Environment) streamError(info string) error {
    87  	msg := "ERROR: " + info
    88  	return env.streamMessage(msg, release.TestRunFailure)
    89  }
    90  
    91  func (env *Environment) streamFailed(name string) error {
    92  	msg := fmt.Sprintf("FAILED: %s, run `kubectl logs %s --namespace %s` for more info", name, name, env.Namespace)
    93  	return env.streamMessage(msg, release.TestRunFailure)
    94  }
    95  
    96  func (env *Environment) streamSuccess(name string) error {
    97  	msg := fmt.Sprintf("PASSED: %s", name)
    98  	return env.streamMessage(msg, release.TestRunSuccess)
    99  }
   100  
   101  func (env *Environment) streamUnknown(name, info string) error {
   102  	msg := fmt.Sprintf("UNKNOWN: %s: %s", name, info)
   103  	return env.streamMessage(msg, release.TestRunUnknown)
   104  }
   105  
   106  func (env *Environment) streamMessage(msg string, status release.TestRunStatus) error {
   107  	resp := &release.TestReleaseResponse{Msg: msg, Status: status}
   108  	env.Messages <- resp
   109  	return nil
   110  }
   111  
   112  // DeleteTestPods deletes resources given in testManifests
   113  func (env *Environment) DeleteTestPods(testManifests []string) {
   114  	for _, testManifest := range testManifests {
   115  		err := env.KubeClient.Delete(bytes.NewBufferString(testManifest))
   116  		if err != nil {
   117  			env.streamError(err.Error())
   118  		}
   119  	}
   120  }