diff --git a/api/bolt/datastore.go b/api/bolt/datastore.go index cbb7a7b24..a857375f3 100644 --- a/api/bolt/datastore.go +++ b/api/bolt/datastore.go @@ -125,6 +125,7 @@ func (store *Store) MigrateData() error { RegistryService: store.RegistryService, ResourceControlService: store.ResourceControlService, RoleService: store.RoleService, + ScheduleService: store.ScheduleService, SettingsService: store.SettingsService, StackService: store.StackService, TeamMembershipService: store.TeamMembershipService, diff --git a/api/bolt/migrator/migrate_dbversion19.go b/api/bolt/migrator/migrate_dbversion19.go index f98d78ccc..0692db5af 100644 --- a/api/bolt/migrator/migrate_dbversion19.go +++ b/api/bolt/migrator/migrate_dbversion19.go @@ -1,6 +1,10 @@ package migrator -import portainer "github.com/portainer/portainer/api" +import ( + "strings" + + portainer "github.com/portainer/portainer/api" +) func (m *Migrator) updateUsersToDBVersion20() error { authorizationServiceParameters := &portainer.AuthorizationServiceParameters{ @@ -26,3 +30,38 @@ func (m *Migrator) updateSettingsToDBVersion20() error { 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 +} diff --git a/api/bolt/migrator/migrator.go b/api/bolt/migrator/migrator.go index 52e4ee03f..712730fd1 100644 --- a/api/bolt/migrator/migrator.go +++ b/api/bolt/migrator/migrator.go @@ -9,6 +9,7 @@ import ( "github.com/portainer/portainer/api/bolt/registry" "github.com/portainer/portainer/api/bolt/resourcecontrol" "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/stack" "github.com/portainer/portainer/api/bolt/teammembership" @@ -28,6 +29,7 @@ type ( registryService *registry.Service resourceControlService *resourcecontrol.Service roleService *role.Service + scheduleService *schedule.Service settingsService *settings.Service stackService *stack.Service teamMembershipService *teammembership.Service @@ -47,6 +49,7 @@ type ( RegistryService *registry.Service ResourceControlService *resourcecontrol.Service RoleService *role.Service + ScheduleService *schedule.Service SettingsService *settings.Service StackService *stack.Service TeamMembershipService *teammembership.Service @@ -68,6 +71,7 @@ func NewMigrator(parameters *Parameters) *Migrator { registryService: parameters.RegistryService, resourceControlService: parameters.ResourceControlService, roleService: parameters.RoleService, + scheduleService: parameters.ScheduleService, settingsService: parameters.SettingsService, teamMembershipService: parameters.TeamMembershipService, templateService: parameters.TemplateService, @@ -276,6 +280,11 @@ func (m *Migrator) Migrate() error { if err != nil { return err } + + err = m.updateSchedulesToDBVersion20() + if err != nil { + return err + } } return m.versionService.StoreDBVersion(portainer.DBVersion) diff --git a/api/portainer.go b/api/portainer.go index be332f7e8..7fdf39b5c 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -905,7 +905,7 @@ const ( // APIVersion is the version number of the Portainer API APIVersion = "1.22.0" // DBVersion is the version number of the Portainer database - DBVersion = 21 + DBVersion = 20 // 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 diff --git a/app/portainer/components/forms/schedule-form/schedule-form.js b/app/portainer/components/forms/schedule-form/schedule-form.js index 7d3685eff..1ca8de98b 100644 --- a/app/portainer/components/forms/schedule-form/schedule-form.js +++ b/app/portainer/components/forms/schedule-form/schedule-form.js @@ -10,15 +10,15 @@ angular.module('portainer.app').component('scheduleForm', { }; ctrl.scheduleValues = [{ - displayed: 'Every hour', - cron: '0 0 * * *' - }, + displayed: 'Every hour', + cron: '0 * * * *' + }, { displayed: 'Every 2 hours', - cron: '0 0 0/2 * *' + cron: '0 */2 * * *' }, { displayed: 'Every day', - cron: '0 0 0 * *' + cron: '0 0 * * *' } ];