[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