blob: 087942750951cf81c0c23a1d4760566b11dc2b0f [file] [log] [blame]
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +02001package model
2
3import (
4 "context"
5 "fmt"
6 "strconv"
7 "time"
8
9 "github.com/golang/glog"
10 "github.com/jmoiron/sqlx"
11)
12
13func (s *sqlModel) GetPeerCheckResults(ctx context.Context, asn []int64) ([]*PeerCheckResult, error) {
14 asns := make([]string, len(asn))
15 for i, asn := range asn {
16 asns[i] = fmt.Sprintf("%d", asn)
17 }
18
19 data := []struct {
20 sqlPeer `db:"peers"`
21 sqlPeerCheck `db:"peer_checks"`
22 }{}
23 q := `
24 SELECT
25 peers.asn "peers.asn",
26 peer_checks.check_name "peer_checks.check_name",
27 peer_checks.check_time "peer_checks.check_time",
28 peer_checks.check_status "peer_checks.check_status",
29 peer_checks.check_message "peer_checks.check_message"
30 FROM peers
31 LEFT JOIN peer_checks
32 ON peers.id = peer_checks.peer_id
33 WHERE peers.asn IN (?)
34 `
35 query, args, err := sqlx.In(q, asns)
36 if err != nil {
37 return nil, fmt.Errorf("SELECT peers: %v", err)
38 }
39
40 query = s.db.Rebind(query)
41 if err := s.db.SelectContext(ctx, &data, query, args...); err != nil {
42 return nil, fmt.Errorf("SELECT peers: %v", err)
43 }
44
45 res := make([]*PeerCheckResult, len(data))
46 for i, d := range data {
47 asn, err := strconv.ParseInt(d.sqlPeer.ASN, 10, 64)
48 if err != nil {
49 return nil, err
50 }
51 status := PeerCheckStatus_Invalid
52 switch d.sqlPeerCheck.CheckStatus {
53 case "okay":
54 status = PeerCheckStatus_Okay
55 case "failed":
56 status = PeerCheckStatus_Failed
57 default:
58 glog.Errorf("Unhandled check status %q", d.sqlPeerCheck.CheckStatus)
59 }
60 res[i] = &PeerCheckResult{
61 PeerASN: asn,
62 CheckName: d.sqlPeerCheck.CheckName,
63 Time: time.Unix(0, d.sqlPeerCheck.CheckTime),
64 Status: status,
65 Message: d.sqlPeerCheck.CheckMessage,
66 }
67 }
68
69 return res, nil
70}