github.com/kubeshop/testkube@v1.17.23/cmd/kubectl-testkube/commands/tests/renderer/test_obj.go (about) 1 package renderer 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/kubeshop/testkube/cmd/kubectl-testkube/commands/renderer" 8 "github.com/kubeshop/testkube/pkg/api/v1/client" 9 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 10 "github.com/kubeshop/testkube/pkg/ui" 11 ) 12 13 type mountParams struct { 14 name string 15 path string 16 } 17 18 func TestRenderer(client client.Client, ui *ui.UI, obj interface{}) error { 19 test, ok := obj.(testkube.Test) 20 if !ok { 21 return fmt.Errorf("can't use '%T' as testkube.Test in RenderObj for test", obj) 22 } 23 24 ui.Warn("Name: ", test.Name) 25 ui.Warn("Namespace:", test.Namespace) 26 ui.Warn("Created: ", test.Created.String()) 27 if test.Description != "" { 28 ui.NL() 29 ui.Warn("Description: ", test.Description) 30 } 31 if len(test.Labels) > 0 { 32 ui.NL() 33 ui.Warn("Labels: ", testkube.MapToString(test.Labels)) 34 } 35 if test.Schedule != "" { 36 ui.NL() 37 ui.Warn("Schedule: ", test.Schedule) 38 } 39 40 if test.Content != nil { 41 ui.NL() 42 ui.Info("Content") 43 ui.Warn("Type", test.Content.Type_) 44 if test.Content.Uri != "" { 45 ui.Warn("Uri: ", test.Content.Uri) 46 } 47 48 if test.Content.Repository != nil { 49 ui.Warn("Repository: ") 50 ui.Warn(" Uri: ", test.Content.Repository.Uri) 51 ui.Warn(" Branch: ", test.Content.Repository.Branch) 52 ui.Warn(" Commit: ", test.Content.Repository.Commit) 53 ui.Warn(" Path: ", test.Content.Repository.Path) 54 if test.Content.Repository.UsernameSecret != nil { 55 ui.Warn(" Username: ", fmt.Sprintf("[secret:%s key:%s]", test.Content.Repository.UsernameSecret.Name, 56 test.Content.Repository.UsernameSecret.Key)) 57 } 58 59 if test.Content.Repository.TokenSecret != nil { 60 ui.Warn(" Token: ", fmt.Sprintf("[secret:%s key:%s]", test.Content.Repository.TokenSecret.Name, 61 test.Content.Repository.TokenSecret.Key)) 62 } 63 64 if test.Content.Repository.CertificateSecret != "" { 65 ui.Warn(" Certificate: ", test.Content.Repository.CertificateSecret) 66 } 67 68 ui.Warn(" Working dir: ", test.Content.Repository.WorkingDir) 69 ui.Warn(" Auth type: ", test.Content.Repository.AuthType) 70 } 71 72 if test.Content.Data != "" { 73 ui.Warn("Data: ", "\n", test.Content.Data) 74 } 75 } 76 77 if test.Source != "" { 78 ui.NL() 79 ui.Warn("Source: ", test.Source) 80 } 81 82 if test.ExecutionRequest != nil { 83 ui.Warn("Execution request: ") 84 if test.ExecutionRequest.Name != "" { 85 ui.Warn(" Name: ", test.ExecutionRequest.Name) 86 } 87 88 if len(test.ExecutionRequest.Variables) > 0 { 89 renderer.RenderVariables(test.ExecutionRequest.Variables) 90 } 91 92 if len(test.ExecutionRequest.Command) > 0 { 93 ui.Warn(" Command: ", test.ExecutionRequest.Command...) 94 } 95 96 if len(test.ExecutionRequest.Args) > 0 { 97 ui.Warn(" Args: ", test.ExecutionRequest.Args...) 98 } 99 100 if test.ExecutionRequest.ArgsMode != "" { 101 ui.Warn(" Args mode: ", test.ExecutionRequest.ArgsMode) 102 } 103 104 if len(test.ExecutionRequest.Envs) > 0 { 105 ui.NL() 106 ui.Warn("(deprecated) Envs: ", testkube.MapToString(test.ExecutionRequest.Envs)) 107 } 108 109 if len(test.ExecutionRequest.SecretEnvs) > 0 { 110 ui.NL() 111 ui.Warn("(deprecated) Secret Envs: ", testkube.MapToString(test.ExecutionRequest.SecretEnvs)) 112 } 113 114 if test.ExecutionRequest.VariablesFile != "" { 115 ui.Warn(" Variables file: ", "\n", test.ExecutionRequest.VariablesFile) 116 ui.Warn(" Is file uploaded: ", "\n", fmt.Sprintf("%t", test.ExecutionRequest.IsVariablesFileUploaded)) 117 } 118 119 if test.ExecutionRequest.HttpProxy != "" { 120 ui.Warn(" Http proxy: ", test.ExecutionRequest.HttpProxy) 121 } 122 123 if test.ExecutionRequest.HttpsProxy != "" { 124 ui.Warn(" Https proxy: ", test.ExecutionRequest.HttpsProxy) 125 } 126 127 if test.ExecutionRequest.ArtifactRequest != nil { 128 ui.Warn(" Artifact request: ") 129 ui.Warn(" Storage class name: ", test.ExecutionRequest.ArtifactRequest.StorageClassName) 130 ui.Warn(" Volume mount path: ", test.ExecutionRequest.ArtifactRequest.VolumeMountPath) 131 ui.Warn(" Dirs: ", strings.Join(test.ExecutionRequest.ArtifactRequest.Dirs, ",")) 132 ui.Warn(" Masks: ", strings.Join(test.ExecutionRequest.ArtifactRequest.Masks, ",")) 133 ui.Warn(" Storage bucket: ", test.ExecutionRequest.ArtifactRequest.StorageBucket) 134 ui.Warn(" Omit folder per execution: ", fmt.Sprint(test.ExecutionRequest.ArtifactRequest.OmitFolderPerExecution)) 135 ui.Warn(" Shared between pods: ", fmt.Sprint(test.ExecutionRequest.ArtifactRequest.SharedBetweenPods)) 136 ui.Warn(" Use default storage class name: ", fmt.Sprint(test.ExecutionRequest.ArtifactRequest.UseDefaultStorageClassName)) 137 } 138 139 if test.ExecutionRequest.JobTemplate != "" { 140 ui.Warn(" Job template: ", "\n", test.ExecutionRequest.JobTemplate) 141 } 142 143 if test.ExecutionRequest.JobTemplateReference != "" { 144 ui.Warn(" Job template reference: ", test.ExecutionRequest.JobTemplateReference) 145 } 146 147 if test.ExecutionRequest.CronJobTemplate != "" { 148 ui.Warn(" Cron job template: ", "\n", test.ExecutionRequest.CronJobTemplate) 149 } 150 151 if test.ExecutionRequest.CronJobTemplateReference != "" { 152 ui.Warn(" Cron job template reference: ", test.ExecutionRequest.CronJobTemplateReference) 153 } 154 155 if test.ExecutionRequest.PreRunScript != "" { 156 ui.Warn(" Pre run script: ", "\n", test.ExecutionRequest.PreRunScript) 157 } 158 159 if test.ExecutionRequest.PostRunScript != "" { 160 ui.Warn(" Post run script: ", "\n", test.ExecutionRequest.PostRunScript) 161 } 162 163 if test.ExecutionRequest.ExecutePostRunScriptBeforeScraping { 164 ui.Warn(" Execute postrun script before scraping: ", fmt.Sprint(test.ExecutionRequest.ExecutePostRunScriptBeforeScraping)) 165 } 166 167 if test.ExecutionRequest.SourceScripts { 168 ui.Warn(" Source scripts: ", fmt.Sprint(test.ExecutionRequest.SourceScripts)) 169 } 170 171 if test.ExecutionRequest.ScraperTemplate != "" { 172 ui.Warn(" Scraper template: ", "\n", test.ExecutionRequest.ScraperTemplate) 173 } 174 175 if test.ExecutionRequest.ScraperTemplateReference != "" { 176 ui.Warn(" Scraper template reference: ", test.ExecutionRequest.ScraperTemplateReference) 177 } 178 179 if test.ExecutionRequest.PvcTemplate != "" { 180 ui.Warn(" PVC template: ", "\n", test.ExecutionRequest.PvcTemplate) 181 } 182 183 if test.ExecutionRequest.PvcTemplateReference != "" { 184 ui.Warn(" PVC template reference: ", test.ExecutionRequest.PvcTemplateReference) 185 } 186 187 if test.ExecutionRequest.ExecutionNamespace != "" { 188 ui.Warn(" Execution namespace: ", test.ExecutionRequest.ExecutionNamespace) 189 } 190 191 if test.ExecutionRequest.SlavePodRequest != nil { 192 ui.Warn(" Slave pod request: ") 193 if test.ExecutionRequest.SlavePodRequest.Resources != nil { 194 ui.Warn(" Resources: ") 195 if test.ExecutionRequest.SlavePodRequest.Resources.Requests != nil { 196 ui.Warn(" Requests: ") 197 ui.Warn(" Cpu: ", test.ExecutionRequest.SlavePodRequest.Resources.Requests.Cpu) 198 ui.Warn(" Memory: ", test.ExecutionRequest.SlavePodRequest.Resources.Requests.Memory) 199 } 200 201 if test.ExecutionRequest.SlavePodRequest.Resources.Limits != nil { 202 ui.Warn(" Limits: ") 203 ui.Warn(" Cpu: ", test.ExecutionRequest.SlavePodRequest.Resources.Limits.Cpu) 204 ui.Warn(" Memory: ", test.ExecutionRequest.SlavePodRequest.Resources.Limits.Memory) 205 } 206 } 207 208 if test.ExecutionRequest.SlavePodRequest.PodTemplate != "" { 209 ui.Warn(" Pod template: ", "\n", test.ExecutionRequest.SlavePodRequest.PodTemplate) 210 } 211 212 if test.ExecutionRequest.SlavePodRequest.PodTemplateReference != "" { 213 ui.Warn(" Pod template reference: ", test.ExecutionRequest.SlavePodRequest.PodTemplateReference) 214 } 215 } 216 217 var mountConfigMaps, mountSecrets []mountParams 218 var variableConfigMaps, variableSecrets []string 219 for _, configMap := range test.ExecutionRequest.EnvConfigMaps { 220 if configMap.Reference == nil { 221 continue 222 } 223 224 if configMap.Mount { 225 mountConfigMaps = append(mountConfigMaps, mountParams{ 226 name: configMap.Reference.Name, 227 path: configMap.MountPath, 228 }) 229 } 230 231 if configMap.MapToVariables { 232 variableConfigMaps = append(variableConfigMaps, configMap.Reference.Name) 233 } 234 } 235 236 for _, secret := range test.ExecutionRequest.EnvSecrets { 237 if secret.Reference == nil { 238 continue 239 } 240 241 if secret.Mount { 242 mountSecrets = append(mountSecrets, mountParams{ 243 name: secret.Reference.Name, 244 path: secret.MountPath, 245 }) 246 } 247 248 if secret.MapToVariables { 249 variableSecrets = append(variableSecrets, secret.Reference.Name) 250 } 251 } 252 253 if len(mountConfigMaps) > 0 { 254 ui.NL() 255 ui.Warn(" Mount config maps: ") 256 for _, mount := range mountConfigMaps { 257 ui.Warn(" - name : ", mount.name) 258 ui.Warn(" - mount path: ", mount.path) 259 } 260 } 261 262 if len(variableConfigMaps) > 0 { 263 ui.NL() 264 ui.Warn(" Variable config maps: ", variableConfigMaps...) 265 } 266 267 if len(mountSecrets) > 0 { 268 ui.NL() 269 ui.Warn(" Mount secrets: ") 270 for _, mount := range mountSecrets { 271 ui.Warn(" - name : ", mount.name) 272 ui.Warn(" - mount path: ", mount.path) 273 } 274 } 275 276 if len(variableSecrets) > 0 { 277 ui.NL() 278 ui.Warn(" Variable secrets: ", variableSecrets...) 279 } 280 } 281 282 return nil 283 284 }