annotate pkg/scheduler/scheduler.go @ 1547:d4b7a6d054cd

Add table to store import configuration.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 10 Dec 2018 15:55:10 +0100
parents 5f80ec319a4f
children fe633765e05b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2018 by via donau
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package scheduler
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 "errors"
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "sync"
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "github.com/robfig/cron"
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 )
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
23 // ErrNoSuchAction if no fitting action was found.
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 var ErrNoSuchAction = errors.New("No such action")
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
26 // Action is called with a user and an optional configuration id.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
27 type Action func(user string, cfgID *int64)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
28
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
29 type userAction struct {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
30 scheduler *scheduler
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
31 user string
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
32 name string
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
33 cfgID *int64
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 }
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 type scheduler struct {
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 cr *cron.Cron
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
38 actions map[string]Action
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 mu sync.Mutex
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 }
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
42 // Run implements cron.Job.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
43 func (ua *userAction) Run() {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
44 if a := ua.scheduler.action(ua.name); a != nil {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
45 a(ua.user, ua.cfgID)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
46 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
47 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
48
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 var global = scheduler{
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 cr: cron.New(),
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
51 actions: make(map[string]Action),
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
52 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
53
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
54 // RegisterAction registers a named action to the global scheduler.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
55 func RegisterAction(name string, action Action) {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
56 global.registerAction(name, action)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
57 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
58
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
59 // UnregisterAction ungesiters a named action from the global scheduler.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
60 func UnregisterAction(name string) {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
61 global.unregisterAction(name)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
62 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
63
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
64 // BindAction binds a named action to a user, a cron spec and
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
65 // an optional configuration id.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
66 func BindAction(name, spec, user string, cfgID *int64) error {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
67 return global.bindAction(name, spec, user, cfgID)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
68 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
69
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
70 // UnbindAction unbins a named action from a user and and
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
71 // an optional configuration id.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
72 func UnbindAction(name, user string, cfgID *int64) error {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
73 return global.unbindAction(name, user, cfgID)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
74 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
75
1544
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
76 func UnbindUser(user string) {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
77 global.unbindUser(user)
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
78 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
79
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
80 func sameCfgID(a, b *int64) bool {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
81 return (a == nil && b == nil) || (a != nil && b != nil && *a == *b)
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83
1544
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
84 func (s *scheduler) unbindUser(user string) {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
85 s.mu.Lock()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
86 defer s.mu.Unlock()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
87
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
88 entries := s.cr.Entries()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
89
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
90 if len(entries) == 0 {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
91 return
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
92 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
93
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
94 var found bool
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
95 for _, entry := range entries {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
96 ua := entry.Job.(*userAction)
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
97 if ua.user == user {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
98 found = true
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
99 break
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
100 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
101 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
102 if !found {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
103 return
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
104 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
105
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
106 s.cr.Stop()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
107 s.cr = cron.New()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
108 for _, entry := range entries {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
109 ua := entry.Job.(*userAction)
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
110 if ua.user != user {
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
111 s.cr.Schedule(entry.Schedule, entry.Job)
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
112 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
113 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
114 s.cr.Start()
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
115 }
5f80ec319a4f If a user is removed or renamed kill her/his schedule. Needs more case on renaming.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1541
diff changeset
116
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
117 func (s *scheduler) unbindAction(name, user string, cfgID *int64) error {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
118 s.mu.Lock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
119 defer s.mu.Unlock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
120
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
121 entries := s.cr.Entries()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
122
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
123 var found *userAction
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
124 for _, entry := range entries {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
125 ua := entry.Job.(*userAction)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
126 if ua.name == name && ua.user == user && sameCfgID(cfgID, ua.cfgID) {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
127 // Already have such a user/action/cfg tuple -> re-schedule.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
128 found = ua
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
129 break
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
130 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
131 }
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
132
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
133 if found == nil {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
134 return ErrNoSuchAction
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
135 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
136
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
137 s.cr.Stop()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
138 s.cr = cron.New()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
139 for _, entry := range entries {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
140 ua := entry.Job.(*userAction)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
141 if ua != found {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
142 s.cr.Schedule(entry.Schedule, entry.Job)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
143 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
144 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
145 s.cr.Start()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
146
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
147 return nil
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
148 }
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
150 func (s *scheduler) bindAction(name, spec, user string, cfgID *int64) error {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
151
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
152 schedule, err := cron.Parse(spec)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
153 if err != nil {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
154 return err
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
155 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
156
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
157 s.mu.Lock()
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
158 defer s.mu.Unlock()
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
159
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
160 action := s.actions[name]
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
161 if action == nil {
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
162 return ErrNoSuchAction
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
163 }
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
164
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
165 entries := s.cr.Entries()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
166
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
167 var found *userAction
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
168 for _, entry := range entries {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
169 ua := entry.Job.(*userAction)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
170 if ua.name == name && ua.user == user && sameCfgID(cfgID, ua.cfgID) {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
171 // Already have such a user/action/cfg tuple -> re-schedule.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
172 found = ua
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
173 break
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
174 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
175 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
176
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
177 if found == nil {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
178 // Add to current plan.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
179 job := &userAction{scheduler: s, user: user, name: name, cfgID: cfgID}
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
180 s.cr.Schedule(schedule, job)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
181 } else {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
182 // If found re-build all.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
183 s.cr.Stop()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
184 s.cr = cron.New()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
185 for _, entry := range entries {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
186 ua := entry.Job.(*userAction)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
187 var sch cron.Schedule
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
188 if found == ua {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
189 // replace with new schedule.
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
190 sch = schedule
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
191 } else {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
192 sch = entry.Schedule
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
193 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
194 s.cr.Schedule(sch, entry.Job)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
195 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
196 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
197 s.cr.Start()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
198
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
199 return nil
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
200 }
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
202 func (s *scheduler) action(name string) Action {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
203 s.mu.Lock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
204 defer s.mu.Unlock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
205 return s.actions[name]
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
206 }
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
207
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
208 func (s *scheduler) registerAction(name string, action Action) {
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
209 s.mu.Lock()
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
210 defer s.mu.Unlock()
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
211 s.actions[name] = action
1540
251ee25accce Droped on scheduler in favor for a third party library.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
212 }
1541
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
213
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
214 func (s *scheduler) unregisterAction(name string) {
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
215 s.mu.Lock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
216 defer s.mu.Unlock()
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
217 delete(s.actions, name)
03fcad10104a Added an internal cron job executor which binds actions to tuples of cron schedule, user name and an optional configuation id.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 1540
diff changeset
218 }