The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/231
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) ===
From 84719b9ea4c99ab9893f50ca9bf538d1836c7343 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Tue, 3 Sep 2019 10:02:25 +0200 Subject: [PATCH 1/2] sources: Detect minor release number in Apertis Now it's also possible to specify releases (e.g. 18.12) and specific releases (e.g. 18.12.0). Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- sources/apertis-http.go | 59 +++++++++++++++++++++++++++++++----- sources/apertis-http_test.go | 38 +++++++++++++++++++++++ 2 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 sources/apertis-http_test.go diff --git a/sources/apertis-http.go b/sources/apertis-http.go index 0bd8ef1..797eca2 100644 --- a/sources/apertis-http.go +++ b/sources/apertis-http.go @@ -3,8 +3,13 @@ package sources import ( "errors" "fmt" + "io/ioutil" + "net/http" "net/url" + "os" "path/filepath" + "regexp" + "strings" lxd "github.com/lxc/lxd/shared" @@ -21,18 +26,32 @@ func NewApertisHTTP() *ApertisHTTP { // Run downloads the tarball and unpacks it. func (s *ApertisHTTP) Run(definition shared.Definition, rootfsDir string) error { - architecture := definition.Image.Architecture release := definition.Image.Release - variant := definition.Image.Variant - serial := definition.Image.Serial + exactRelease := release // https://images.apertis.org/daily/v2020dev0/20190830.0/amd64/minimal/ospack_v2020dev0-amd64-minimal_20190830.0.tar.gz - baseURL := fmt.Sprintf("%s/%s", - definition.Source.URL, definition.Source.Variant) - baseURL = fmt.Sprintf("%s/%s/%s/%s/%s/", - baseURL, release, serial, architecture, variant) + baseURL := fmt.Sprintf("%s/%s/%s", + definition.Source.URL, definition.Source.Variant, release) + + resp, err := http.Head(baseURL) + if err != nil { + return err + } + + if resp.StatusCode == http.StatusNotFound { + // Possibly, release is a specific release (18.12.0 instead of 18.12). Lets trim the prefix and continue. + re := regexp.MustCompile(`\.\d+$`) + release = strings.TrimSuffix(release, re.FindString(release)) + baseURL = fmt.Sprintf("%s/%s/%s", + definition.Source.URL, definition.Source.Variant, release) + } else { + exactRelease = s.getLatestRelease(baseURL, release) + } + + baseURL = fmt.Sprintf("%s/%s/%s/%s/", + baseURL, exactRelease, definition.Image.ArchitectureMapped, definition.Image.Variant) fname := fmt.Sprintf("ospack_%s-%s-%s_%s.tar.gz", - release, architecture, variant, serial) + release, definition.Image.ArchitectureMapped, definition.Image.Variant, exactRelease) url, err := url.Parse(baseURL) if err != nil { @@ -57,3 +76,27 @@ func (s *ApertisHTTP) Run(definition shared.Definition, rootfsDir string) error return nil } + +func (s *ApertisHTTP) getLatestRelease(baseURL, release string) string { + resp, err := http.Get(baseURL) + if err != nil { + fmt.Fprintln(os.Stderr, err) + return "" + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + fmt.Fprintln(os.Stderr, err) + return "" + } + + regex := regexp.MustCompile(fmt.Sprintf(">(%s\\.\\d+)/<", release)) + releases := regex.FindAllStringSubmatch(string(body), -1) + + if len(releases) > 0 { + return releases[len(releases)-1][1] + } + + return "" +} diff --git a/sources/apertis-http_test.go b/sources/apertis-http_test.go new file mode 100644 index 0000000..aa899dc --- /dev/null +++ b/sources/apertis-http_test.go @@ -0,0 +1,38 @@ +package sources + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestApertisHTTP_getLatestRelease(t *testing.T) { + s := &ApertisHTTP{} + + tests := []struct { + release string + want string + }{ + { + "17.12", + "17.12.1", + }, + { + "18.03", + "18.03.0", + }, + { + "18.12", + "18.12.0", + }, + { + "v2019pre", + "v2019pre.0", + }, + } + for _, tt := range tests { + baseURL := fmt.Sprintf("https://images.apertis.org/release/%s", tt.release) + require.Equal(t, tt.want, s.getLatestRelease(baseURL, tt.release)) + } +} From 5dcbf2e4973bae831d744a7f0c0d19958087fc3d Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Tue, 3 Sep 2019 10:36:46 +0200 Subject: [PATCH 2/2] doc: Update Apertis example Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- doc/examples/apertis | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/examples/apertis b/doc/examples/apertis index 7648cac..9c171d1 100644 --- a/doc/examples/apertis +++ b/doc/examples/apertis @@ -3,9 +3,8 @@ image: description: Apertis {{ image.architecture }} {{ image.variant }} {{ image.release }} {{ image.serial }} release: v2019pre variant: minimal - serial: v2019pre.0 expiry: 30d - architecture: amd64 + architecture: x86_64 source: downloader: apertis-http @@ -61,3 +60,6 @@ environment: variables: - key: TMPDIR set: false + +mappings: + architecture_map: debian
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel