blob: 95208195c72cb89d7157e5539e52fef3aeef1639 [file] [log] [blame]
khenaidoo89b0e942018-10-21 21:11:33 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package graph
17
18import (
19 "errors"
20 "fmt"
William Kurkiandaa6bb22019-03-07 12:26:28 -050021 "github.com/opencord/voltha-protos/go/openflow_13"
22 "github.com/opencord/voltha-protos/go/voltha"
khenaidoo89b0e942018-10-21 21:11:33 -040023 "github.com/stretchr/testify/assert"
khenaidoo910204f2019-04-08 17:56:40 -040024 "sync"
khenaidoo89b0e942018-10-21 21:11:33 -040025 "testing"
26 "time"
27)
28
29var ld voltha.LogicalDevice
30var olt voltha.Device
31var onusOnPort4 []voltha.Device
32var onusOnPort5 []voltha.Device
khenaidoo910204f2019-04-08 17:56:40 -040033var logicalDeviceId string
34var oltDeviceId string
35var numCalled int
36var lock sync.RWMutex
khenaidoo89b0e942018-10-21 21:11:33 -040037
38const (
khenaidoo910204f2019-04-08 17:56:40 -040039 maxOnuOnPort4 int = 256
40 maxOnuOnPort5 int = 256
khenaidoo89b0e942018-10-21 21:11:33 -040041)
42
43func init() {
44
khenaidoo910204f2019-04-08 17:56:40 -040045 logicalDeviceId = "ld"
46 oltDeviceId = "olt"
47 lock = sync.RWMutex{}
khenaidoo89b0e942018-10-21 21:11:33 -040048
49 // Setup ONUs on OLT port 4
50 onusOnPort4 = make([]voltha.Device, 0)
51 var onu voltha.Device
52 var id string
53 oltPeerPort := uint32(4)
54 for i := 0; i < maxOnuOnPort4; i++ {
55 id := fmt.Sprintf("onu%d", i)
56 onu = voltha.Device{Id: id, ParentId: oltDeviceId}
57 ponPort := voltha.Port{PortNo: 1, DeviceId: onu.Id, Type: voltha.Port_PON_ONU}
58 ponPort.Peers = make([]*voltha.Port_PeerPort, 0)
59 peerPort := voltha.Port_PeerPort{DeviceId: oltDeviceId, PortNo: oltPeerPort}
60 ponPort.Peers = append(ponPort.Peers, &peerPort)
61 uniPort := voltha.Port{PortNo: 2, DeviceId: onu.Id, Type: voltha.Port_ETHERNET_UNI}
62 onu.Ports = make([]*voltha.Port, 0)
63 onu.Ports = append(onu.Ports, &ponPort)
64 onu.Ports = append(onu.Ports, &uniPort)
65 onusOnPort4 = append(onusOnPort4, onu)
66 }
67
68 // Setup ONUs on OLT port 5
69 onusOnPort5 = make([]voltha.Device, 0)
70 oltPeerPort = uint32(5)
71 for i := 0; i < maxOnuOnPort5; i++ {
72 id := fmt.Sprintf("onu%d", i+maxOnuOnPort4)
73 onu = voltha.Device{Id: id, ParentId: oltDeviceId}
74 ponPort := voltha.Port{PortNo: 1, DeviceId: onu.Id, Type: voltha.Port_PON_ONU}
75 ponPort.Peers = make([]*voltha.Port_PeerPort, 0)
76 peerPort := voltha.Port_PeerPort{DeviceId: oltDeviceId, PortNo: oltPeerPort}
77 ponPort.Peers = append(ponPort.Peers, &peerPort)
78 uniPort := voltha.Port{PortNo: 2, DeviceId: onu.Id, Type: voltha.Port_ETHERNET_UNI}
79 onu.Ports = make([]*voltha.Port, 0)
80 onu.Ports = append(onu.Ports, &ponPort)
81 onu.Ports = append(onu.Ports, &uniPort)
82 onusOnPort5 = append(onusOnPort5, onu)
83 }
84
85 // Setup OLT
86 // Setup the OLT device
87 olt = voltha.Device{Id: oltDeviceId, ParentId: logicalDeviceId}
88 p1 := voltha.Port{PortNo: 2, DeviceId: oltDeviceId, Type: voltha.Port_ETHERNET_NNI}
89 p2 := voltha.Port{PortNo: 3, DeviceId: oltDeviceId, Type: voltha.Port_ETHERNET_NNI}
90 p3 := voltha.Port{PortNo: 4, DeviceId: oltDeviceId, Type: voltha.Port_PON_OLT}
91 p4 := voltha.Port{PortNo: 5, DeviceId: oltDeviceId, Type: voltha.Port_PON_OLT}
92 p3.Peers = make([]*voltha.Port_PeerPort, 0)
93 for _, onu := range onusOnPort4 {
94 peerPort := voltha.Port_PeerPort{DeviceId: onu.Id, PortNo: p3.PortNo}
95 p3.Peers = append(p3.Peers, &peerPort)
96 }
97 p4.Peers = make([]*voltha.Port_PeerPort, 0)
98 for _, onu := range onusOnPort5 {
99 peerPort := voltha.Port_PeerPort{DeviceId: onu.Id, PortNo: p4.PortNo}
100 p4.Peers = append(p4.Peers, &peerPort)
101 }
102 olt.Ports = make([]*voltha.Port, 0)
103 olt.Ports = append(olt.Ports, &p1)
104 olt.Ports = append(olt.Ports, &p2)
105 olt.Ports = append(olt.Ports, &p3)
106 olt.Ports = append(olt.Ports, &p4)
107
108 // Setup the logical device
109 ld = voltha.LogicalDevice{Id: logicalDeviceId}
110 ld.Ports = make([]*voltha.LogicalPort, 0)
111 ofpPortNo := 1
112 //Add olt ports
113 for i, port := range olt.Ports {
114 if port.Type == voltha.Port_ETHERNET_NNI {
115 id = fmt.Sprintf("nni-%d", i)
116 lp := voltha.LogicalPort{Id: id, DeviceId: olt.Id, DevicePortNo: port.PortNo, OfpPort: &openflow_13.OfpPort{PortNo: uint32(ofpPortNo)}, RootPort: true}
117 ld.Ports = append(ld.Ports, &lp)
118 ofpPortNo = ofpPortNo + 1
119 }
120 }
121 //Add onu ports on port 4
122 for i, onu := range onusOnPort4 {
123 for _, port := range onu.Ports {
124 if port.Type == voltha.Port_ETHERNET_UNI {
125 id = fmt.Sprintf("uni-%d", i)
126 lp := voltha.LogicalPort{Id: id, DeviceId: onu.Id, DevicePortNo: port.PortNo, OfpPort: &openflow_13.OfpPort{PortNo: uint32(ofpPortNo)}, RootPort: false}
127 ld.Ports = append(ld.Ports, &lp)
128 ofpPortNo = ofpPortNo + 1
129 }
130 }
131 }
132 //Add onu ports on port 5
133 for i, onu := range onusOnPort5 {
134 for _, port := range onu.Ports {
135 if port.Type == voltha.Port_ETHERNET_UNI {
khenaidoo910204f2019-04-08 17:56:40 -0400136 id = fmt.Sprintf("uni-%d", i+len(onusOnPort4))
khenaidoo89b0e942018-10-21 21:11:33 -0400137 lp := voltha.LogicalPort{Id: id, DeviceId: onu.Id, DevicePortNo: port.PortNo, OfpPort: &openflow_13.OfpPort{PortNo: uint32(ofpPortNo)}, RootPort: false}
138 ld.Ports = append(ld.Ports, &lp)
139 ofpPortNo = ofpPortNo + 1
140 }
141 }
142 }
143}
144
145func GetDeviceHelper(id string) (*voltha.Device, error) {
khenaidoo910204f2019-04-08 17:56:40 -0400146 lock.Lock()
147 numCalled += 1
148 lock.Unlock()
khenaidoo89b0e942018-10-21 21:11:33 -0400149 if id == "olt" {
150 return &olt, nil
151 }
152 for _, onu := range onusOnPort4 {
153 if onu.Id == id {
154 return &onu, nil
155 }
156 }
157 for _, onu := range onusOnPort5 {
158 if onu.Id == id {
159 return &onu, nil
160 }
161 }
162 return nil, errors.New("Not-found")
163}
164
khenaidoo910204f2019-04-08 17:56:40 -0400165func TestGetRoutesOneShot(t *testing.T) {
khenaidoo89b0e942018-10-21 21:11:33 -0400166
167 getDevice := GetDeviceHelper
168
169 // Create a device graph and computes Routes
170 start := time.Now()
khenaidoo910204f2019-04-08 17:56:40 -0400171 dg := NewDeviceGraph(logicalDeviceId, getDevice)
172
khenaidoo89b0e942018-10-21 21:11:33 -0400173 dg.ComputeRoutes(ld.Ports)
khenaidoo910204f2019-04-08 17:56:40 -0400174 fmt.Println("Total num called:", numCalled)
175 fmt.Println("Total Time creating graph & compute Routes in one shot:", time.Since(start))
khenaidoo89b0e942018-10-21 21:11:33 -0400176 assert.NotNil(t, dg.GGraph)
177 assert.EqualValues(t, (maxOnuOnPort4*4 + maxOnuOnPort5*4), len(dg.Routes))
khenaidoo910204f2019-04-08 17:56:40 -0400178 dg.Print()
179}
khenaidoo89b0e942018-10-21 21:11:33 -0400180
khenaidoo910204f2019-04-08 17:56:40 -0400181func TestGetRoutesAddPort(t *testing.T) {
182
183 getDevice := GetDeviceHelper
184
185 // Create a device graph and computes Routes
186 start := time.Now()
187 dg := NewDeviceGraph(logicalDeviceId, getDevice)
188 for _, lp := range ld.Ports {
189 dg.AddPort(lp)
190 }
191
192 fmt.Println("Total num called:", numCalled)
193 fmt.Println("Total Time creating graph & compute Routes per port:", time.Since(start))
194 assert.NotNil(t, dg.GGraph)
195 assert.EqualValues(t, (maxOnuOnPort4*4 + maxOnuOnPort5*4), len(dg.Routes))
196 dg.Print()
khenaidoo89b0e942018-10-21 21:11:33 -0400197}