Give every IP lookup result the same fields (closes #200)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
Every result of /ip/, /ip/{addr} and /api/v1/ip/{ip} now has every
field. A field without a value is null instead of left out, so an
address with no live route has all its route and AS fields set to null.
ptr is an empty list when there are no PTR names.
Two new fields, num_origins and origin_asns, give how many origin ASes
peers carry the netblock with, and which. The routing table's prefix
summary now lists them. asn still names the origin that most peers
carry.
first_seen is null, no longer the zero time, when the database has not
stored the netblock yet.
Model: opus-5-5
This commit was merged in pull request #206.
This commit is contained in:
@@ -14,6 +14,9 @@ type PrefixSummary struct {
|
||||
// OriginASN is the origin AS that the most peers carry the prefix with.
|
||||
// When several have as many peers, it is the lowest AS number.
|
||||
OriginASN int
|
||||
// OriginASNs are all the origin ASes that peers carry the prefix with, in
|
||||
// AS number order.
|
||||
OriginASNs []int
|
||||
// Peers is how many peers carry the prefix.
|
||||
Peers int
|
||||
// Newest is the time of the newest kept route of the prefix, or nil when
|
||||
@@ -211,10 +214,12 @@ func (t *Table) addresses(peers *bitset.BitSet) []string {
|
||||
// summarize returns the summary of prefix, whose origins are in AS number
|
||||
// order.
|
||||
func summarize(prefix netip.Prefix, origins []*origin) PrefixSummary {
|
||||
summary := PrefixSummary{Prefix: prefix}
|
||||
summary := PrefixSummary{Prefix: prefix, OriginASNs: make([]int, 0, len(origins))}
|
||||
mostPeers := 0
|
||||
|
||||
for _, o := range origins {
|
||||
summary.OriginASNs = append(summary.OriginASNs, o.asn)
|
||||
|
||||
peers := int(o.peers.Count())
|
||||
summary.Peers += peers
|
||||
|
||||
|
||||
@@ -46,21 +46,22 @@ func TestLookup(t *testing.T) {
|
||||
tests := []struct {
|
||||
addr string
|
||||
// want is the summary's prefix, or empty when none is found.
|
||||
want string
|
||||
originASN int
|
||||
peers int
|
||||
newest int // in seconds after the start; 0 for none
|
||||
want string
|
||||
originASN int
|
||||
originASNs []int
|
||||
peers int
|
||||
newest int // in seconds after the start; 0 for none
|
||||
}{
|
||||
{"10.1.2.3", prefixV4, asA, 2, 20},
|
||||
{"::ffff:10.1.2.3", prefixV4, asA, 2, 20},
|
||||
{"10.1.3.4", "10.1.0.0/16", asB, 3, 30},
|
||||
{"10.2.0.1", "10.0.0.0/8", asA, 1, 10},
|
||||
{"10.9.0.1", "10.9.0.0/16", asA, 1, 0},
|
||||
{"192.0.2.1", "", 0, 0, 0},
|
||||
{"2001:db8:1::5", prefixV6, asB, 1, 20},
|
||||
{"2001:db8:2::1", "2001:db8::/32", asA, 1, 10},
|
||||
{"3000::1", "3000::/16", asA, 1, 10},
|
||||
{"2001:db9::1", "", 0, 0, 0},
|
||||
{"10.1.2.3", prefixV4, asA, []int{asA, asB}, 2, 20},
|
||||
{"::ffff:10.1.2.3", prefixV4, asA, []int{asA, asB}, 2, 20},
|
||||
{"10.1.3.4", "10.1.0.0/16", asB, []int{asA, asB}, 3, 30},
|
||||
{"10.2.0.1", "10.0.0.0/8", asA, []int{asA}, 1, 10},
|
||||
{"10.9.0.1", "10.9.0.0/16", asA, []int{asA}, 1, 0},
|
||||
{"192.0.2.1", "", 0, nil, 0, 0},
|
||||
{"2001:db8:1::5", prefixV6, asB, []int{asB}, 1, 20},
|
||||
{"2001:db8:2::1", "2001:db8::/32", asA, []int{asA}, 1, 10},
|
||||
{"3000::1", "3000::/16", asA, []int{asA}, 1, 10},
|
||||
{"2001:db9::1", "", 0, nil, 0, 0},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
@@ -77,9 +78,10 @@ func TestLookup(t *testing.T) {
|
||||
}
|
||||
|
||||
want := routetable.PrefixSummary{
|
||||
Prefix: netip.MustParsePrefix(tc.want),
|
||||
OriginASN: tc.originASN,
|
||||
Peers: tc.peers,
|
||||
Prefix: netip.MustParsePrefix(tc.want),
|
||||
OriginASN: tc.originASN,
|
||||
OriginASNs: tc.originASNs,
|
||||
Peers: tc.peers,
|
||||
}
|
||||
if tc.newest != 0 {
|
||||
want.Newest = timeAt(tc.newest)
|
||||
@@ -166,7 +168,8 @@ func TestSamplePrefixes(t *testing.T) {
|
||||
|
||||
for _, got := range sample {
|
||||
want := routetable.PrefixSummary{
|
||||
Prefix: got.Prefix, OriginASN: asA, Peers: 1, Newest: timeAt(10),
|
||||
Prefix: got.Prefix, OriginASN: asA, OriginASNs: []int{asA},
|
||||
Peers: 1, Newest: timeAt(10),
|
||||
}
|
||||
if seen[got.Prefix] || got.Prefix.Bits() != tc.maskLength ||
|
||||
!reflect.DeepEqual(got, want) {
|
||||
|
||||
Reference in New Issue
Block a user