Skip to content

Commit 5174d60

Browse files
GGN Engprod Teambstoll
authored andcommitted
Project import generated by Copybara.
FolderOrigin-RevId: /usr/local/google/home/bstoll/copybara/temp/folder-destination16560738003249998664/.
1 parent 28e4058 commit 5174d60

File tree

56 files changed

+53858
-53372
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+53858
-53372
lines changed

binding/solver/solver.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/openconfig/ondatra/binding"
2525
"github.com/openconfig/ondatra/binding/portgraph"
2626
opb "github.com/openconfig/ondatra/proto"
27+
"github.com/pborman/uuid"
2728
)
2829

2930
// Inventory of available binding devices and links.
@@ -174,3 +175,83 @@ func inventoryToConcreteGraph(inv *Inventory) (*portgraph.ConcreteGraph, map[*po
174175
}
175176
return cg, conNode2BindDev, conPort2BindPort, nil
176177
}
178+
179+
type staticDUT struct {
180+
*binding.AbstractDUT
181+
dut binding.DUT
182+
}
183+
184+
type staticATE struct {
185+
*binding.AbstractATE
186+
ate binding.ATE
187+
}
188+
189+
func dynDims(dev *opb.Device, bdev binding.Device, tbPort2BindPort map[*opb.Port]*binding.Port) *binding.Dims {
190+
dims := &binding.Dims{
191+
Name: bdev.Name(),
192+
Vendor: bdev.Vendor(),
193+
HardwareModel: bdev.HardwareModel(),
194+
SoftwareVersion: bdev.SoftwareVersion(),
195+
Ports: make(map[string]*binding.Port),
196+
}
197+
for _, tp := range dev.GetPorts() {
198+
if bp, present := tbPort2BindPort[tp]; present {
199+
dims.Ports[tp.GetId()] = bp
200+
}
201+
}
202+
return dims
203+
}
204+
205+
// AssignmentToReservation converts the solveResult to a binding.Reservation.
206+
func AssignmentToReservation(solveResult *SolveResult, tb *opb.Testbed) (*binding.Reservation, error) {
207+
res := &binding.Reservation{
208+
ID: uuid.New(),
209+
DUTs: make(map[string]binding.DUT),
210+
ATEs: make(map[string]binding.ATE),
211+
}
212+
if solveResult == nil {
213+
return nil, fmt.Errorf("solveResult is nil for this reservation: %s", res.ID)
214+
}
215+
if solveResult.Assignment == nil {
216+
return nil, fmt.Errorf("solveResult.Assignment is nil for this reservation: %s", res.ID)
217+
}
218+
219+
tbDev2BindDev := make(map[*opb.Device]*binding.Device)
220+
for absNode, conNode := range solveResult.Assignment.Node2Node {
221+
tbDev2BindDev[solveResult.AbsNode2Dev[absNode]] = solveResult.ConNode2BindDev[conNode]
222+
}
223+
tbPort2BindPort := make(map[*opb.Port]*binding.Port)
224+
for absPort, conPort := range solveResult.Assignment.Port2Port {
225+
tbPort2BindPort[solveResult.AbsPort2Port[absPort]] = solveResult.ConPort2BindPort[conPort]
226+
}
227+
228+
for _, tdut := range tb.GetDuts() {
229+
bdev := tbDev2BindDev[tdut]
230+
if bdev == nil {
231+
return nil, fmt.Errorf("DUT %q not resolved", tdut.GetId())
232+
}
233+
bdut, ok := (*bdev).(binding.DUT)
234+
if !ok {
235+
return nil, fmt.Errorf("device %q assigned to DUT %q is not a DUT", (*bdev).Name(), tdut.GetId())
236+
}
237+
res.DUTs[tdut.GetId()] = &staticDUT{
238+
AbstractDUT: &binding.AbstractDUT{Dims: dynDims(tdut, bdut, tbPort2BindPort)},
239+
dut: bdut,
240+
}
241+
}
242+
for _, tate := range tb.GetAtes() {
243+
bdev := tbDev2BindDev[tate]
244+
if bdev == nil {
245+
return nil, fmt.Errorf("ATE %q not resolved", tate.GetId())
246+
}
247+
bate, ok := (*bdev).(binding.ATE)
248+
if !ok {
249+
return nil, fmt.Errorf("device %q assigned to ATE %q is not an ATE", (*bdev).Name(), tate.GetId())
250+
}
251+
res.ATEs[tate.GetId()] = &staticATE{
252+
AbstractATE: &binding.AbstractATE{Dims: dynDims(tate, bate, tbPort2BindPort)},
253+
ate: bate,
254+
}
255+
}
256+
return res, nil
257+
}

binding/solver/solver_test.go

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package solver
1616

1717
import (
1818
"fmt"
19+
"strings"
1920
"testing"
2021

2122
"golang.org/x/net/context"
@@ -775,3 +776,211 @@ func TestSolve(t *testing.T) {
775776
})
776777
}
777778
}
779+
780+
func TestAssignmentToReservation(t *testing.T) {
781+
tDUT1 := &opb.Device{Id: "dut1", Ports: []*opb.Port{{Id: "port1"}}}
782+
tATE1 := &opb.Device{Id: "ate1", Ports: []*opb.Port{{Id: "port1"}}}
783+
tb := &opb.Testbed{
784+
Duts: []*opb.Device{tDUT1},
785+
Ates: []*opb.Device{tATE1},
786+
Links: []*opb.Link{{A: "dut1:port1", B: "ate1:port1"}},
787+
}
788+
789+
bDUT1Port1 := &binding.Port{Name: "eth1"}
790+
bATE1Port1 := &binding.Port{Name: "eth1"}
791+
invDUT1 := &mockDUT{AbstractDUT: &binding.AbstractDUT{Dims: &binding.Dims{Name: "inventory_dut1", Ports: map[string]*binding.Port{"p1": bDUT1Port1}}}}
792+
invATE1 := &mockATE{AbstractATE: &binding.AbstractATE{Dims: &binding.Dims{Name: "inventory_ate1", Ports: map[string]*binding.Port{"p1": bATE1Port1}}}}
793+
bdevDUT1 := binding.Device(invDUT1)
794+
bdevATE1 := binding.Device(invATE1)
795+
796+
absDUT1Node := &portgraph.AbstractNode{Desc: "dut1"}
797+
absATE1Node := &portgraph.AbstractNode{Desc: "ate1"}
798+
absDUT1Port1 := &portgraph.AbstractPort{Desc: "dut1:port1"}
799+
absATE1Port1 := &portgraph.AbstractPort{Desc: "ate1:port1"}
800+
801+
conDUT1Node := &portgraph.ConcreteNode{Desc: invDUT1.Name()}
802+
conATE1Node := &portgraph.ConcreteNode{Desc: invATE1.Name()}
803+
conDUT1Port1 := &portgraph.ConcretePort{Desc: invDUT1.Name() + ":" + bDUT1Port1.Name}
804+
conATE1Port1 := &portgraph.ConcretePort{Desc: invATE1.Name() + ":" + bATE1Port1.Name}
805+
806+
solveResult := &SolveResult{
807+
Assignment: &portgraph.Assignment{
808+
Node2Node: map[*portgraph.AbstractNode]*portgraph.ConcreteNode{
809+
absDUT1Node: conDUT1Node,
810+
absATE1Node: conATE1Node,
811+
},
812+
Port2Port: map[*portgraph.AbstractPort]*portgraph.ConcretePort{
813+
absDUT1Port1: conDUT1Port1,
814+
absATE1Port1: conATE1Port1,
815+
},
816+
},
817+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{
818+
absDUT1Node: tDUT1,
819+
absATE1Node: tATE1,
820+
},
821+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{
822+
absDUT1Port1: tDUT1.Ports[0],
823+
absATE1Port1: tATE1.Ports[0],
824+
},
825+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{
826+
conDUT1Node: &bdevDUT1,
827+
conATE1Node: &bdevATE1,
828+
},
829+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{
830+
conDUT1Port1: bDUT1Port1,
831+
conATE1Port1: bATE1Port1,
832+
},
833+
}
834+
835+
res, err := AssignmentToReservation(solveResult, tb)
836+
if err != nil {
837+
t.Fatalf("AssignmentToReservation() got unexpected error: %v", err)
838+
}
839+
840+
wantRes := &binding.Reservation{
841+
ID: res.ID,
842+
DUTs: map[string]binding.DUT{
843+
"dut1": &staticDUT{
844+
AbstractDUT: &binding.AbstractDUT{
845+
Dims: &binding.Dims{
846+
Name: "inventory_dut1",
847+
Ports: map[string]*binding.Port{
848+
"port1": bDUT1Port1,
849+
},
850+
},
851+
},
852+
dut: invDUT1,
853+
},
854+
},
855+
ATEs: map[string]binding.ATE{
856+
"ate1": &staticATE{
857+
AbstractATE: &binding.AbstractATE{
858+
Dims: &binding.Dims{
859+
Name: "inventory_ate1",
860+
Ports: map[string]*binding.Port{
861+
"port1": bATE1Port1,
862+
},
863+
},
864+
},
865+
ate: invATE1,
866+
},
867+
},
868+
}
869+
if diff := cmp.Diff(wantRes, res, cmp.AllowUnexported(staticDUT{}, staticATE{})); diff != "" {
870+
t.Errorf("AssignmentToReservation() returned diff (-want +got):\n%s", diff)
871+
}
872+
}
873+
874+
func TestAssignmentToReservationErrors(t *testing.T) {
875+
tDUT1 := &opb.Device{Id: "dut1", Ports: []*opb.Port{{Id: "port1"}}}
876+
tATE1 := &opb.Device{Id: "ate1", Ports: []*opb.Port{{Id: "port1"}}}
877+
bDUT1Port1 := &binding.Port{Name: "eth1"}
878+
bATE1Port1 := &binding.Port{Name: "eth1"}
879+
invDUT1 := &mockDUT{AbstractDUT: &binding.AbstractDUT{Dims: &binding.Dims{Name: "inventory_dut1", Ports: map[string]*binding.Port{"p1": bDUT1Port1}}}}
880+
invATE1 := &mockATE{AbstractATE: &binding.AbstractATE{Dims: &binding.Dims{Name: "inventory_ate1", Ports: map[string]*binding.Port{"p1": bATE1Port1}}}}
881+
bdevDUT1 := binding.Device(invDUT1)
882+
bdevATE1 := binding.Device(invATE1)
883+
absDUT1Node := &portgraph.AbstractNode{Desc: "dut1"}
884+
absATE1Node := &portgraph.AbstractNode{Desc: "ate1"}
885+
conDUT1Node := &portgraph.ConcreteNode{Desc: invDUT1.Name()}
886+
conATE1Node := &portgraph.ConcreteNode{Desc: invATE1.Name()}
887+
888+
tests := []struct {
889+
desc string
890+
tb *opb.Testbed
891+
solveResult *SolveResult
892+
wantErr string
893+
}{
894+
{
895+
desc: "dut not resolved",
896+
tb: &opb.Testbed{Duts: []*opb.Device{tDUT1}},
897+
solveResult: &SolveResult{
898+
Assignment: &portgraph.Assignment{},
899+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{},
900+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{},
901+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{},
902+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{},
903+
},
904+
wantErr: "not resolved",
905+
},
906+
{
907+
desc: "ate not resolved",
908+
tb: &opb.Testbed{Ates: []*opb.Device{tATE1}},
909+
solveResult: &SolveResult{
910+
Assignment: &portgraph.Assignment{},
911+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{},
912+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{},
913+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{},
914+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{},
915+
},
916+
wantErr: "not resolved",
917+
},
918+
{
919+
desc: "dut assigned ate device",
920+
tb: &opb.Testbed{Duts: []*opb.Device{tDUT1}},
921+
solveResult: &SolveResult{
922+
Assignment: &portgraph.Assignment{
923+
Node2Node: map[*portgraph.AbstractNode]*portgraph.ConcreteNode{
924+
absDUT1Node: conATE1Node,
925+
},
926+
},
927+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{
928+
absDUT1Node: tDUT1,
929+
},
930+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{
931+
conATE1Node: &bdevATE1,
932+
},
933+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{},
934+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{},
935+
},
936+
wantErr: "is not a DUT",
937+
},
938+
{
939+
desc: "ate assigned dut device",
940+
tb: &opb.Testbed{Ates: []*opb.Device{tATE1}},
941+
solveResult: &SolveResult{
942+
Assignment: &portgraph.Assignment{
943+
Node2Node: map[*portgraph.AbstractNode]*portgraph.ConcreteNode{
944+
absATE1Node: conDUT1Node,
945+
},
946+
},
947+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{
948+
absATE1Node: tATE1,
949+
},
950+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{
951+
conDUT1Node: &bdevDUT1,
952+
},
953+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{},
954+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{},
955+
},
956+
wantErr: "is not an ATE",
957+
},
958+
{
959+
desc: "nil assignment",
960+
tb: &opb.Testbed{Duts: []*opb.Device{tDUT1}},
961+
solveResult: &SolveResult{
962+
Assignment: nil,
963+
AbsNode2Dev: map[*portgraph.AbstractNode]*opb.Device{},
964+
AbsPort2Port: map[*portgraph.AbstractPort]*opb.Port{},
965+
ConNode2BindDev: map[*portgraph.ConcreteNode]*binding.Device{},
966+
ConPort2BindPort: map[*portgraph.ConcretePort]*binding.Port{},
967+
},
968+
wantErr: "solveResult.Assignment is nil",
969+
},
970+
{
971+
desc: "nil solveResult",
972+
tb: &opb.Testbed{Duts: []*opb.Device{tDUT1}},
973+
solveResult: nil,
974+
wantErr: "solveResult is nil",
975+
},
976+
}
977+
978+
for _, test := range tests {
979+
t.Run(test.desc, func(t *testing.T) {
980+
_, err := AssignmentToReservation(test.solveResult, test.tb)
981+
if err == nil || !strings.Contains(err.Error(), test.wantErr) {
982+
t.Errorf("AssignmentToReservation() got err %v, want err containing %q", err, test.wantErr)
983+
}
984+
})
985+
}
986+
}

gnmi/generate.sh

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ YANG_FILES=(
4747
public/release/models/bgp/openconfig-bgp-policy.yang
4848
public/release/models/bgp/openconfig-bgp-types.yang
4949
public/release/models/extensions/openconfig-metadata.yang
50+
public/release/models/gnpsi/openconfig-gnpsi-types.yang
5051
public/release/models/gnsi/openconfig-gnsi-acctz.yang
5152
public/release/models/gnsi/openconfig-gnsi-authz.yang
5253
public/release/models/gnsi/openconfig-gnsi-certz.yang
@@ -59,37 +60,37 @@ YANG_FILES=(
5960
public/release/models/interfaces/openconfig-if-ethernet.yang
6061
public/release/models/interfaces/openconfig-if-ip-ext.yang
6162
public/release/models/interfaces/openconfig-if-ip.yang
63+
public/release/models/interfaces/openconfig-if-rates.yang
6264
public/release/models/interfaces/openconfig-if-sdn-ext.yang
6365
public/release/models/interfaces/openconfig-interfaces.yang
64-
public/release/models/interfaces/openconfig-if-rates.yang
6566
public/release/models/isis/openconfig-isis-policy.yang
6667
public/release/models/isis/openconfig-isis.yang
6768
public/release/models/lacp/openconfig-lacp.yang
6869
public/release/models/lldp/openconfig-lldp-types.yang
6970
public/release/models/lldp/openconfig-lldp.yang
70-
public/release/models/local-routing/openconfig-local-routing.yang
7171
public/release/models/local-routing/openconfig-local-routing-network-instance.yang
72+
public/release/models/local-routing/openconfig-local-routing.yang
7273
public/release/models/macsec/openconfig-macsec.yang
7374
public/release/models/mpls/openconfig-mpls-types.yang
7475
public/release/models/multicast/openconfig-pim.yang
75-
public/release/models/network-instance/openconfig-network-instance.yang
7676
public/release/models/network-instance/openconfig-network-instance-l2.yang
7777
public/release/models/network-instance/openconfig-network-instance-static.yang
78+
public/release/models/network-instance/openconfig-network-instance.yang
7879
public/release/models/oam/openconfig-cfm-types.yang
79-
public/release/models/oam/openconfig-oam.yang
8080
public/release/models/oam/openconfig-oam-cfm.yang
81+
public/release/models/oam/openconfig-oam.yang
8182
public/release/models/openconfig-extensions.yang
8283
public/release/models/optical-transport/openconfig-terminal-device.yang
8384
public/release/models/optical-transport/openconfig-transport-types.yang
8485
public/release/models/ospf/openconfig-ospf-area-interface.yang
8586
public/release/models/ospf/openconfig-ospf-area.yang
8687
public/release/models/ospf/openconfig-ospf-common.yang
8788
public/release/models/ospf/openconfig-ospf-global.yang
89+
public/release/models/ospf/openconfig-ospf-policy.yang
8890
public/release/models/ospf/openconfig-ospf-types.yang
8991
public/release/models/ospf/openconfig-ospf.yang
90-
public/release/models/ospf/openconfig-ospfv3-area-interface.yang
91-
public/release/models/ospf/openconfig-ospf-policy.yang
9292
public/release/models/ospf/openconfig-ospfv2.yang
93+
public/release/models/ospf/openconfig-ospfv3-area-interface.yang
9394
public/release/models/p4rt/openconfig-p4rt.yang
9495
public/release/models/platform/openconfig-platform-common.yang
9596
public/release/models/platform/openconfig-platform-controller-card.yang
@@ -108,8 +109,8 @@ YANG_FILES=(
108109
public/release/models/policy-forwarding/openconfig-pf-interfaces.yang
109110
public/release/models/policy-forwarding/openconfig-pf-path-groups.yang
110111
public/release/models/policy-forwarding/openconfig-policy-forwarding.yang
111-
public/release/models/policy/openconfig-routing-policy.yang
112112
public/release/models/policy/openconfig-policy-types.yang
113+
public/release/models/policy/openconfig-routing-policy.yang
113114
public/release/models/qos/openconfig-qos-elements.yang
114115
public/release/models/qos/openconfig-qos-interfaces.yang
115116
public/release/models/qos/openconfig-qos-types.yang
@@ -138,8 +139,8 @@ OTG_YANG_FILES=(
138139
models-yang/models/dhcp/v4server/open-traffic-generator-dhcpv4server.yang
139140
models-yang/models/dhcp/v6client/open-traffic-generator-dhcpv6client.yang
140141
models-yang/models/dhcp/v6server/open-traffic-generator-dhcpv6server.yang
141-
models-yang/models/discovery/open-traffic-generator-discovery.yang
142142
models-yang/models/discovery/open-traffic-generator-discovery-interfaces.yang
143+
models-yang/models/discovery/open-traffic-generator-discovery.yang
143144
models-yang/models/flow/open-traffic-generator-flow.yang
144145
models-yang/models/interface/open-traffic-generator-port.yang
145146
models-yang/models/isis/open-traffic-generator-isis.yang

0 commit comments

Comments
 (0)