| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 1 | package events |
| 2 | |
| 3 | import ( |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 4 | "time" |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 5 | |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 6 | "k8s.io/client-go/kubernetes" |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 7 | |
| 8 | "github.com/golang/glog" |
| 9 | // "github.com/itaysk/regogo" |
| 10 | ) |
| 11 | |
| 12 | type Processor interface { |
| 13 | Start() |
| 14 | } |
| 15 | |
| 16 | // Implements processor |
| 17 | type singleEventAtATimeProcessor struct { |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 18 | store EventStore |
| 19 | appManager AppManager |
| 20 | kube *kubernetes.Clientset |
| 21 | pcloudApi string |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 22 | // TODO(giolekva): Nodes themselves should be associated with object store |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 23 | objectStoreApi string |
| 24 | } |
| 25 | |
| 26 | func NewSingleEventAtATimeProcessor( |
| 27 | store EventStore, |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 28 | appManager AppManager, |
| 29 | kube *kubernetes.Clientset, |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 30 | pcloudApi, objectStoreApi string) Processor { |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 31 | return &singleEventAtATimeProcessor{store, appManager, kube, pcloudApi, objectStoreApi} |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 32 | } |
| 33 | |
| 34 | func (p *singleEventAtATimeProcessor) Start() { |
| 35 | for { |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 36 | 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] |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 47 | triggers, err := p.appManager.QueryTriggers("Image", string(EventStateNew)) |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 48 | if err != nil { |
| giolekva | c17b19c | 2020-05-06 15:33:49 +0400 | [diff] [blame] | 49 | glog.Error(err) |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 50 | continue |
| 51 | } |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 52 | for _, t := range triggers { |
| giolekva | 7932390 | 2020-05-16 13:52:19 +0400 | [diff] [blame] | 53 | 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 |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 55 | if err != nil { |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 56 | continue |
| 57 | } |
| giolekva | 7932390 | 2020-05-16 13:52:19 +0400 | [diff] [blame] | 58 | glog.Info("Launched action: %s %s", t.App, t.Action) |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 59 | } |
| giolekva | ede6d2b | 2020-05-05 22:14:16 +0400 | [diff] [blame] | 60 | p.store.MarkEventDone(event) |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 61 | } |
| giolekva | f89e046 | 2020-05-02 17:47:06 +0400 | [diff] [blame] | 62 | } |
| 63 | } |
| 64 | |
| giolekva | 8d9f102 | 2020-05-13 20:13:36 +0400 | [diff] [blame] | 65 | type args struct { |
| 66 | Id string |
| 67 | PCloudApiAddr string |
| 68 | ObjectStoreAddr string |
| 69 | } |