/
face.go
86 lines (72 loc) · 1.42 KB
/
face.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package gqlmgmt
import (
"context"
"errors"
"github.com/usnistgov/ndn-dpdk/ndn"
"github.com/usnistgov/ndn-dpdk/ndn/l3"
)
// Error conditions.
var (
ErrFaceClosed = errors.New("face is closed")
)
type face struct {
client *Client
id string
l3face l3.Face
routes map[string]string
}
func (f *face) ID() string {
return f.id
}
func (f *face) Face() l3.Face {
return f.l3face
}
func (f *face) Close() (e error) {
if f.client == nil {
return ErrFaceClosed
}
_, e = f.client.Delete(context.TODO(), f.ID())
f.client = nil
return e
}
func (f *face) Advertise(name ndn.Name) error {
if f.client == nil {
return ErrFaceClosed
}
nameV, _ := name.MarshalBinary()
if _, ok := f.routes[string(nameV)]; ok {
return nil
}
var fibEntryJ struct {
ID string `json:"id"`
}
e := f.client.Do(context.TODO(), `
mutation insertFibEntry($name: Name!, $nexthops: [ID!]!) {
insertFibEntry(name: $name, nexthops: $nexthops) {
id
}
}
`, map[string]any{
"name": name.String(),
"nexthops": []string{f.ID()},
}, "insertFibEntry", &fibEntryJ)
if e == nil {
f.routes[string(nameV)] = fibEntryJ.ID
}
return e
}
func (f *face) Withdraw(name ndn.Name) (e error) {
if f.client == nil {
return ErrFaceClosed
}
nameV, _ := name.MarshalBinary()
id, ok := f.routes[string(nameV)]
if !ok {
return nil
}
_, e = f.client.Delete(context.TODO(), id)
if e == nil {
delete(f.routes, string(nameV))
}
return e
}