fix(api): fix an issue with unsupported cron format (#3240)

* fix(api): fix an issue with unsupported cron format

* refactor(api): review migration method
pull/3249/head
Anthony Lapenna 2019-10-08 16:18:32 +13:00 committed by GitHub
parent d717ad947b
commit 182f3734d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 7 deletions

View File

@ -125,6 +125,7 @@ func (store *Store) MigrateData() error {
RegistryService: store.RegistryService, RegistryService: store.RegistryService,
ResourceControlService: store.ResourceControlService, ResourceControlService: store.ResourceControlService,
RoleService: store.RoleService, RoleService: store.RoleService,
ScheduleService: store.ScheduleService,
SettingsService: store.SettingsService, SettingsService: store.SettingsService,
StackService: store.StackService, StackService: store.StackService,
TeamMembershipService: store.TeamMembershipService, TeamMembershipService: store.TeamMembershipService,

View File

@ -1,6 +1,10 @@
package migrator package migrator
import portainer "github.com/portainer/portainer/api" import (
"strings"
portainer "github.com/portainer/portainer/api"
)
func (m *Migrator) updateUsersToDBVersion20() error { func (m *Migrator) updateUsersToDBVersion20() error {
authorizationServiceParameters := &portainer.AuthorizationServiceParameters{ authorizationServiceParameters := &portainer.AuthorizationServiceParameters{
@ -26,3 +30,38 @@ func (m *Migrator) updateSettingsToDBVersion20() error {
return m.settingsService.UpdateSettings(legacySettings) return m.settingsService.UpdateSettings(legacySettings)
} }
func (m *Migrator) updateSchedulesToDBVersion20() error {
legacySchedules, err := m.scheduleService.Schedules()
if err != nil {
return err
}
for _, schedule := range legacySchedules {
if schedule.JobType == portainer.ScriptExecutionJobType {
if schedule.CronExpression == "0 0 * * *" {
schedule.CronExpression = "0 * * * *"
} else if schedule.CronExpression == "0 0 0/2 * *" {
schedule.CronExpression = "0 */2 * * *"
} else if schedule.CronExpression == "0 0 0 * *" {
schedule.CronExpression = "0 0 * * *"
} else {
revisedCronExpression := strings.Split(schedule.CronExpression, " ")
if len(revisedCronExpression) == 5 {
continue
}
revisedCronExpression = revisedCronExpression[1:]
schedule.CronExpression = strings.Join(revisedCronExpression, " ")
}
err := m.scheduleService.UpdateSchedule(schedule.ID, &schedule)
if err != nil {
return err
}
}
}
return nil
}

View File

@ -9,6 +9,7 @@ import (
"github.com/portainer/portainer/api/bolt/registry" "github.com/portainer/portainer/api/bolt/registry"
"github.com/portainer/portainer/api/bolt/resourcecontrol" "github.com/portainer/portainer/api/bolt/resourcecontrol"
"github.com/portainer/portainer/api/bolt/role" "github.com/portainer/portainer/api/bolt/role"
"github.com/portainer/portainer/api/bolt/schedule"
"github.com/portainer/portainer/api/bolt/settings" "github.com/portainer/portainer/api/bolt/settings"
"github.com/portainer/portainer/api/bolt/stack" "github.com/portainer/portainer/api/bolt/stack"
"github.com/portainer/portainer/api/bolt/teammembership" "github.com/portainer/portainer/api/bolt/teammembership"
@ -28,6 +29,7 @@ type (
registryService *registry.Service registryService *registry.Service
resourceControlService *resourcecontrol.Service resourceControlService *resourcecontrol.Service
roleService *role.Service roleService *role.Service
scheduleService *schedule.Service
settingsService *settings.Service settingsService *settings.Service
stackService *stack.Service stackService *stack.Service
teamMembershipService *teammembership.Service teamMembershipService *teammembership.Service
@ -47,6 +49,7 @@ type (
RegistryService *registry.Service RegistryService *registry.Service
ResourceControlService *resourcecontrol.Service ResourceControlService *resourcecontrol.Service
RoleService *role.Service RoleService *role.Service
ScheduleService *schedule.Service
SettingsService *settings.Service SettingsService *settings.Service
StackService *stack.Service StackService *stack.Service
TeamMembershipService *teammembership.Service TeamMembershipService *teammembership.Service
@ -68,6 +71,7 @@ func NewMigrator(parameters *Parameters) *Migrator {
registryService: parameters.RegistryService, registryService: parameters.RegistryService,
resourceControlService: parameters.ResourceControlService, resourceControlService: parameters.ResourceControlService,
roleService: parameters.RoleService, roleService: parameters.RoleService,
scheduleService: parameters.ScheduleService,
settingsService: parameters.SettingsService, settingsService: parameters.SettingsService,
teamMembershipService: parameters.TeamMembershipService, teamMembershipService: parameters.TeamMembershipService,
templateService: parameters.TemplateService, templateService: parameters.TemplateService,
@ -276,6 +280,11 @@ func (m *Migrator) Migrate() error {
if err != nil { if err != nil {
return err return err
} }
err = m.updateSchedulesToDBVersion20()
if err != nil {
return err
}
} }
return m.versionService.StoreDBVersion(portainer.DBVersion) return m.versionService.StoreDBVersion(portainer.DBVersion)

View File

@ -905,7 +905,7 @@ const (
// APIVersion is the version number of the Portainer API // APIVersion is the version number of the Portainer API
APIVersion = "1.22.0" APIVersion = "1.22.0"
// DBVersion is the version number of the Portainer database // DBVersion is the version number of the Portainer database
DBVersion = 21 DBVersion = 20
// AssetsServerURL represents the URL of the Portainer asset server // AssetsServerURL represents the URL of the Portainer asset server
AssetsServerURL = "https://portainer-io-assets.sfo2.digitaloceanspaces.com" AssetsServerURL = "https://portainer-io-assets.sfo2.digitaloceanspaces.com"
// MessageOfTheDayURL represents the URL where Portainer MOTD message can be retrieved // MessageOfTheDayURL represents the URL where Portainer MOTD message can be retrieved

View File

@ -11,14 +11,14 @@ angular.module('portainer.app').component('scheduleForm', {
ctrl.scheduleValues = [{ ctrl.scheduleValues = [{
displayed: 'Every hour', displayed: 'Every hour',
cron: '0 0 * * *' cron: '0 * * * *'
}, },
{ {
displayed: 'Every 2 hours', displayed: 'Every 2 hours',
cron: '0 0 0/2 * *' cron: '0 */2 * * *'
}, { }, {
displayed: 'Every day', displayed: 'Every day',
cron: '0 0 0 * *' cron: '0 0 * * *'
} }
]; ];