Compare commits

...

3 Commits

Author SHA1 Message Date
Anthony Lapenna
f347d97daf chore(version): bump version number 2020-07-23 10:28:34 +12:00
Anthony Lapenna
d5cee5b8b1 feat(core/extensions): add the ability to update a license (#4081)
* feat(core/extensions): add the ability to update a license

* feat(core/extensions): trigger data upgrade if extension is not enabled yet

* feat(core/extensions): trigger data upgrade if extension is not enabled yet

* feat(core/extensions): trigger data upgrade if extension is not enabled yet

* feat(core/extensions): trigger data upgrade if extension is not enabled yet
2020-07-22 21:13:51 +12:00
Anthony Lapenna
4da6824bc7 feat(database): review database migration (#4054) 2020-07-17 17:04:32 +12:00
12 changed files with 68 additions and 36 deletions

View File

@@ -4,19 +4,6 @@ import (
"github.com/portainer/portainer/api"
)
func (m *Migrator) updateSettingsToDBVersion23() error {
legacySettings, err := m.settingsService.Settings()
if err != nil {
return err
}
legacySettings.AllowDeviceMappingForRegularUsers = true
legacySettings.AllowStackManagementForRegularUsers = true
legacySettings.AllowHostNamespaceForRegularUsers = true
return m.settingsService.UpdateSettings(legacySettings)
}
func (m *Migrator) updateTagsToDBVersion23() error {
tags, err := m.tagService.Tags()
if err != nil {

View File

@@ -0,0 +1,14 @@
package migrator
func (m *Migrator) updateSettingsToDBVersion24() error {
legacySettings, err := m.settingsService.Settings()
if err != nil {
return err
}
legacySettings.AllowDeviceMappingForRegularUsers = true
legacySettings.AllowStackManagementForRegularUsers = true
legacySettings.AllowHostNamespaceForRegularUsers = true
return m.settingsService.UpdateSettings(legacySettings)
}

View File

@@ -309,7 +309,7 @@ func (m *Migrator) Migrate() error {
}
}
// Portainer 1.24.1-dev
// Portainer 1.24.0
if m.currentDBVersion < 23 {
err := m.updateTagsToDBVersion23()
if err != nil {
@@ -320,8 +320,11 @@ func (m *Migrator) Migrate() error {
if err != nil {
return err
}
}
err = m.updateSettingsToDBVersion23()
// Portainer 1.24.1
if m.currentDBVersion < 24 {
err := m.updateSettingsToDBVersion24()
if err != nil {
return err
}

View File

@@ -41,16 +41,21 @@ func (handler *Handler) extensionCreate(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve extensions status from the database", err}
}
for _, existingExtension := range extensions {
if existingExtension.ID == extensionID && existingExtension.Enabled {
return &httperror.HandlerError{http.StatusConflict, "Unable to enable extension", portainer.ErrExtensionAlreadyEnabled}
}
}
extension := &portainer.Extension{
ID: extensionID,
}
for _, existingExtension := range extensions {
if existingExtension.ID == extensionID && (existingExtension.Enabled || !existingExtension.License.Valid) {
if existingExtension.License.LicenseKey == payload.License {
return &httperror.HandlerError{http.StatusConflict, "Unable to enable extension", portainer.ErrExtensionAlreadyEnabled}
}
_ = handler.ExtensionManager.DisableExtension(&existingExtension)
extension.Enabled = true
}
}
extensionDefinitions, err := handler.ExtensionManager.FetchExtensionDefinitions()
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve extension definitions", err}
@@ -68,15 +73,14 @@ func (handler *Handler) extensionCreate(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to enable extension", err}
}
extension.Enabled = true
if extension.ID == portainer.RBACExtension {
if extension.ID == portainer.RBACExtension && !extension.Enabled {
err = handler.upgradeRBACData()
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "An error occured during database update", err}
}
}
extension.Enabled = true
err = handler.ExtensionService.Persist(extension)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to persist extension status inside the database", err}

View File

@@ -46,10 +46,21 @@ func (handler *Handler) extensionUpload(w http.ResponseWriter, r *http.Request)
}
extensionID := portainer.ExtensionID(extensionIdentifier)
extensions, err := handler.ExtensionService.Extensions()
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to retrieve extensions status from the database", err}
}
extension := &portainer.Extension{
ID: extensionID,
}
for _, existingExtension := range extensions {
if existingExtension.ID == extensionID && (existingExtension.Enabled || !existingExtension.License.Valid) {
extension.Enabled = true
}
}
_ = handler.ExtensionManager.DisableExtension(extension)
err = handler.ExtensionManager.InstallExtension(extension, payload.License, payload.ArchiveFileName, payload.ExtensionArchive)
@@ -57,15 +68,15 @@ func (handler *Handler) extensionUpload(w http.ResponseWriter, r *http.Request)
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to install extension", err}
}
extension.Enabled = true
if extension.ID == portainer.RBACExtension {
if extension.ID == portainer.RBACExtension && !extension.Enabled {
err = handler.upgradeRBACData()
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "An error occured during database update", err}
}
}
extension.Enabled = true
err = handler.ExtensionService.Persist(extension)
if err != nil {
return &httperror.HandlerError{http.StatusInternalServerError, "Unable to persist extension status inside the database", err}

View File

@@ -1010,9 +1010,9 @@ type (
const (
// APIVersion is the version number of the Portainer API
APIVersion = "1.24.1-dev"
APIVersion = "1.24.1"
// DBVersion is the version number of the Portainer database
DBVersion = 23
DBVersion = 24
// AssetsServerURL represents the URL of the Portainer asset server
AssetsServerURL = "https://portainer-io-assets.sfo2.digitaloceanspaces.com"
// MessageOfTheDayURL represents the URL where Portainer MOTD message can be retrieved

View File

@@ -54,7 +54,7 @@ info:
**NOTE**: You can find more information on how to query the Docker API in the [Docker official documentation](https://docs.docker.com/engine/api/v1.30/) as well as in [this Portainer example](https://gist.github.com/deviantony/77026d402366b4b43fa5918d41bc42f8).
version: "1.24.1-dev"
version: "1.24.1"
title: "Portainer API"
contact:
email: "info@portainer.io"
@@ -3174,7 +3174,7 @@ definitions:
description: "Is analytics enabled"
Version:
type: "string"
example: "1.24.1-dev"
example: "1.24.1"
description: "Portainer API version"
PublicSettingsInspectResponse:
type: "object"

View File

@@ -1,5 +1,5 @@
{
"packageName": "portainer",
"packageVersion": "1.24.1-dev",
"packageVersion": "1.24.1",
"projectName": "portainer"
}

View File

@@ -102,8 +102,10 @@
button-spinner="state.actionInProgress"
style="margin-left: 0px;"
>
<span ng-hide="state.actionInProgress">Enable extension</span>
<span ng-show="state.actionInProgress">Enabling extension...</span>
<span ng-hide="state.actionInProgress" ng-if="!state.updateLicense">Enable extension</span>
<span ng-show="state.actionInProgress" ng-if="!state.updateLicense">Enabling extension...</span>
<span ng-hide="state.actionInProgress" ng-if="state.updateLicense">Update license</span>
<span ng-show="state.actionInProgress" ng-if="state.updateLicense">Updating license...</span>
</button>
</div>
</div>

View File

@@ -1,4 +1,5 @@
import moment from 'moment';
import _ from 'lodash-es';
angular.module('portainer.app').controller('ExtensionsController', [
'$scope',
@@ -9,6 +10,7 @@ angular.module('portainer.app').controller('ExtensionsController', [
$scope.state = {
actionInProgress: false,
currentDate: moment().format('YYYY-MM-dd'),
updateLicense: false,
};
$scope.formValues = {
@@ -59,6 +61,15 @@ angular.module('portainer.app').controller('ExtensionsController', [
valid = false;
}
const licensePrefix = $scope.formValues.License[0];
$scope.state.updateLicense = false;
_.forEach($scope.extensions, (extension) => {
if (licensePrefix === '' + extension.Id && extension.Enabled) {
$scope.state.updateLicense = true;
}
});
form.extension_license.$setValidity('invalidLicense', valid);
};

View File

@@ -1,5 +1,5 @@
Name: portainer
Version: 1.24.1-dev
Version: 1.24.1
Release: 0
License: Zlib
Summary: A lightweight docker management UI

View File

@@ -2,7 +2,7 @@
"author": "Portainer.io",
"name": "portainer",
"homepage": "http://portainer.io",
"version": "1.24.1-dev",
"version": "1.24.1",
"repository": {
"type": "git",
"url": "git@github.com:portainer/portainer.git"