github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/fly/rc/targets_test.go (about)

     1  package rc_test
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  
     9  	"github.com/pf-qiu/concourse/v6/atc"
    10  	"github.com/pf-qiu/concourse/v6/fly/rc"
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  var _ = Describe("Targets", func() {
    16  	var tmpDir string
    17  	var flyrc string
    18  
    19  	BeforeEach(func() {
    20  		var err error
    21  		tmpDir, err = ioutil.TempDir("", "fly-test")
    22  		Expect(err).ToNot(HaveOccurred())
    23  
    24  		os.Setenv("HOME", tmpDir)
    25  
    26  		flyrc = filepath.Join(userHomeDir(), ".flyrc")
    27  	})
    28  
    29  	AfterEach(func() {
    30  		os.RemoveAll(tmpDir)
    31  	})
    32  
    33  	Describe("LoadTargets", func() {
    34  		Context("when config file does not have team", func() {
    35  			BeforeEach(func() {
    36  				flyrcContents := `targets:
    37    some-target:
    38      api: http://concourse.com
    39      token:
    40        type: Bearer
    41        value: some-token`
    42  				ioutil.WriteFile(flyrc, []byte(flyrcContents), 0777)
    43  			})
    44  
    45  			It("loads target with default team", func() {
    46  				targets, err := rc.LoadTargets()
    47  				Expect(err).ToNot(HaveOccurred())
    48  				Expect(targets).To(Equal(rc.Targets{
    49  					"some-target": {
    50  						API:      "http://concourse.com",
    51  						TeamName: atc.DefaultTeamName,
    52  						Token: &rc.TargetToken{
    53  							Type:  "Bearer",
    54  							Value: "some-token",
    55  						},
    56  					},
    57  				}))
    58  			})
    59  		})
    60  	})
    61  
    62  	Describe("Deleting Target", func() {
    63  		BeforeEach(func() {
    64  			flyrcContents := `targets:
    65    target-name:
    66      api: http://concourse.com
    67      team: some-team
    68      token:
    69        type: Bearer
    70        value: some-token
    71    new-target:
    72      api: some-api
    73      team: another-team
    74      token:
    75        type: Bearer
    76        value: some-other-token`
    77  			ioutil.WriteFile(flyrc, []byte(flyrcContents), 0777)
    78  		})
    79  		Describe("DeleteTarget", func() {
    80  			Context("when provided with target name to delete", func() {
    81  				BeforeEach(func() {
    82  					err := rc.DeleteTarget("target-name")
    83  					Expect(err).ToNot(HaveOccurred())
    84  				})
    85  				It("should delete target from flyrc", func() {
    86  					returnedTargets, err := rc.LoadTargets()
    87  					Expect(err).ToNot(HaveOccurred())
    88  					Expect(returnedTargets).To(Equal(rc.Targets{
    89  						"new-target": {
    90  							API:      "some-api",
    91  							TeamName: "another-team",
    92  							Token: &rc.TargetToken{
    93  								Type:  "Bearer",
    94  								Value: "some-other-token",
    95  							},
    96  						}}))
    97  				})
    98  			})
    99  		})
   100  		Describe("DeleteAllTargets", func() {
   101  			Context("when deleting all targets", func() {
   102  				BeforeEach(func() {
   103  					err := rc.DeleteAllTargets()
   104  					Expect(err).ToNot(HaveOccurred())
   105  				})
   106  				It("should delete all targets from flyrc", func() {
   107  					returnedTargets, err := rc.LoadTargets()
   108  					Expect(err).ToNot(HaveOccurred())
   109  					Expect(returnedTargets).To(Equal(rc.Targets{}))
   110  				})
   111  			})
   112  		})
   113  	})
   114  
   115  	Describe("UpdateTarget", func() {
   116  		BeforeEach(func() {
   117  			flyrcContents := `targets:
   118    some-target:
   119      api: http://concourse.com
   120      team: main
   121      token:
   122        type: Bearer
   123        value: some-token`
   124  			ioutil.WriteFile(flyrc, []byte(flyrcContents), 0777)
   125  		})
   126  		Context("when props are provided for update", func() {
   127  			It("should update target to specified prop attributes", func() {
   128  				targetProps := rc.TargetProps{
   129  					API:      "new-api",
   130  					TeamName: "other-team",
   131  				}
   132  				err := rc.UpdateTargetProps("some-target", targetProps)
   133  				Expect(err).ToNot(HaveOccurred())
   134  
   135  				targets, err := rc.LoadTargets()
   136  				Expect(err).ToNot(HaveOccurred())
   137  				Expect(targets).To(Equal(rc.Targets{
   138  					"some-target": {
   139  						API:      "new-api",
   140  						TeamName: "other-team",
   141  						Token: &rc.TargetToken{
   142  							Type:  "Bearer",
   143  							Value: "some-token",
   144  						},
   145  					},
   146  				}))
   147  			})
   148  		})
   149  
   150  		Context("when target name is provided for update", func() {
   151  			It("should update target name and keep old prop attributes", func() {
   152  				err := rc.UpdateTargetName("some-target", "some-other-target")
   153  				Expect(err).ToNot(HaveOccurred())
   154  
   155  				targets, err := rc.LoadTargets()
   156  				Expect(err).ToNot(HaveOccurred())
   157  				Expect(targets).To(Equal(rc.Targets{
   158  					"some-other-target": {
   159  						API:      "http://concourse.com",
   160  						TeamName: "main",
   161  						Token: &rc.TargetToken{
   162  							Type:  "Bearer",
   163  							Value: "some-token",
   164  						},
   165  					},
   166  				}))
   167  			})
   168  		})
   169  	})
   170  
   171  	Describe("SaveTarget", func() {
   172  		Context("when managing .flyrc", func() {
   173  			BeforeEach(func() {
   174  				if runtime.GOOS == "windows" {
   175  					Skip("these tests are UNIX-specific")
   176  				}
   177  			})
   178  
   179  			It("creates any new file with 0600 permissions", func() {
   180  				err := rc.SaveTarget("foo", "url", false, "main", nil, "", "", "")
   181  				Expect(err).ToNot(HaveOccurred())
   182  				fi, statErr := os.Stat(flyrc)
   183  				Expect(statErr).To(BeNil())
   184  				Expect(fi.Mode().Perm()).To(Equal(os.FileMode(0600)))
   185  			})
   186  
   187  			Describe("when the file exists with 0755 permissions", func() {
   188  				BeforeEach(func() {
   189  					err := ioutil.WriteFile(flyrc, []byte{}, 0755)
   190  					Expect(err).ToNot(HaveOccurred())
   191  				})
   192  
   193  				It("preserves those permissions", func() {
   194  					err := rc.SaveTarget("foo", "url", false, "main", nil, "", "", "")
   195  					Expect(err).ToNot(HaveOccurred())
   196  					fi, statErr := os.Stat(flyrc)
   197  					Expect(statErr).To(BeNil())
   198  					Expect(fi.Mode().Perm()).To(Equal(os.FileMode(0755)))
   199  				})
   200  			})
   201  		})
   202  
   203  		Describe("CA Cert Flag", func() {
   204  			Describe("when 'ca_cert' is not set in the flyrc", func() {
   205  				var targetName rc.TargetName
   206  				BeforeEach(func() {
   207  					targetName = "foo"
   208  					err := rc.SaveTarget(
   209  						targetName,
   210  						"some api url",
   211  						false,
   212  						"main",
   213  						nil,
   214  						"",
   215  						"",
   216  						"",
   217  					)
   218  					Expect(err).ToNot(HaveOccurred())
   219  				})
   220  
   221  				It("returns the rc empty ca-cert", func() {
   222  					returnedTarget, err := rc.LoadTarget(targetName, false)
   223  					Expect(err).ToNot(HaveOccurred())
   224  					Expect(returnedTarget.CACert()).To(BeEmpty())
   225  				})
   226  			})
   227  
   228  			Describe("when 'ca_cert' is set in the flyrc", func() {
   229  				var targetName rc.TargetName
   230  
   231  				BeforeEach(func() {
   232  					targetName = "foo"
   233  					err := rc.SaveTarget(
   234  						targetName,
   235  						"some api url",
   236  						true,
   237  						"main",
   238  						nil,
   239  						rsaCertPEM,
   240  						"",
   241  						"",
   242  					)
   243  					Expect(err).ToNot(HaveOccurred())
   244  				})
   245  
   246  				It("returns the rc insecure flag as true", func() {
   247  					returnedTarget, err := rc.LoadTarget(targetName, false)
   248  					Expect(err).NotTo(HaveOccurred())
   249  					Expect(returnedTarget.CACert()).To(Equal(rsaCertPEM))
   250  				})
   251  			})
   252  		})
   253  
   254  		Describe("Insecure Flag", func() {
   255  			Describe("when 'insecure' is set to false in the flyrc", func() {
   256  				var targetName rc.TargetName
   257  
   258  				BeforeEach(func() {
   259  					targetName = "foo"
   260  					err := rc.SaveTarget(
   261  						targetName,
   262  						"some api url",
   263  						false,
   264  						"main",
   265  						nil,
   266  						"",
   267  						"",
   268  						"",
   269  					)
   270  					Expect(err).ToNot(HaveOccurred())
   271  				})
   272  
   273  				It("returns the rc insecure flag as false", func() {
   274  					returnedTarget, err := rc.LoadTarget(targetName, false)
   275  					Expect(err).ToNot(HaveOccurred())
   276  					Expect(returnedTarget.TLSConfig().InsecureSkipVerify).To(BeFalse())
   277  				})
   278  			})
   279  
   280  			Describe("when 'insecure' is set to true in the flyrc", func() {
   281  				var targetName rc.TargetName
   282  
   283  				BeforeEach(func() {
   284  					targetName = "foo"
   285  					err := rc.SaveTarget(
   286  						targetName,
   287  						"some api url",
   288  						true,
   289  						"main",
   290  						nil,
   291  						"",
   292  						"",
   293  						"",
   294  					)
   295  					Expect(err).ToNot(HaveOccurred())
   296  				})
   297  
   298  				It("returns the rc insecure flag as true", func() {
   299  					returnedTarget, err := rc.LoadTarget(targetName, false)
   300  					Expect(err).ToNot(HaveOccurred())
   301  					Expect(returnedTarget.TLSConfig().InsecureSkipVerify).To(BeTrue())
   302  				})
   303  			})
   304  		})
   305  
   306  		Context("when selecting a target that does not exist", func() {
   307  			It("returns UnknownTargetError", func() {
   308  				_, err := rc.LoadTarget("bogus", false)
   309  				Expect(err).To(Equal(rc.UnknownTargetError{"bogus"}))
   310  			})
   311  		})
   312  
   313  		Context("when a target is not specified", func() {
   314  			It("returns ErrNoTargetSpecified", func() {
   315  				_, err := rc.LoadTarget("", false)
   316  				Expect(err).To(Equal(rc.ErrNoTargetSpecified))
   317  			})
   318  		})
   319  	})
   320  })