blob: 79e2a842075fd4e1c493353ed7e7d9cabcb2072c [file] [log] [blame]
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +02001package model
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7
8 "github.com/golang/glog"
9)
10
11func (s *sqlModel) SubmitPeerCheckResults(ctx context.Context, res []*PeerCheckResult) error {
12 tx := s.db.MustBeginTx(ctx, &sql.TxOptions{})
13 defer tx.Rollback()
14
15 q := `
16 UPDATE peer_checks
17 SET delete = true
18 `
19 if _, err := tx.ExecContext(ctx, q); err != nil {
20 return fmt.Errorf("UPDATE for deletion peer_checks: %v", err)
21 }
22
23 seenASNs := make(map[int64]bool)
24
25 for _, pcr := range res {
26 seenASNs[pcr.PeerASN] = true
27
28 q = `
29 INSERT INTO peer_checks
30 (peer_id, check_name, check_time, check_status, check_message, delete)
31 SELECT
32 peers.id, :check_name, :check_time, :check_status, :check_message, false
33 FROM peers
34 WHERE peers.asn = :asn
35 ON CONFLICT (peer_id, check_name)
36 DO UPDATE SET
37 check_time = :check_time,
38 check_status = :check_status,
39 check_message = :check_message,
40 delete = false
41 `
42 status := "uknown"
43 switch pcr.Status {
44 case PeerCheckStatus_Okay:
45 status = "okay"
46 case PeerCheckStatus_Failed:
47 status = "failed"
48 case PeerCheckStatus_SoftFailed:
49 glog.Infof("Skipping soft failure: %+v", pcr)
50 continue
51 }
52 cr := sqlPeerCheck{
53 CheckName: pcr.CheckName,
54 CheckTime: pcr.Time.UnixNano(),
55 CheckStatus: status,
56 CheckMessage: pcr.Message,
57 ASN: fmt.Sprintf("%d", pcr.PeerASN),
58 }
59 if _, err := tx.NamedExecContext(ctx, q, cr); err != nil {
60 return fmt.Errorf("INSERT peer_checks: %v", err)
61 }
62 }
63
64 q = `
65 DELETE FROM peer_checks
66 WHERE delete = true
67 `
68 if _, err := tx.ExecContext(ctx, q); err != nil {
69 return fmt.Errorf("DELETE FROM peer_checks: %v", err)
70 }
71
72 return tx.Commit()
73}