github.com/olli-ai/jx/v2@v2.0.400-0.20210921045218-14731b4dd448/pkg/cmd/step/verify/step_verify_preinstall_test.go (about) 1 // +build unit 2 3 package verify 4 5 import ( 6 "fmt" 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 "testing" 11 "time" 12 13 "github.com/acarl005/stripansi" 14 "github.com/jenkins-x/jx-logging/pkg/log" 15 "github.com/olli-ai/jx/v2/pkg/cmd/opts" 16 "github.com/olli-ai/jx/v2/pkg/cmd/opts/step" 17 "github.com/olli-ai/jx/v2/pkg/config" 18 "github.com/olli-ai/jx/v2/pkg/prow" 19 "github.com/olli-ai/jx/v2/pkg/tests" 20 "github.com/olli-ai/jx/v2/pkg/util" 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 "sigs.k8s.io/yaml" 24 ) 25 26 var timeout = 1 * time.Second 27 28 func Test_doesnt_ask_for_confirmation_when_in_gke(t *testing.T) { 29 r, fakeStdout, _ := os.Pipe() 30 log.SetOutput(fakeStdout) 31 32 testOptions := &StepVerifyPreInstallOptions{ 33 WorkloadIdentity: true, 34 StepVerifyOptions: StepVerifyOptions{ 35 StepOptions: step.StepOptions{ 36 CommonOptions: &opts.CommonOptions{ 37 Out: fakeStdout, 38 }, 39 }, 40 }, 41 } 42 43 testConfig := &config.RequirementsConfig{} 44 testConfig.Cluster.GitKind = "github" 45 testConfig.Cluster.Provider = "gke" 46 testConfig.Cluster.EnvironmentGitOwner = "acme" 47 testConfig.Cluster.ProjectID = "test" 48 testConfig.Cluster.Zone = "exzone" 49 testConfig.Cluster.ClusterName = "acme" 50 testConfig.Cluster.DevEnvApprovers = []string{"bob"} 51 52 testOptions.gatherRequirements(testConfig, "") 53 fakeStdout.Close() 54 outBytes, _ := ioutil.ReadAll(r) 55 r.Close() 56 output := stripansi.Strip(string(outBytes)) 57 assert.NotContains(t, output, fmt.Sprintf("jx boot has only been validated on GKE")) 58 } 59 60 func Test_doesnt_ask_for_confirmation_when_in_batch_mode_and_with_different_provider(t *testing.T) { 61 r, fakeStdout, _ := os.Pipe() 62 log.SetOutput(fakeStdout) 63 64 testOptions := &StepVerifyPreInstallOptions{ 65 StepVerifyOptions: StepVerifyOptions{ 66 StepOptions: step.StepOptions{ 67 CommonOptions: &opts.CommonOptions{ 68 BatchMode: true, 69 Out: fakeStdout, 70 }, 71 }, 72 }, 73 } 74 75 testConfig := &config.RequirementsConfig{} 76 testConfig.Cluster.GitKind = "github" 77 testConfig.Cluster.Provider = "iks" 78 testConfig.Cluster.EnvironmentGitOwner = "acme" 79 testConfig.Cluster.ProjectID = "test" 80 testConfig.Cluster.Zone = "exzone" 81 testConfig.Cluster.ClusterName = "acme" 82 testConfig.Cluster.DevEnvApprovers = []string{"bob"} 83 84 testOptions.gatherRequirements(testConfig, "") 85 fakeStdout.Close() 86 outBytes, _ := ioutil.ReadAll(r) 87 r.Close() 88 output := stripansi.Strip(string(outBytes)) 89 assert.Contains(t, output, fmt.Sprintf("jx boot has only been validated on GKE")) 90 } 91 92 func Test_asks_for_confirmation_when_not_in_batch_mode_and_with_different_provider(t *testing.T) { 93 t.Parallel() 94 log.SetOutput(ioutil.Discard) 95 96 console := tests.NewTerminal(t, &timeout) 97 defer console.Cleanup() 98 99 testOptions := &StepVerifyPreInstallOptions{ 100 StepVerifyOptions: StepVerifyOptions{ 101 StepOptions: step.StepOptions{ 102 CommonOptions: &opts.CommonOptions{ 103 BatchMode: false, 104 In: console.In, 105 Out: console.Out, 106 Err: console.Err, 107 }, 108 }, 109 }, 110 } 111 112 testConfig := &config.RequirementsConfig{} 113 testConfig.Cluster.GitKind = "github" 114 testConfig.Cluster.Provider = "iks" 115 testConfig.Cluster.EnvironmentGitOwner = "acme" 116 testConfig.Cluster.ProjectID = "test" 117 testConfig.Cluster.Zone = "exzone" 118 testConfig.Cluster.ClusterName = "acme" 119 testConfig.Cluster.DevEnvApprovers = []string{"bob"} 120 121 done := make(chan struct{}) 122 go func() { 123 defer close(done) 124 console.ExpectString("Continue execution anyway?") 125 console.SendLine("N") 126 console.ExpectEOF() 127 }() 128 testOptions.gatherRequirements(testConfig, "") 129 console.Close() 130 <-done 131 } 132 133 func TestGatherRequirements_PreserveEnvironmentGitOwnerCase(t *testing.T) { 134 tempDir, err := ioutil.TempDir("", "test-step-verify-preinstall-") 135 require.NoError(t, err) 136 137 requirementsFileName := filepath.Join(tempDir, "jx-requirements.yml") 138 139 testConfig := &config.RequirementsConfig{} 140 testConfig.Cluster.Provider = "gke" 141 testConfig.Cluster.EnvironmentGitOwner = "ACME" 142 testConfig.Cluster.ProjectID = "test" 143 testConfig.Cluster.Zone = "exzone" 144 testConfig.Cluster.ClusterName = "acme" 145 146 testOptions := &StepVerifyPreInstallOptions{ 147 WorkloadIdentity: true, 148 StepVerifyOptions: StepVerifyOptions{ 149 StepOptions: step.StepOptions{ 150 CommonOptions: &opts.CommonOptions{ 151 BatchMode: true, 152 }, 153 }, 154 }, 155 } 156 157 _, err = testOptions.gatherRequirements(testConfig, requirementsFileName) 158 assert.NoError(t, err) 159 160 requirementsWithDefaults, err := config.LoadRequirementsConfigFile(requirementsFileName, config.DefaultFailOnValidationError) 161 assert.NoError(t, err) 162 163 assert.Equal(t, "jx", requirementsWithDefaults.Cluster.Namespace) 164 assert.Equal(t, "https://github.com", requirementsWithDefaults.Cluster.GitServer) 165 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitKind) 166 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitName) 167 assert.Equal(t, "-jx.", requirementsWithDefaults.Ingress.NamespaceSubDomain) 168 assert.Equal(t, config.RepositoryTypeNexus, requirementsWithDefaults.Repository) 169 assert.Equal(t, "ACME", requirementsWithDefaults.Cluster.EnvironmentGitOwner) 170 } 171 172 func TestGatherRequirements_DevEnvApprovers(t *testing.T) { 173 tempDir, err := ioutil.TempDir("", "test-step-verify-preinstall-") 174 require.NoError(t, err) 175 176 requirementsFileName := filepath.Join(tempDir, "jx-requirements.yml") 177 178 testConfig := &config.RequirementsConfig{} 179 testConfig.Cluster.Provider = "gke" 180 testConfig.Cluster.EnvironmentGitOwner = "acme" 181 testConfig.Cluster.ProjectID = "test" 182 testConfig.Cluster.Zone = "exzone" 183 testConfig.Cluster.ClusterName = "acme" 184 testConfig.Cluster.DevEnvApprovers = []string{ 185 "bob", 186 "steve", 187 } 188 189 testOptions := &StepVerifyPreInstallOptions{ 190 WorkloadIdentity: true, 191 Dir: tempDir, 192 StepVerifyOptions: StepVerifyOptions{ 193 StepOptions: step.StepOptions{ 194 CommonOptions: &opts.CommonOptions{ 195 BatchMode: true, 196 }, 197 }, 198 }, 199 } 200 201 _, err = testOptions.gatherRequirements(testConfig, requirementsFileName) 202 assert.NoError(t, err) 203 204 requirementsWithDefaults, err := config.LoadRequirementsConfigFile(requirementsFileName, config.DefaultFailOnValidationError) 205 assert.NoError(t, err) 206 207 assert.Equal(t, "jx", requirementsWithDefaults.Cluster.Namespace) 208 assert.Equal(t, "https://github.com", requirementsWithDefaults.Cluster.GitServer) 209 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitKind) 210 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitName) 211 assert.Equal(t, "-jx.", requirementsWithDefaults.Ingress.NamespaceSubDomain) 212 assert.Equal(t, config.RepositoryTypeNexus, requirementsWithDefaults.Repository) 213 assert.Len(t, requirementsWithDefaults.Cluster.DevEnvApprovers, 2) 214 assert.Equal(t, []string{"bob", "steve"}, requirementsWithDefaults.Cluster.DevEnvApprovers) 215 216 ownersFileName := filepath.Join(tempDir, "OWNERS") 217 ownersExists, err := util.FileExists(ownersFileName) 218 assert.NoError(t, err) 219 assert.True(t, ownersExists) 220 221 expectedOwners := &prow.Owners{ 222 Approvers: []string{"bob", "steve"}, 223 Reviewers: []string{"bob", "steve"}, 224 } 225 loadedOwners := &prow.Owners{} 226 227 ownersContent, err := ioutil.ReadFile(ownersFileName) 228 assert.NoError(t, err) 229 230 err = yaml.Unmarshal(ownersContent, loadedOwners) 231 assert.NoError(t, err) 232 assert.Equal(t, expectedOwners, loadedOwners) 233 } 234 235 func TestGatherRequirements_SetsDefaults(t *testing.T) { 236 tempDir, err := ioutil.TempDir("", "test-step-verify-preinstall-") 237 require.NoError(t, err) 238 239 requirementsFileName := filepath.Join(tempDir, "jx-requirements.yml") 240 241 testConfig := &config.RequirementsConfig{} 242 testConfig.Cluster.Provider = "gke" 243 testConfig.Cluster.EnvironmentGitOwner = "acme" 244 testConfig.Cluster.ProjectID = "test" 245 testConfig.Cluster.Zone = "exzone" 246 testConfig.Cluster.ClusterName = "acme" 247 248 testOptions := &StepVerifyPreInstallOptions{ 249 WorkloadIdentity: true, 250 Dir: tempDir, 251 StepVerifyOptions: StepVerifyOptions{ 252 StepOptions: step.StepOptions{ 253 CommonOptions: &opts.CommonOptions{ 254 BatchMode: true, 255 }, 256 }, 257 }, 258 } 259 260 _, err = testOptions.gatherRequirements(testConfig, requirementsFileName) 261 assert.NoError(t, err) 262 263 requirementsWithDefaults, err := config.LoadRequirementsConfigFile(requirementsFileName, config.DefaultFailOnValidationError) 264 assert.NoError(t, err) 265 266 assert.Equal(t, "jx", requirementsWithDefaults.Cluster.Namespace) 267 assert.Equal(t, "https://github.com", requirementsWithDefaults.Cluster.GitServer) 268 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitKind) 269 assert.Equal(t, "github", requirementsWithDefaults.Cluster.GitName) 270 assert.Equal(t, "-jx.", requirementsWithDefaults.Ingress.NamespaceSubDomain) 271 assert.Equal(t, config.RepositoryTypeNexus, requirementsWithDefaults.Repository) 272 assert.Len(t, requirementsWithDefaults.Cluster.DevEnvApprovers, 0) 273 274 ownersFileName := filepath.Join(tempDir, "OWNERS") 275 ownersExists, err := util.FileExists(ownersFileName) 276 assert.NoError(t, err) 277 assert.False(t, ownersExists) 278 }