blob: 0586766ceb74fa5715a9b11ba04ba5b3cf7a646a [file] [log] [blame]
package model
import (
"context"
"database/sql"
"fmt"
"github.com/golang/glog"
)
func (s *sqlModel) SubmitPeerCheckResults(ctx context.Context, checkName string, res []*PeerCheckResult) error {
tx := s.db.MustBeginTx(ctx, &sql.TxOptions{})
defer tx.Rollback()
glog.Infof("SubmitPeerCheckResults:")
for _, r := range res {
glog.Infof(" - %+v", *r)
}
q := `
UPDATE peer_checks
SET delete = true
WHERE check_name = $1
`
if _, err := tx.ExecContext(ctx, q, checkName); err != nil {
return fmt.Errorf("UPDATE for deletion peer_checks: %v", err)
}
seenASNs := make(map[int64]bool)
for _, pcr := range res {
seenASNs[pcr.PeerASN] = true
q = `
INSERT INTO peer_checks
(peer_id, check_name, check_time, check_status, check_message, delete)
SELECT
peers.id, :check_name, :check_time, :check_status, :check_message, false
FROM peers
WHERE peers.asn = :asn
ON CONFLICT (peer_id, check_name)
DO UPDATE SET
check_time = :check_time,
check_status = :check_status,
check_message = :check_message,
delete = false
`
status := "uknown"
switch pcr.Status {
case PeerCheckStatus_Okay:
status = "okay"
case PeerCheckStatus_Failed:
status = "failed"
case PeerCheckStatus_SoftFailed:
glog.Infof("Skipping soft failure: %+v", pcr)
continue
}
cr := sqlPeerCheck{
CheckName: pcr.CheckName,
CheckTime: pcr.Time.UnixNano(),
CheckStatus: status,
CheckMessage: pcr.Message,
ASN: fmt.Sprintf("%d", pcr.PeerASN),
}
if _, err := tx.NamedExecContext(ctx, q, cr); err != nil {
return fmt.Errorf("INSERT peer_checks: %v", err)
}
}
q = `
DELETE FROM peer_checks
WHERE delete = true
AND check_name = $1
`
if _, err := tx.ExecContext(ctx, q, checkName); err != nil {
return fmt.Errorf("DELETE FROM peer_checks: %v", err)
}
return tx.Commit()
}