Check for newer version available (#47)

* Add helm version requirement notes

* Check for newer version and offer upgrade

* fix lint
This commit is contained in:
Andrey Pokhilko
2022-10-26 12:35:07 +01:00
committed by GitHub
parent b0067e31ba
commit de0024cd03
8 changed files with 96 additions and 19 deletions

View File

@@ -44,7 +44,7 @@ func contextSetter(data *subproc.DataLayer) gin.HandlerFunc {
}
}
func NewRouter(abortWeb utils.ControlChan, data *subproc.DataLayer, version string) *gin.Engine {
func NewRouter(abortWeb utils.ControlChan, data *subproc.DataLayer) *gin.Engine {
var api *gin.Engine
if os.Getenv("DEBUG") == "" {
api = gin.New()
@@ -58,12 +58,12 @@ func NewRouter(abortWeb utils.ControlChan, data *subproc.DataLayer, version stri
api.Use(errorHandler)
configureStatic(api)
configureRoutes(abortWeb, data, api, version)
configureRoutes(abortWeb, data, api)
return api
}
func configureRoutes(abortWeb utils.ControlChan, data *subproc.DataLayer, api *gin.Engine, version string) {
func configureRoutes(abortWeb utils.ControlChan, data *subproc.DataLayer, api *gin.Engine) {
// server shutdown handler
api.DELETE("/", func(c *gin.Context) {
abortWeb <- struct{}{}
@@ -71,7 +71,7 @@ func configureRoutes(abortWeb utils.ControlChan, data *subproc.DataLayer, api *g
})
api.GET("/status", func(c *gin.Context) {
c.String(http.StatusOK, version)
c.IndentedJSON(http.StatusOK, data.VersionInfo)
})
configureHelms(api.Group("/api/helm"), data)

View File

@@ -2,13 +2,16 @@ package dashboard
import (
"context"
"encoding/json"
"github.com/gin-gonic/gin"
"github.com/hashicorp/go-version"
"github.com/komodorio/helm-dashboard/pkg/dashboard/scanners"
"github.com/komodorio/helm-dashboard/pkg/dashboard/subproc"
"github.com/komodorio/helm-dashboard/pkg/dashboard/utils"
log "github.com/sirupsen/logrus"
"net/http"
"os"
"time"
)
func StartServer(version string) (string, utils.ControlChan) {
@@ -19,6 +22,9 @@ func StartServer(version string) (string, utils.ControlChan) {
os.Exit(1) // TODO: propagate error instead?
}
data.VersionInfo = &subproc.VersionInfo{CurVer: version}
go checkUpgrade(data.VersionInfo)
discoverScanners(&data)
address := os.Getenv("HD_BIND")
@@ -33,7 +39,7 @@ func StartServer(version string) (string, utils.ControlChan) {
}
abort := make(utils.ControlChan)
api := NewRouter(abort, &data, version)
api := NewRouter(abort, &data)
done := startBackgroundServer(address, api, abort)
return "http://" + address, done
@@ -75,3 +81,44 @@ func discoverScanners(data *subproc.DataLayer) {
}
}
}
func checkUpgrade(d *subproc.VersionInfo) {
url := "https://api.github.com/repos/komodorio/helm-dashboard/releases/latest"
type GHRelease struct {
Name string `json:"name"`
}
var myClient = &http.Client{Timeout: 5 * time.Second}
r, err := myClient.Get(url)
if err != nil {
log.Warnf("Failed to check for new version: %s", err)
return
}
defer r.Body.Close()
target := new(GHRelease)
err = json.NewDecoder(r.Body).Decode(target)
if err != nil {
log.Warnf("Failed to decode new release version: %s", err)
return
}
d.LatestVer = target.Name
v1, err := version.NewVersion(d.CurVer)
if err != nil {
log.Warnf("Failed to parse version: %s", err)
v1 = &version.Version{}
}
v2, err := version.NewVersion(d.LatestVer)
if err != nil {
log.Warnf("Failed to parse version: %s", err)
} else {
if v1.LessThan(v2) {
log.Warnf("Newer Helm Dashboard version is available: %s", d.LatestVer)
log.Warnf("Upgrade instructions: https://github.com/komodorio/helm-dashboard#installing")
} else {
log.Debugf("Got latest version from GH: %s", d.LatestVer)
}
}
}

View File

@@ -5,8 +5,8 @@
})(window,document,'script','https://www.datadoghq-browser-agent.com/datadog-rum-v4.js','DD_RUM')
DD_RUM.onReady(function() {
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
const version = xhr.responseText;
xhr.onload = function() {
const version = JSON.parse(xhr.responseText).VerCur;
if (xhr.readyState === XMLHttpRequest.DONE && version!=="dev") {
DD_RUM.init({
clientToken: 'pub16d64cd1c00cf073ce85af914333bf72',

View File

@@ -54,8 +54,11 @@
<a class="nav-link px-3 section-repo">Repository</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
<a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown"
aria-expanded="false">
<span class="position-absolute top-50 start-0 translate-middle p-1 bg-danger border border-light rounded-circle new-version-pill display-none">
<span class="visually-hidden">New version</span>
</span>
Help
</a>
<ul class="dropdown-menu fs-80">
@@ -67,6 +70,13 @@
<hr class="dropdown-divider">
</li>
<li><a class="dropdown-item disabled" href="#">Version <span id="toolVersion"></span></a></li>
<li class="">
<a class="dropdown-item position-relative" href="https://github.com/komodorio/helm-dashboard#installing" target="_blank">
<span class="position-absolute top-50 start-0 translate-middle p-1 bg-danger border border-light rounded-circle new-version-pill display-none">
<span class="visually-hidden">New version</span>
</span>
Upgrade to <span id="toolVersionUpgrade"></span>
</a></li>
</ul>
</li>

View File

@@ -22,7 +22,7 @@ $(function () {
}
})
$.get("/status").fail(function (xhr) {
$.getJSON("/status").fail(function (xhr) {
reportError("Failed to get tool version", xhr)
}).done(function (data) {
fillToolVersion(data)
@@ -51,18 +51,20 @@ function initView() {
$("#topNav ul a").click(function () {
const self = $(this)
if (self.hasClass("section-repo")) {
setHashParam("section", "repository")
} else if (self.hasClass("section-installed")) {
setHashParam("section", null)
} else {
return
}
$("#topNav ul a").removeClass("active")
const ctx = getHashParam("context")
setHashParam(null, null)
setHashParam("context", ctx)
if (self.hasClass("section-repo")) {
setHashParam("section", "repository")
} else {
setHashParam("section", null)
}
initView()
})
@@ -192,6 +194,14 @@ $(".bi-power").click(function () {
})
function isNewerVersion(oldVer, newVer) {
if (oldVer && oldVer[0] === 'v') {
oldVer = oldVer.substring(1)
}
if (newVer && newVer[0] === 'v') {
newVer = newVer.substring(1)
}
const oldParts = oldVer.split('.')
const newParts = newVer.split('.')
for (let i = 0; i < newParts.length; i++) {
@@ -204,5 +214,9 @@ function isNewerVersion(oldVer, newVer) {
}
function fillToolVersion(data) {
$("#toolVersion").append($('<a>' + data + '</a>'))
$("#toolVersion").text(data.CurVer)
if (isNewerVersion(data.CurVer, data.LatestVer)) {
$("#toolVersionUpgrade").text(data.LatestVer)
$(".new-version-pill").show()
}
}

View File

@@ -25,6 +25,12 @@ type DataLayer struct {
Helm string
Kubectl string
Scanners []Scanner
VersionInfo *VersionInfo
}
type VersionInfo struct {
CurVer string
LatestVer string
}
func (d *DataLayer) runCommand(cmd ...string) (string, error) {