blob: 0586766ceb74fa5715a9b11ba04ba5b3cf7a646a [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
Serge Bazanskiec71cb52019-08-22 18:13:13 +020011func (s *sqlModel) SubmitPeerCheckResults(ctx context.Context, checkName string, res []*PeerCheckResult) error {
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020012 tx := s.db.MustBeginTx(ctx, &sql.TxOptions{})
13 defer tx.Rollback()
14
Serge Bazanskiec71cb52019-08-22 18:13:13 +020015 glog.Infof("SubmitPeerCheckResults:")
16 for _, r := range res {
17 glog.Infof(" - %+v", *r)
18 }
19
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020020 q := `
21 UPDATE peer_checks
22 SET delete = true
Serge Bazanskiec71cb52019-08-22 18:13:13 +020023 WHERE check_name = $1
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020024 `
Serge Bazanskiec71cb52019-08-22 18:13:13 +020025 if _, err := tx.ExecContext(ctx, q, checkName); err != nil {
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020026 return fmt.Errorf("UPDATE for deletion peer_checks: %v", err)
27 }
28
29 seenASNs := make(map[int64]bool)
30
31 for _, pcr := range res {
32 seenASNs[pcr.PeerASN] = true
33
34 q = `
35 INSERT INTO peer_checks
36 (peer_id, check_name, check_time, check_status, check_message, delete)
37 SELECT
38 peers.id, :check_name, :check_time, :check_status, :check_message, false
39 FROM peers
40 WHERE peers.asn = :asn
41 ON CONFLICT (peer_id, check_name)
42 DO UPDATE SET
43 check_time = :check_time,
44 check_status = :check_status,
45 check_message = :check_message,
46 delete = false
47 `
48 status := "uknown"
49 switch pcr.Status {
50 case PeerCheckStatus_Okay:
51 status = "okay"
52 case PeerCheckStatus_Failed:
53 status = "failed"
54 case PeerCheckStatus_SoftFailed:
55 glog.Infof("Skipping soft failure: %+v", pcr)
56 continue
57 }
58 cr := sqlPeerCheck{
59 CheckName: pcr.CheckName,
60 CheckTime: pcr.Time.UnixNano(),
61 CheckStatus: status,
62 CheckMessage: pcr.Message,
63 ASN: fmt.Sprintf("%d", pcr.PeerASN),
64 }
65 if _, err := tx.NamedExecContext(ctx, q, cr); err != nil {
66 return fmt.Errorf("INSERT peer_checks: %v", err)
67 }
68 }
69
70 q = `
71 DELETE FROM peer_checks
72 WHERE delete = true
Serge Bazanskiec71cb52019-08-22 18:13:13 +020073 AND check_name = $1
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020074 `
Serge Bazanskiec71cb52019-08-22 18:13:13 +020075 if _, err := tx.ExecContext(ctx, q, checkName); err != nil {
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +020076 return fmt.Errorf("DELETE FROM peer_checks: %v", err)
77 }
78
79 return tx.Commit()
80}