github.com/buildtool/build-tools@v0.2.29-0.20240322150259-6a1d0a553c23/pkg/deploy/deploy_test.go (about)

     1  // MIT License
     2  //
     3  // Copyright (c) 2018 buildtool
     4  //
     5  // Permission is hereby granted, free of charge, to any person obtaining a copy
     6  // of this software and associated documentation files (the "Software"), to deal
     7  // in the Software without restriction, including without limitation the rights
     8  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     9  // copies of the Software, and to permit persons to whom the Software is
    10  // furnished to do so, subject to the following conditions:
    11  //
    12  // The above copyright notice and this permission notice shall be included in all
    13  // copies or substantial portions of the Software.
    14  //
    15  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    16  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    17  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    18  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    19  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    20  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    21  // SOFTWARE.
    22  
    23  package deploy
    24  
    25  import (
    26  	"errors"
    27  	"fmt"
    28  	"os"
    29  	"path/filepath"
    30  	"testing"
    31  
    32  	"github.com/apex/log"
    33  	"github.com/stretchr/testify/assert"
    34  	mocks "gitlab.com/unboundsoftware/apex-mocks"
    35  
    36  	"github.com/buildtool/build-tools/pkg/args"
    37  	"github.com/buildtool/build-tools/pkg/kubectl"
    38  )
    39  
    40  func TestDeploy_MissingDeploymentFilesDir(t *testing.T) {
    41  	client := &kubectl.MockKubectl{
    42  		Responses: []error{nil},
    43  	}
    44  	defer client.Cleanup()
    45  
    46  	logMock := mocks.New()
    47  	log.SetHandler(logMock)
    48  	log.SetLevel(log.DebugLevel)
    49  	err := Deploy(".", "abc123", "registryUrl", "20190513-17:22:36", client, Args{
    50  		Globals:   args.Globals{},
    51  		Target:    "",
    52  		Context:   "",
    53  		Namespace: "",
    54  		Tag:       "",
    55  		Timeout:   "2m",
    56  	})
    57  
    58  	assert.EqualError(t, err, "open k8s: no such file or directory")
    59  	logMock.Check(t, []string{})
    60  }
    61  
    62  func TestDeploy_NoFiles(t *testing.T) {
    63  	client := &kubectl.MockKubectl{
    64  		Responses: []error{nil},
    65  	}
    66  
    67  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
    68  	defer func() { _ = os.RemoveAll(name) }()
    69  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
    70  
    71  	logMock := mocks.New()
    72  	log.SetHandler(logMock)
    73  	log.SetLevel(log.DebugLevel)
    74  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
    75  		Globals:   args.Globals{},
    76  		Target:    "",
    77  		Context:   "",
    78  		Namespace: "",
    79  		Tag:       "abc123",
    80  		Timeout:   "2m",
    81  	})
    82  
    83  	assert.NoError(t, err)
    84  	assert.Equal(t, 0, len(client.Inputs))
    85  	logMock.Check(t, []string{})
    86  }
    87  
    88  func TestDeploy_NoEnvSpecificFiles(t *testing.T) {
    89  	client := &kubectl.MockKubectl{
    90  		Responses: []error{nil},
    91  	}
    92  
    93  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
    94  	defer func() { _ = os.RemoveAll(name) }()
    95  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
    96  	yaml := `
    97  apiVersion: v1
    98  kind: Namespace
    99  metadata:
   100    name: dummy
   101  `
   102  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   103  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   104  
   105  	logMock := mocks.New()
   106  	log.SetHandler(logMock)
   107  	log.SetLevel(log.DebugLevel)
   108  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   109  		Globals:   args.Globals{},
   110  		Target:    "",
   111  		Context:   "",
   112  		Namespace: "",
   113  		Tag:       "abc123",
   114  		Timeout:   "2m",
   115  	})
   116  
   117  	assert.NoError(t, err)
   118  	assert.Equal(t, 1, len(client.Inputs))
   119  	assert.Equal(t, yaml, client.Inputs[0])
   120  	logMock.Check(t, []string{
   121  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   122  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   123  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   124  	})
   125  }
   126  
   127  func TestDeploy_UnreadableFile(t *testing.T) {
   128  	client := &kubectl.MockKubectl{
   129  		Responses: []error{nil},
   130  	}
   131  
   132  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   133  	defer func() { _ = os.RemoveAll(name) }()
   134  	_ = os.MkdirAll(filepath.Join(name, "k8s", "deploy.yaml"), 0777)
   135  
   136  	logMock := mocks.New()
   137  	log.SetHandler(logMock)
   138  	log.SetLevel(log.DebugLevel)
   139  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   140  		Globals:   args.Globals{},
   141  		Target:    "",
   142  		Context:   "",
   143  		Namespace: "",
   144  		Tag:       "abc123",
   145  		Timeout:   "2m",
   146  	})
   147  
   148  	assert.EqualError(t, err, fmt.Sprintf("read %s/k8s/deploy.yaml: is a directory", name))
   149  	logMock.Check(t, []string{
   150  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   151  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n"})
   152  }
   153  
   154  func TestDeploy_FileBrokenSymlink(t *testing.T) {
   155  	client := &kubectl.MockKubectl{
   156  		Responses: []error{nil},
   157  	}
   158  
   159  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   160  	defer func() { _ = os.RemoveAll(name) }()
   161  	_ = os.MkdirAll(filepath.Join(name, "k8s"), 0777)
   162  	deployFile := filepath.Join(name, "k8s", "ns.yaml")
   163  	_ = os.WriteFile(deployFile, []byte("test"), 0777)
   164  	_ = os.Symlink(deployFile, filepath.Join(name, "k8s", "deploy.yaml"))
   165  	_ = os.Remove(deployFile)
   166  
   167  	logMock := mocks.New()
   168  	log.SetHandler(logMock)
   169  	log.SetLevel(log.DebugLevel)
   170  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   171  		Globals:   args.Globals{},
   172  		Target:    "",
   173  		Context:   "",
   174  		Namespace: "",
   175  		Tag:       "abc123",
   176  		Timeout:   "2m",
   177  	})
   178  
   179  	assert.EqualError(t, err, fmt.Sprintf("open %s/k8s/deploy.yaml: no such file or directory", name))
   180  	logMock.Check(t, []string{
   181  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   182  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   183  	})
   184  
   185  }
   186  
   187  func TestDeploy_EnvSpecificFilesWithSuffix(t *testing.T) {
   188  	client := &kubectl.MockKubectl{
   189  		Responses: []error{nil},
   190  	}
   191  
   192  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   193  	defer func() { _ = os.RemoveAll(name) }()
   194  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   195  	yaml := `
   196  apiVersion: v1
   197  kind: Namespace
   198  metadata:
   199    name: dummy
   200  `
   201  	deployFile := filepath.Join(name, "k8s", "ns-dummy.yaml")
   202  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   203  
   204  	logMock := mocks.New()
   205  	log.SetHandler(logMock)
   206  	log.SetLevel(log.DebugLevel)
   207  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   208  		Globals:   args.Globals{},
   209  		Target:    "dummy",
   210  		Context:   "",
   211  		Namespace: "",
   212  		Tag:       "abc123",
   213  		Timeout:   "2m",
   214  	})
   215  
   216  	assert.NoError(t, err)
   217  	assert.Equal(t, 1, len(client.Inputs))
   218  	assert.Equal(t, yaml, client.Inputs[0])
   219  	logMock.Check(t, []string{
   220  		"debug: considering file '<yellow>ns-dummy.yaml</yellow>' for target: <green>dummy</green>\n",
   221  		"debug: using file '<green>ns-dummy.yaml</green>' for target: <green>dummy</green>\n",
   222  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   223  	})
   224  }
   225  
   226  func TestDeploy_EnvSpecificFiles(t *testing.T) {
   227  	client := &kubectl.MockKubectl{
   228  		Responses: []error{nil},
   229  	}
   230  
   231  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   232  	defer func() { _ = os.RemoveAll(name) }()
   233  	_ = os.MkdirAll(filepath.Join(name, "k8s", "prod"), 0777)
   234  	deployFile := filepath.Join(name, "k8s", "ns-dummy.yaml")
   235  	_ = os.WriteFile(deployFile, []byte("dummy yaml content"), 0777)
   236  	_ = os.WriteFile(filepath.Join(name, "k8s", "ns-prod.yaml"), []byte("prod content"), 0777)
   237  	_ = os.WriteFile(filepath.Join(name, "k8s", "other-dummy.sh"), []byte("dummy script content"), 0777)
   238  
   239  	logMock := mocks.New()
   240  	log.SetHandler(logMock)
   241  	log.SetLevel(log.DebugLevel)
   242  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   243  		Globals:   args.Globals{},
   244  		Target:    "prod",
   245  		Context:   "",
   246  		Namespace: "",
   247  		Tag:       "abc123",
   248  		Timeout:   "2m",
   249  	})
   250  	assert.NoError(t, err)
   251  	assert.Equal(t, 1, len(client.Inputs))
   252  	assert.Equal(t, "prod content", client.Inputs[0])
   253  	logMock.Check(t, []string{
   254  		"debug: considering file '<yellow>ns-dummy.yaml</yellow>' for target: <green>prod</green>\n",
   255  		"debug: not using file '<red>ns-dummy.yaml</red>' for target: <green>prod</green>\n",
   256  		"debug: considering file '<yellow>ns-prod.yaml</yellow>' for target: <green>prod</green>\n",
   257  		"debug: using file '<green>ns-prod.yaml</green>' for target: <green>prod</green>\n",
   258  		"debug: considering script '<yellow>other-dummy.sh</yellow>' for target: <green>prod</green>\n",
   259  		"debug: not using script '<red>other-dummy.sh</red>' for target: <green>prod</green>\n",
   260  		"debug: trying to apply: \n---\nprod content\n---\n",
   261  	})
   262  }
   263  
   264  func TestDeploy_IgnoreEmptyFiles(t *testing.T) {
   265  	client := &kubectl.MockKubectl{
   266  		Responses: []error{nil},
   267  	}
   268  
   269  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   270  	defer func() { _ = os.RemoveAll(name) }()
   271  	_ = os.MkdirAll(filepath.Join(name, "k8s", "prod"), 0777)
   272  	deployFile := filepath.Join(name, "k8s", "ns-dummy.yaml")
   273  	_ = os.WriteFile(deployFile, []byte("dummy yaml content"), 0777)
   274  	_ = os.WriteFile(filepath.Join(name, "k8s", "ns-prod.yaml"), []byte(""), 0777)
   275  	_ = os.WriteFile(filepath.Join(name, "k8s", "other-dummy.sh"), []byte("dummy script content"), 0777)
   276  
   277  	logMock := mocks.New()
   278  	log.SetHandler(logMock)
   279  	log.SetLevel(log.DebugLevel)
   280  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   281  		Globals:   args.Globals{},
   282  		Target:    "prod",
   283  		Context:   "",
   284  		Namespace: "",
   285  		Tag:       "abc123",
   286  		Timeout:   "2m",
   287  	})
   288  	assert.NoError(t, err)
   289  	assert.Equal(t, 0, len(client.Inputs))
   290  	logMock.Check(t, []string{
   291  		"debug: considering file '<yellow>ns-dummy.yaml</yellow>' for target: <green>prod</green>\n",
   292  		"debug: not using file '<red>ns-dummy.yaml</red>' for target: <green>prod</green>\n",
   293  		"debug: considering file '<yellow>ns-prod.yaml</yellow>' for target: <green>prod</green>\n",
   294  		"debug: using file '<green>ns-prod.yaml</green>' for target: <green>prod</green>\n",
   295  		"debug: considering script '<yellow>other-dummy.sh</yellow>' for target: <green>prod</green>\n",
   296  		"debug: not using script '<red>other-dummy.sh</red>' for target: <green>prod</green>\n",
   297  		"debug: ignoring empty file '<yellow>ns-prod.yaml</yellow>'\n",
   298  	})
   299  }
   300  
   301  func TestDeploy_ScriptExecution_NameSuffix(t *testing.T) {
   302  	client := &kubectl.MockKubectl{
   303  		Responses: []error{nil},
   304  	}
   305  
   306  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   307  	defer func() { _ = os.RemoveAll(name) }()
   308  	_ = os.MkdirAll(filepath.Join(name, "k8s", "prod"), 0777)
   309  	script := `#!/usr/bin/env bash
   310  echo "Prod-script with suffix"`
   311  	_ = os.WriteFile(filepath.Join(name, "k8s", "setup-prod.sh"), []byte(script), 0777)
   312  
   313  	logMock := mocks.New()
   314  	log.SetHandler(logMock)
   315  	log.SetLevel(log.DebugLevel)
   316  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   317  		Globals:   args.Globals{},
   318  		Target:    "prod",
   319  		Context:   "",
   320  		Namespace: "",
   321  		Tag:       "abc123",
   322  		Timeout:   "2m",
   323  	})
   324  	assert.NoError(t, err)
   325  	assert.Equal(t, 0, len(client.Inputs))
   326  	logMock.Check(t, []string{
   327  		"debug: considering script '<yellow>setup-prod.sh</yellow>' for target: <green>prod</green>\n",
   328  		"debug: using script '<green>setup-prod.sh</green>' for target: <green>prod</green>\n",
   329  		"info: Prod-script with suffix\n",
   330  	})
   331  }
   332  
   333  func TestDeploy_ScriptExecution_No_Execute_Of_Common_If_Specific_Exists(t *testing.T) {
   334  	client := &kubectl.MockKubectl{
   335  		Responses: []error{nil},
   336  	}
   337  
   338  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   339  	defer func() { _ = os.RemoveAll(name) }()
   340  	_ = os.MkdirAll(filepath.Join(name, "k8s", "prod"), 0777)
   341  	script := `#!/usr/bin/env bash
   342  echo "Script without suffix should not execute"`
   343  	_ = os.WriteFile(filepath.Join(name, "k8s", "setup.sh"), []byte(script), 0777)
   344  	script2 := `#!/usr/bin/env bash
   345  echo "Prod-script with suffix"`
   346  	_ = os.WriteFile(filepath.Join(name, "k8s", "setup-prod.sh"), []byte(script2), 0777)
   347  
   348  	logMock := mocks.New()
   349  	log.SetHandler(logMock)
   350  	log.SetLevel(log.DebugLevel)
   351  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   352  		Globals:   args.Globals{},
   353  		Target:    "prod",
   354  		Context:   "",
   355  		Namespace: "",
   356  		Tag:       "abc123",
   357  		Timeout:   "2m",
   358  	})
   359  	assert.NoError(t, err)
   360  	assert.Equal(t, 0, len(client.Inputs))
   361  	logMock.Check(t, []string{
   362  		"debug: considering script '<yellow>setup-prod.sh</yellow>' for target: <green>prod</green>\n",
   363  		"debug: considering script '<yellow>setup.sh</yellow>' for target: <green>prod</green>\n",
   364  		"debug: using script '<green>setup-prod.sh</green>' for target: <green>prod</green>\n",
   365  		"debug: not using script '<red>setup.sh</red>' for target: <green>prod</green>\n",
   366  		"info: Prod-script with suffix\n",
   367  	})
   368  }
   369  
   370  func TestDeploy_ScriptExecution_NotExecutable(t *testing.T) {
   371  	client := &kubectl.MockKubectl{
   372  		Responses: []error{nil},
   373  	}
   374  
   375  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   376  	defer func() { _ = os.RemoveAll(name) }()
   377  	_ = os.MkdirAll(filepath.Join(name, "k8s", "prod"), 0777)
   378  	script := `#!/usr/bin/env bash
   379  echo "Prod-script with suffix"`
   380  	scriptName := filepath.Join(name, "k8s", "setup-prod.sh")
   381  	_ = os.WriteFile(scriptName, []byte(script), 0666)
   382  
   383  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   384  		Globals:   args.Globals{},
   385  		Target:    "prod",
   386  		Context:   "",
   387  		Namespace: "",
   388  		Tag:       "abc123",
   389  		Timeout:   "2m",
   390  	})
   391  	assert.EqualError(t, err, fmt.Sprintf("fork/exec %s: permission denied", scriptName))
   392  }
   393  
   394  func TestDeploy_ErrorFromApply(t *testing.T) {
   395  	client := &kubectl.MockKubectl{
   396  		Responses: []error{errors.New("apply failed")},
   397  	}
   398  
   399  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   400  	defer func() { _ = os.RemoveAll(name) }()
   401  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   402  	yaml := `
   403  apiVersion: v1
   404  kind: Namespace
   405  metadata:
   406    name: dummy
   407  `
   408  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   409  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   410  
   411  	logMock := mocks.New()
   412  	log.SetHandler(logMock)
   413  	log.SetLevel(log.DebugLevel)
   414  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   415  		Globals:   args.Globals{},
   416  		Target:    "",
   417  		Context:   "",
   418  		Namespace: "",
   419  		Tag:       "abc123",
   420  		Timeout:   "2m",
   421  	})
   422  
   423  	assert.EqualError(t, err, "apply failed")
   424  	logMock.Check(t, []string{
   425  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   426  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   427  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   428  	})
   429  }
   430  
   431  func TestDeploy_ReplacingCommitAndTimestampAndImage(t *testing.T) {
   432  	client := &kubectl.MockKubectl{
   433  		Responses: []error{nil},
   434  	}
   435  
   436  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   437  	defer func() { _ = os.RemoveAll(name) }()
   438  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   439  	yaml := `
   440  apiVersion: v1
   441  kind: Namespace
   442  metadata:
   443    name: dummy
   444    commit: ${COMMIT}
   445    image: ${IMAGE}
   446    timestamp: ${TIMESTAMP}
   447  `
   448  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   449  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   450  
   451  	logMock := mocks.New()
   452  	log.SetHandler(logMock)
   453  	log.SetLevel(log.DebugLevel)
   454  	err := Deploy(name, "registryUrl", "image", "2019-05-13T17:22:36Z01:00", client, Args{
   455  		Globals:   args.Globals{},
   456  		Target:    "test",
   457  		Context:   "",
   458  		Namespace: "",
   459  		Tag:       "abc123",
   460  		Timeout:   "2m",
   461  	})
   462  	assert.NoError(t, err)
   463  	assert.Equal(t, 1, len(client.Inputs))
   464  	expectedInput := `
   465  apiVersion: v1
   466  kind: Namespace
   467  metadata:
   468    name: dummy
   469    commit: abc123
   470    image: registryUrl/image:abc123
   471    timestamp: 2019-05-13T17:22:36Z01:00
   472  `
   473  	assert.Equal(t, expectedInput, client.Inputs[0])
   474  	logMock.Check(t, []string{
   475  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green>test</green>\n",
   476  		"debug: using file '<green>deploy.yaml</green>' for target: <green>test</green>\n",
   477  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n  commit: abc123\n  image: registryUrl/image:abc123\n  timestamp: 2019-05-13T17:22:36Z01:00\n\n---\n",
   478  	})
   479  }
   480  
   481  func TestDeploy_DeploymentExists(t *testing.T) {
   482  	client := &kubectl.MockKubectl{
   483  		Responses:  []error{nil},
   484  		Deployment: true,
   485  	}
   486  
   487  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   488  	defer func() { _ = os.RemoveAll(name) }()
   489  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   490  	yaml := `
   491  apiVersion: v1
   492  kind: Namespace
   493  metadata:
   494    name: dummy
   495  `
   496  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   497  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   498  
   499  	logMock := mocks.New()
   500  	log.SetHandler(logMock)
   501  	log.SetLevel(log.DebugLevel)
   502  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   503  		Globals:   args.Globals{},
   504  		Target:    "",
   505  		Context:   "",
   506  		Namespace: "",
   507  		Tag:       "abc123",
   508  		Timeout:   "2m",
   509  	})
   510  
   511  	assert.EqualError(t, err, "failed to rollout")
   512  	assert.Equal(t, 1, len(client.Inputs))
   513  	assert.Equal(t, yaml, client.Inputs[0])
   514  	logMock.Check(t, []string{
   515  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   516  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   517  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   518  		"error: Rollout failed. Fetching events.\n",
   519  		"error: Deployment events",
   520  		"error: Pod events",
   521  	})
   522  }
   523  
   524  func TestDeploy_RolloutStatusFail(t *testing.T) {
   525  	client := &kubectl.MockKubectl{
   526  		Responses:  []error{nil},
   527  		Deployment: true,
   528  		Status:     false,
   529  	}
   530  
   531  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   532  	defer func() { _ = os.RemoveAll(name) }()
   533  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   534  	yaml := `
   535  apiVersion: v1
   536  kind: Namespace
   537  metadata:
   538    name: dummy
   539  `
   540  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   541  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   542  
   543  	logMock := mocks.New()
   544  	log.SetHandler(logMock)
   545  	log.SetLevel(log.DebugLevel)
   546  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   547  		Globals:   args.Globals{},
   548  		Target:    "",
   549  		Context:   "",
   550  		Namespace: "",
   551  		Tag:       "abc123",
   552  		Timeout:   "2m",
   553  	})
   554  
   555  	assert.EqualError(t, err, "failed to rollout")
   556  	assert.Equal(t, 1, len(client.Inputs))
   557  	assert.Equal(t, yaml, client.Inputs[0])
   558  	logMock.Check(t, []string{"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   559  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   560  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   561  		"error: Rollout failed. Fetching events.\n",
   562  		"error: Deployment events",
   563  		"error: Pod events",
   564  	})
   565  }
   566  
   567  func TestDeploy_NoWait(t *testing.T) {
   568  	client := &kubectl.MockKubectl{
   569  		Responses:  []error{nil},
   570  		Deployment: true,
   571  	}
   572  
   573  	name, _ := os.MkdirTemp(os.TempDir(), "build-tools")
   574  	defer func() { _ = os.RemoveAll(name) }()
   575  	_ = os.Mkdir(filepath.Join(name, "k8s"), 0777)
   576  	yaml := `
   577  apiVersion: v1
   578  kind: Namespace
   579  metadata:
   580    name: dummy
   581  `
   582  	deployFile := filepath.Join(name, "k8s", "deploy.yaml")
   583  	_ = os.WriteFile(deployFile, []byte(yaml), 0777)
   584  
   585  	logMock := mocks.New()
   586  	log.SetHandler(logMock)
   587  	log.SetLevel(log.DebugLevel)
   588  	err := Deploy(name, "image", "registryUrl", "20190513-17:22:36", client, Args{
   589  		Globals:   args.Globals{},
   590  		Target:    "",
   591  		Context:   "",
   592  		Namespace: "",
   593  		Tag:       "abc123",
   594  		NoWait:    true,
   595  	})
   596  
   597  	assert.NoError(t, err)
   598  	logMock.Check(t, []string{
   599  		"debug: considering file '<yellow>deploy.yaml</yellow>' for target: <green></green>\n",
   600  		"debug: using file '<green>deploy.yaml</green>' for target: <green></green>\n",
   601  		"debug: trying to apply: \n---\n\napiVersion: v1\nkind: Namespace\nmetadata:\n  name: dummy\n\n---\n",
   602  		"info: Not waiting for deployment to succeed\n",
   603  	})
   604  }