Skip to content

Commit 9740f91

Browse files
authored
fix: component download AWS XML error (#1572)
1 parent d700671 commit 9740f91

File tree

5 files changed

+133
-13
lines changed

5 files changed

+133
-13
lines changed

cli/cmd/component.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,10 +443,11 @@ func installComponent(args []string) (err error) {
443443
}
444444

445445
stageClose, err := catalog.Stage(component, versionArg, progressClosure)
446+
defer stageClose()
446447
if err != nil {
448+
cli.StopProgress()
447449
return
448450
}
449-
defer stageClose()
450451

451452
downloadComplete <- 0
452453

@@ -631,10 +632,11 @@ func updateComponent(args []string) (err error) {
631632
}
632633

633634
stageClose, err := catalog.Stage(component, versionArg, progressClosure)
635+
defer stageClose()
634636
if err != nil {
637+
cli.StopProgress()
635638
return
636639
}
637-
defer stageClose()
638640

639641
downloadComplete <- 0
640642

@@ -879,7 +881,7 @@ func componentsToTable() [][]string {
879881
return out
880882
}
881883

882-
func prototypeRunComponentsInstall(cmd *cobra.Command, args []string) (err error) {
884+
func prototypeRunComponentsInstall(_ *cobra.Command, args []string) (err error) {
883885
var (
884886
componentName string = args[0]
885887
downloadComplete = make(chan int8)

lwcomponent/catalog.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package lwcomponent
22

33
import (
4+
"encoding/xml"
45
"fmt"
56
"os"
67
"path/filepath"
@@ -155,6 +156,11 @@ func (c *Catalog) Stage(
155156
return
156157
}
157158

159+
err = parseAWSXMLError(filepath.Join(stage.Directory(), stage.Filename()))
160+
if err != nil {
161+
return
162+
}
163+
158164
if err = stage.Unpack(); err != nil {
159165
stage.Close()
160166
return
@@ -444,3 +450,26 @@ func componentDirectory(componentName string) (string, error) {
444450

445451
return filepath.Join(dir, componentName), nil
446452
}
453+
454+
type awsXMLError struct {
455+
xml.Name
456+
Code string `xml:"Code"`
457+
Message string `xml:"Message"`
458+
}
459+
460+
func parseAWSXMLError(path string) error {
461+
data, err := os.ReadFile(path)
462+
if err != nil {
463+
return err
464+
}
465+
466+
xmlError := &awsXMLError{}
467+
err = xml.Unmarshal(data, xmlError)
468+
if err != nil {
469+
return nil
470+
}
471+
472+
log.Error(string(data))
473+
474+
return errors.Errorf("Code: %s. Message: %s", xmlError.Code, xmlError.Message)
475+
}

lwcomponent/catalog_test.go

Lines changed: 90 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -549,13 +549,57 @@ func TestCatalogStage(t *testing.T) {
549549
fmt.Fprint(w, generateComponentsResponse(prefix, apiComponentCount))
550550
})
551551

552+
url := "s3-download"
553+
554+
fakeServer.MockAPI(url, func(w http.ResponseWriter, r *http.Request) {
555+
dir, _ := os.MkdirTemp("", "cdk-component-stage-tar-gz-")
556+
557+
path := MakeGzip(name, MakeTar(name, "1.0.0", dir, "component", "sig"))
558+
559+
data, err := os.ReadFile(path)
560+
if err != nil {
561+
panic(err)
562+
}
563+
564+
w.Write(data)
565+
})
566+
567+
XMLUrl := "s3-error"
568+
569+
fakeServer.MockAPI(XMLUrl, func(w http.ResponseWriter, r *http.Request) {
570+
data := []byte(`<?xml version="1.0" encoding="UTF-8"?>
571+
<Error><Code>PermanentRedirect</Code>
572+
<Message>The bucket you are attempting to access must be addressed using the specified endpoint.
573+
Please send all future requests to this endpoint.</Message>
574+
<Endpoint>lw-cdk-store.s3-us-west-2.amazonaws.com</Endpoint>
575+
<Bucket>lw-cdk-store</Bucket><RequestId>VFXE02WRA7339CW6</RequestId><HostId></HostId></Error>`)
576+
w.Write(data)
577+
})
578+
579+
EOFUrl := "eof"
580+
581+
fakeServer.MockAPI(EOFUrl, func(w http.ResponseWriter, r *http.Request) {
582+
data := []byte("")
583+
w.Write(data)
584+
})
585+
552586
fakeServer.MockAPI("Components/Artifact/1", func(w http.ResponseWriter, r *http.Request) {
553587
assert.Equal(t, "GET", r.Method, "Components API only accepts HTTP GET")
554588

555-
if r.URL.Query().Get("version") != version {
556-
http.Error(w, "component version not found", http.StatusNotFound)
557-
} else {
558-
fmt.Fprint(w, generateFetchResponse(1, name, version, ""))
589+
l := r.URL.Query().Get("version")
590+
switch l {
591+
case "1.0.0":
592+
{
593+
fmt.Fprint(w, generateFetchResponse(1, name, version, fmt.Sprintf("%s/api/v2/%s", fakeServer.URL(), url)))
594+
}
595+
case "3.0.1":
596+
{
597+
fmt.Fprint(w, generateFetchResponse(1, name, version, fmt.Sprintf("%s/api/v2/%s", fakeServer.URL(), EOFUrl)))
598+
}
599+
case "5.4.3":
600+
{
601+
fmt.Fprint(w, generateFetchResponse(1, name, version, fmt.Sprintf("%s/api/v2/%s", fakeServer.URL(), XMLUrl)))
602+
}
559603
}
560604
})
561605

@@ -575,7 +619,7 @@ func TestCatalogStage(t *testing.T) {
575619
api.WithURL(fakeServer.URL()),
576620
)
577621

578-
catalog, err := lwcomponent.NewCatalog(client, newTestStage)
622+
catalog, err := lwcomponent.NewCatalog(client, lwcomponent.NewStageTarGz)
579623
assert.NotNil(t, catalog)
580624
assert.Nil(t, err)
581625

@@ -589,6 +633,29 @@ func TestCatalogStage(t *testing.T) {
589633
defer stageClose()
590634
})
591635

636+
// @jon-stewart: TODO GROW-2765
637+
// t.Run("EOF Error", func(t *testing.T) {
638+
// component, err := catalog.GetComponent(name)
639+
// assert.NotNil(t, component)
640+
// assert.Nil(t, err)
641+
642+
// stageClose, err := catalog.Stage(component, "3.0.1", ProgressClosure)
643+
// assert.NotNil(t, err)
644+
// defer stageClose()
645+
// })
646+
647+
t.Run("AWS XML Error", func(t *testing.T) {
648+
component, err := catalog.GetComponent(name)
649+
assert.NotNil(t, component)
650+
assert.Nil(t, err)
651+
652+
stageClose, err := catalog.Stage(component, "5.4.3", ProgressClosure)
653+
assert.NotNil(t, err)
654+
assert.Contains(t, err.Error(), "PermanentRedirect")
655+
656+
defer stageClose()
657+
})
658+
592659
t.Run("already installed", func(t *testing.T) {
593660
CreateLocalComponent(name, version, false)
594661

@@ -646,8 +713,19 @@ func (t *testStage) Directory() string {
646713
return t.dir
647714
}
648715

716+
// Filename implements lwcomponent.Stager.
717+
func (t *testStage) Filename() string {
718+
return "newTestStageFile"
719+
}
720+
649721
// Download implements lwcomponent.Stager.
650-
func (*testStage) Download(func(string, int64)) error {
722+
func (t *testStage) Download(func(string, int64)) error {
723+
file, err := os.Create(filepath.Join(t.dir, t.Filename()))
724+
if err != nil {
725+
log.Fatal(err)
726+
}
727+
defer file.Close()
728+
651729
return nil
652730
}
653731

@@ -678,7 +756,12 @@ func (*testStage) Validate() error {
678756
}
679757

680758
func newTestStage(name, artifactUrl string, size int64) (stage lwcomponent.Stager, err error) {
681-
stage = &testStage{}
759+
dir, err := os.MkdirTemp("", "newTestStage")
760+
if err != nil {
761+
panic(err)
762+
}
763+
764+
stage = &testStage{dir: dir}
682765

683766
return
684767
}

lwcomponent/staging.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ type Stager interface {
2828

2929
Download(progressClosure func(filepath string, sizeB int64)) error
3030

31+
Filename() string
32+
3133
Signature() (sig []byte, err error)
3234

3335
Unpack() error
@@ -87,6 +89,10 @@ func (s *stageTarGz) Directory() string {
8789
return s.dir
8890
}
8991

92+
func (s *stageTarGz) Filename() string {
93+
return filepath.Base(s.artifactUrl.Path)
94+
}
95+
9096
func (s *stageTarGz) Download(progressClosure func(filepath string, sizeB int64)) (err error) {
9197
fileName := filepath.Base(s.artifactUrl.Path)
9298

lwcomponent/staging_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,12 @@ func TestStagingTarGzUnpack(t *testing.T) {
103103
assert.NotNil(t, stage)
104104
defer stage.Close()
105105

106-
makeGzip(name, makeTar(name, "1.1.1", stage.Directory(), componentData, sigData))
106+
MakeGzip(name, MakeTar(name, "1.1.1", stage.Directory(), componentData, sigData))
107107

108108
stage.Unpack()
109109
}
110110

111-
func makeTar(name string, version string, dir string, data string, sig string) string {
111+
func MakeTar(name string, version string, dir string, data string, sig string) string {
112112
tarname := fmt.Sprintf("%s.tar", name)
113113
path := filepath.Join(dir, tarname)
114114

@@ -147,7 +147,7 @@ func makeTar(name string, version string, dir string, data string, sig string) s
147147
return path
148148
}
149149

150-
func makeGzip(name, path string) string {
150+
func MakeGzip(name, path string) string {
151151
reader, err := os.Open(path)
152152
if err != nil {
153153
panic(err)

0 commit comments

Comments
 (0)