blob: bafd46fb128e78f8a591bd120709b3ecf666ece5 [file] [log] [blame]
package model
import (
"context"
"database/sql"
"fmt"
)
func (m *sqlModel) ConfigureMissingSessions(ctx context.Context, gen func() SessionConfig) error {
tx := m.db.MustBeginTx(ctx, &sql.TxOptions{})
defer tx.Rollback()
q := `
SELECT
peer_routers.peer_id "peer_id",
peer_routers.id "id"
FROM peer_routers
WHERE peer_routers.id NOT IN (
SELECT session_configs.peer_router_id
FROM session_configs
)
`
missing := []struct {
PeerID string `db:"peer_id"`
ID string `db:"id"`
}{}
if err := m.db.SelectContext(ctx, &missing, q); err != nil {
return fmt.Errorf("SELECT peerRouters: %v", err)
}
for _, m := range missing {
config := gen()
q = `
INSERT INTO
session_configs
(peer_id, peer_router_id, bgp_secret)
VALUES
(:peer_id, :peer_router_id, :bgp_secret)
`
data := sqlSessionConfig{
PeerID: m.PeerID,
PeerRouterID: m.ID,
BGPSecret: config.BGPSecret,
}
if _, err := tx.NamedExecContext(ctx, q, data); err != nil {
return err
}
}
return tx.Commit()
}