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  }