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