Draw the actual rest of the fucking owl.

Change-Id: Ia04fb49ebbe3a5afccc57e62f6335e35b45192fe
diff --git a/bgpwtf/cccampix/verifier/model/config.go b/bgpwtf/cccampix/verifier/model/config.go
index bafd46f..1cbd2d7 100644
--- a/bgpwtf/cccampix/verifier/model/config.go
+++ b/bgpwtf/cccampix/verifier/model/config.go
@@ -4,6 +4,8 @@
 	"context"
 	"database/sql"
 	"fmt"
+	"net"
+	"strconv"
 )
 
 func (m *sqlModel) ConfigureMissingSessions(ctx context.Context, gen func() SessionConfig) error {
@@ -49,3 +51,75 @@
 
 	return tx.Commit()
 }
+
+func (m *sqlModel) GetPeerConfiguration(ctx context.Context) ([]*PeerConfiguration, error) {
+	q := `
+		SELECT
+		    peers.asn "asn",
+			peer_pgp_keys.fingerprint "peer_pgp_keys.fingerprint",
+			peer_routers.v6 "peer_routers.v6", peer_routers.v4 "peer_routers.v4",
+			session_configs.bgp_secret "session_configs.bgp_secret"
+		FROM session_configs
+		LEFT JOIN peer_routers
+		ON peer_routers.id = session_configs.peer_router_id
+		INNER JOIN peer_pgp_keys
+		ON peer_pgp_keys.peer_id = session_configs.peer_id
+		LEFT JOIN peers
+		on peers.id = session_configs.peer_id
+	`
+
+	data := []struct {
+		PGP    sqlPeerPGPKey    `db:"peer_pgp_keys"`
+		Config sqlSessionConfig `db:"session_configs"`
+		Router sqlPeerRouter    `db:"peer_routers"`
+		ASN    string           `db:"asn"`
+	}{}
+
+	if err := m.db.SelectContext(ctx, &data, q); err != nil {
+		return nil, fmt.Errorf("SELECT peers/peer_pgp_keys/session_configs: %v", err)
+	}
+
+	resM := make(map[string]*PeerConfiguration)
+
+	for _, d := range data {
+		k := fmt.Sprintf("%s", d.ASN)
+		r, ok := resM[k]
+		if !ok {
+			asn, err := strconv.ParseInt(d.ASN, 10, 64)
+			if err != nil {
+				return nil, fmt.Errorf("data corruption: invalid ASN %q", d.ASN)
+			}
+			r = &PeerConfiguration{
+				Peer: Peer{
+					ASN:     asn,
+					Routers: []*Router{},
+				},
+				Key: PeerPGPKey{
+					PeerASN:     asn,
+					Fingerprint: d.PGP.Fingerprint,
+				},
+			}
+			resM[k] = r
+		}
+
+		v6 := net.ParseIP(d.Router.V6.String)
+		v4 := net.ParseIP(d.Router.V4.String)
+		secret := d.Config.BGPSecret
+		r.Peer.Routers = append(r.Peer.Routers, &Router{
+			V6: v6,
+			V4: v4,
+			Config: &SessionConfig{
+				BGPSecret: secret,
+			},
+		})
+	}
+
+	res := make([]*PeerConfiguration, len(resM))
+	i := 0
+	for _, pc := range resM {
+		res[i] = pc
+		i += 1
+	}
+
+	return res, nil
+}