[lxc-devel] [distrobuilder/master] sources: Detect service releases for OpenWrt
monstermunchkin on Github
lxc-bot at linuxcontainers.org
Tue Sep 3 15:20:04 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190903/ebd2058b/attachment.bin>
-------------- next part --------------
From cdfb609c4519dcaad961ce2d6630a703c68e76a0 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Tue, 3 Sep 2019 17:18:09 +0200
Subject: [PATCH] sources: Detect service releases for OpenWrt
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
sources/openwrt-http.go | 55 +++++++++++++++++++++++++++++++-----
sources/openwrt-http_test.go | 29 +++++++++++++++++++
2 files changed, 77 insertions(+), 7 deletions(-)
create mode 100644 sources/openwrt-http_test.go
diff --git a/sources/openwrt-http.go b/sources/openwrt-http.go
index 9a5c6c5..4c7ee0c 100644
--- a/sources/openwrt-http.go
+++ b/sources/openwrt-http.go
@@ -4,8 +4,12 @@ import (
"crypto/sha256"
"errors"
"fmt"
+ "io/ioutil"
+ "net/http"
"net/url"
+ "os"
"path/filepath"
+ "regexp"
"strings"
lxd "github.com/lxc/lxd/shared"
@@ -23,21 +27,34 @@ func NewOpenWrtHTTP() *OpenWrtHTTP {
// Run downloads the tarball and unpacks it.
func (s *OpenWrtHTTP) Run(definition shared.Definition, rootfsDir string) error {
- release := definition.Image.Release
+ var baseURL string
+ release := definition.Image.Release
+ releaseInFilename := strings.ToLower(release) + "-"
architecturePath := strings.Replace(definition.Image.ArchitectureMapped, "_", "/", 1)
- baseURL := fmt.Sprintf("%s/releases/%s/targets/%s/",
- definition.Source.URL, release, architecturePath)
+ // Figure out the correct release
if release == "snapshot" {
+ // Build a daily snapshot.
baseURL = fmt.Sprintf("%s/snapshots/targets/%s/",
definition.Source.URL, architecturePath)
- }
+ releaseInFilename = ""
+ } else {
+ baseURL = fmt.Sprintf("%s/releases", definition.Source.URL)
- releaseInFilename := strings.ToLower(release) + "-"
+ matched, err := regexp.MatchString(`^\d+\.\d+$`, release)
+ if err != nil {
+ return err
+ }
- if release == "snapshot" {
- releaseInFilename = ""
+ if matched {
+ // A release of the form '18.06' has been provided. We need to find
+ // out the latest service release of the form '18.06.0'.
+ release = s.getLatestServiceRelease(baseURL, release)
+ releaseInFilename = strings.ToLower(release) + "-"
+ }
+
+ baseURL = fmt.Sprintf("%s/%s/targets/%s/", baseURL, release, architecturePath)
}
fname := fmt.Sprintf("openwrt-%s%s-generic-rootfs.tar.gz", releaseInFilename,
@@ -94,3 +111,27 @@ func (s *OpenWrtHTTP) Run(definition shared.Definition, rootfsDir string) error
return nil
}
+
+func (s *OpenWrtHTTP) getLatestServiceRelease(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/openwrt-http_test.go b/sources/openwrt-http_test.go
new file mode 100644
index 0000000..2f2170d
--- /dev/null
+++ b/sources/openwrt-http_test.go
@@ -0,0 +1,29 @@
+package sources
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestOpenWrtHTTP_getLatestServiceRelease(t *testing.T) {
+ s := &OpenWrtHTTP{}
+
+ tests := []struct {
+ release string
+ want string
+ }{
+ {
+ "17.01",
+ "17.01.7",
+ },
+ {
+ "18.06",
+ "18.06.4",
+ },
+ }
+ for _, tt := range tests {
+ baseURL := "https://downloads.openwrt.org/releases/"
+ require.Equal(t, tt.want, s.getLatestServiceRelease(baseURL, tt.release))
+ }
+}
More information about the lxc-devel
mailing list