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 }