forked from hswaw/hscloud
81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
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()
|
|
}
|