blob: bafd46fb128e78f8a591bd120709b3ecf666ece5 [file] [log] [blame]
Sergiusz Bazanski1fad2e52019-08-01 20:16:27 +02001package model
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7)
8
9func (m *sqlModel) ConfigureMissingSessions(ctx context.Context, gen func() SessionConfig) error {
10 tx := m.db.MustBeginTx(ctx, &sql.TxOptions{})
11 defer tx.Rollback()
12
13 q := `
14 SELECT
15 peer_routers.peer_id "peer_id",
16 peer_routers.id "id"
17 FROM peer_routers
18 WHERE peer_routers.id NOT IN (
19 SELECT session_configs.peer_router_id
20 FROM session_configs
21 )
22 `
23 missing := []struct {
24 PeerID string `db:"peer_id"`
25 ID string `db:"id"`
26 }{}
27 if err := m.db.SelectContext(ctx, &missing, q); err != nil {
28 return fmt.Errorf("SELECT peerRouters: %v", err)
29 }
30
31 for _, m := range missing {
32 config := gen()
33 q = `
34 INSERT INTO
35 session_configs
36 (peer_id, peer_router_id, bgp_secret)
37 VALUES
38 (:peer_id, :peer_router_id, :bgp_secret)
39 `
40 data := sqlSessionConfig{
41 PeerID: m.PeerID,
42 PeerRouterID: m.ID,
43 BGPSecret: config.BGPSecret,
44 }
45 if _, err := tx.NamedExecContext(ctx, q, data); err != nil {
46 return err
47 }
48 }
49
50 return tx.Commit()
51}