github.com/chenbh/concourse/v6@v6.4.2/fly/integration/execute_multiple_inputs_test.go (about) 1 package integration_test 2 3 import ( 4 "archive/tar" 5 "compress/gzip" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "net/http" 10 "os/exec" 11 "path/filepath" 12 "strings" 13 "time" 14 15 "github.com/chenbh/concourse/v6/atc" 16 "github.com/chenbh/concourse/v6/atc/event" 17 . "github.com/onsi/ginkgo" 18 . "github.com/onsi/gomega" 19 "github.com/onsi/gomega/gbytes" 20 "github.com/onsi/gomega/gexec" 21 "github.com/onsi/gomega/ghttp" 22 "github.com/vito/go-sse/sse" 23 ) 24 25 var _ = Describe("Fly CLI", func() { 26 var buildDir string 27 var otherInputDir string 28 29 var streaming chan struct{} 30 var events chan atc.Event 31 var uploading chan struct{} 32 var uploadingTwo chan struct{} 33 34 var expectedPlan atc.Plan 35 var workerArtifact = atc.WorkerArtifact{ 36 ID: 125, 37 Name: "some-dir", 38 } 39 40 BeforeEach(func() { 41 var err error 42 43 buildDir, err = ioutil.TempDir("", "fly-build-dir") 44 Expect(err).NotTo(HaveOccurred()) 45 46 otherInputDir, err = ioutil.TempDir("", "fly-s3-asset-dir") 47 Expect(err).NotTo(HaveOccurred()) 48 49 err = ioutil.WriteFile( 50 filepath.Join(buildDir, "task.yml"), 51 []byte(`--- 52 platform: some-platform 53 54 image_resource: 55 type: registry-image 56 source: 57 repository: ubuntu 58 59 inputs: 60 - name: some-input 61 - name: some-other-input 62 63 params: 64 FOO: bar 65 BAZ: buzz 66 X: 1 67 68 run: 69 path: find 70 args: [.] 71 `), 72 0644, 73 ) 74 Expect(err).NotTo(HaveOccurred()) 75 76 err = ioutil.WriteFile( 77 filepath.Join(otherInputDir, "s3-asset-file"), 78 []byte(`blob`), 79 0644, 80 ) 81 Expect(err).NotTo(HaveOccurred()) 82 83 streaming = make(chan struct{}) 84 events = make(chan atc.Event) 85 86 planFactory := atc.NewPlanFactory(0) 87 88 expectedPlan = planFactory.NewPlan(atc.DoPlan{ 89 planFactory.NewPlan(atc.AggregatePlan{ 90 planFactory.NewPlan(atc.ArtifactInputPlan{ 91 ArtifactID: 125, 92 Name: "some-input", 93 }), 94 planFactory.NewPlan(atc.ArtifactInputPlan{ 95 ArtifactID: 125, 96 Name: "some-other-input", 97 }), 98 }), 99 planFactory.NewPlan(atc.TaskPlan{ 100 Name: "one-off", 101 Config: &atc.TaskConfig{ 102 Platform: "some-platform", 103 ImageResource: &atc.ImageResource{ 104 Type: "registry-image", 105 Source: atc.Source{ 106 "repository": "ubuntu", 107 }, 108 }, 109 Inputs: []atc.TaskInputConfig{ 110 {Name: "some-input"}, 111 {Name: "some-other-input"}, 112 }, 113 Params: map[string]string{ 114 "FOO": "bar", 115 "BAZ": "buzz", 116 "X": "1", 117 }, 118 Run: atc.TaskRunConfig{ 119 Path: "find", 120 Args: []string{"."}, 121 }, 122 }, 123 }), 124 }) 125 }) 126 127 JustBeforeEach(func() { 128 uploading = make(chan struct{}) 129 uploadingTwo = make(chan struct{}) 130 131 atcServer.RouteToHandler("POST", "/api/v1/teams/main/artifacts", 132 ghttp.CombineHandlers( 133 func(w http.ResponseWriter, req *http.Request) { 134 Expect(req.FormValue("platform")).To(Equal("some-platform")) 135 136 gr, err := gzip.NewReader(req.Body) 137 Expect(err).NotTo(HaveOccurred()) 138 139 tr := tar.NewReader(gr) 140 141 hdr, err := tr.Next() 142 Expect(err).NotTo(HaveOccurred()) 143 144 Expect(hdr.Name).To(Equal("./")) 145 146 hdr, err = tr.Next() 147 Expect(err).NotTo(HaveOccurred()) 148 149 if strings.HasSuffix(hdr.Name, "task.yml") { 150 close(uploading) 151 } else if strings.HasSuffix(hdr.Name, "s3-asset-file") { 152 close(uploadingTwo) 153 } 154 155 Expect(hdr.Name).To(MatchRegexp("(./)?(task.yml|s3-asset-file)$")) 156 }, 157 ghttp.RespondWith(201, `{"id":125}`), 158 ), 159 ) 160 atcServer.RouteToHandler("POST", "/api/v1/teams/main/builds", 161 ghttp.CombineHandlers( 162 ghttp.VerifyRequest("POST", "/api/v1/teams/main/builds"), 163 VerifyPlan(expectedPlan), 164 func(w http.ResponseWriter, r *http.Request) { 165 http.SetCookie(w, &http.Cookie{ 166 Name: "Some-Cookie", 167 Value: "some-cookie-data", 168 Path: "/", 169 Expires: time.Now().Add(1 * time.Minute), 170 }) 171 }, 172 ghttp.RespondWith(201, `{"id":128}`), 173 ), 174 ) 175 atcServer.RouteToHandler("GET", "/api/v1/builds/128/events", 176 ghttp.CombineHandlers( 177 ghttp.VerifyRequest("GET", "/api/v1/builds/128/events"), 178 func(w http.ResponseWriter, r *http.Request) { 179 flusher := w.(http.Flusher) 180 181 w.Header().Add("Content-Type", "text/event-stream; charset=utf-8") 182 w.Header().Add("Cache-Control", "no-cache, no-store, must-revalidate") 183 w.Header().Add("Connection", "keep-alive") 184 185 w.WriteHeader(http.StatusOK) 186 187 flusher.Flush() 188 189 close(streaming) 190 191 id := 0 192 193 for e := range events { 194 payload, err := json.Marshal(event.Message{Event: e}) 195 Expect(err).NotTo(HaveOccurred()) 196 197 event := sse.Event{ 198 ID: fmt.Sprintf("%d", id), 199 Name: "event", 200 Data: payload, 201 } 202 203 err = event.Write(w) 204 Expect(err).NotTo(HaveOccurred()) 205 206 flusher.Flush() 207 208 id++ 209 } 210 211 err := sse.Event{ 212 Name: "end", 213 }.Write(w) 214 Expect(err).NotTo(HaveOccurred()) 215 }, 216 ), 217 ) 218 atcServer.RouteToHandler("GET", "/api/v1/builds/128/artifacts", 219 ghttp.RespondWithJSONEncoded(200, []atc.WorkerArtifact{workerArtifact}), 220 ) 221 222 }) 223 224 It("flies with multiple passengers", func() { 225 flyCmd := exec.Command( 226 flyPath, "-t", targetName, "e", 227 "--input", fmt.Sprintf("some-input=%s", buildDir), 228 "--input", fmt.Sprintf("some-other-input=%s", otherInputDir), 229 "--config", filepath.Join(buildDir, "task.yml"), 230 ) 231 232 sess, err := gexec.Start(flyCmd, GinkgoWriter, GinkgoWriter) 233 Expect(err).NotTo(HaveOccurred()) 234 235 Eventually(streaming).Should(BeClosed()) 236 Eventually(uploading).Should(BeClosed()) 237 Eventually(uploadingTwo).Should(BeClosed()) 238 239 events <- event.Log{Payload: "sup"} 240 close(events) 241 242 Eventually(sess.Out).Should(gbytes.Say("sup")) 243 244 <-sess.Exited 245 Expect(sess).To(gexec.Exit(0)) 246 }) 247 })