blob: aa9ac5c9f48b86b45858bf8a6bb66e3d1b704e4e [file] [log] [blame]
giolekvaf89e0462020-05-02 17:47:06 +04001package events
2
3import (
giolekvaede6d2b2020-05-05 22:14:16 +04004 "time"
giolekvaf89e0462020-05-02 17:47:06 +04005
giolekva8d9f1022020-05-13 20:13:36 +04006 "k8s.io/client-go/kubernetes"
giolekvaf89e0462020-05-02 17:47:06 +04007
8 "github.com/golang/glog"
9 // "github.com/itaysk/regogo"
10)
11
12type Processor interface {
13 Start()
14}
15
16// Implements processor
17type singleEventAtATimeProcessor struct {
giolekva8d9f1022020-05-13 20:13:36 +040018 store EventStore
19 appManager AppManager
20 kube *kubernetes.Clientset
21 pcloudApi string
giolekvaede6d2b2020-05-05 22:14:16 +040022 // TODO(giolekva): Nodes themselves should be associated with object store
giolekvaf89e0462020-05-02 17:47:06 +040023 objectStoreApi string
24}
25
26func NewSingleEventAtATimeProcessor(
27 store EventStore,
giolekva8d9f1022020-05-13 20:13:36 +040028 appManager AppManager,
29 kube *kubernetes.Clientset,
giolekvaf89e0462020-05-02 17:47:06 +040030 pcloudApi, objectStoreApi string) Processor {
giolekva8d9f1022020-05-13 20:13:36 +040031 return &singleEventAtATimeProcessor{store, appManager, kube, pcloudApi, objectStoreApi}
giolekvaf89e0462020-05-02 17:47:06 +040032}
33
34func (p *singleEventAtATimeProcessor) Start() {
35 for {
giolekvaede6d2b2020-05-05 22:14:16 +040036 select {
37 case <-time.After(30 * time.Second):
38 events, err := p.store.GetEventsInState(EventStateNew)
39 if err != nil {
40 glog.Error(err)
41 continue
42 }
43 if len(events) == 0 {
44 continue
45 }
46 event := events[0]
giolekva8d9f1022020-05-13 20:13:36 +040047 triggers, err := p.appManager.QueryTriggers("Image", string(EventStateNew))
giolekvaede6d2b2020-05-05 22:14:16 +040048 if err != nil {
giolekvac17b19c2020-05-06 15:33:49 +040049 glog.Error(err)
giolekvaede6d2b2020-05-05 22:14:16 +040050 continue
51 }
giolekva8d9f1022020-05-13 20:13:36 +040052 for _, t := range triggers {
giolekva79323902020-05-16 13:52:19 +040053 err := p.appManager.LaunchAction(t.App, t.Action, args{event.NodeId, p.pcloudApi, p.objectStoreApi})
54 // TODO(giolekva): do not simply ignore error and monitor progress
giolekva8d9f1022020-05-13 20:13:36 +040055 if err != nil {
giolekva8d9f1022020-05-13 20:13:36 +040056 continue
57 }
giolekva79323902020-05-16 13:52:19 +040058 glog.Info("Launched action: %s %s", t.App, t.Action)
giolekva8d9f1022020-05-13 20:13:36 +040059 }
giolekvaede6d2b2020-05-05 22:14:16 +040060 p.store.MarkEventDone(event)
giolekvaf89e0462020-05-02 17:47:06 +040061 }
giolekvaf89e0462020-05-02 17:47:06 +040062 }
63}
64
giolekva8d9f1022020-05-13 20:13:36 +040065type args struct {
66 Id string
67 PCloudApiAddr string
68 ObjectStoreAddr string
69}