Skip to content

Commit 811b829

Browse files
committed
vcsim: Fix port filtering by criteria in FetchDVPorts
Closes: #2733 Signed-off-by: syuparn <[email protected]>
1 parent 5cd154f commit 811b829

File tree

2 files changed

+213
-2
lines changed

2 files changed

+213
-2
lines changed

simulator/dvs.go

Lines changed: 104 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,8 +268,7 @@ func (s *DistributedVirtualSwitch) DestroyTask(ctx *Context, req *types.Destroy_
268268
}
269269
}
270270

271-
func (s *DistributedVirtualSwitch) dvPortgroups(_ *types.DistributedVirtualSwitchPortCriteria) []types.DistributedVirtualPort {
272-
// TODO(agui): Filter is not implemented yet
271+
func (s *DistributedVirtualSwitch) dvPortgroups(criteria *types.DistributedVirtualSwitchPortCriteria) []types.DistributedVirtualPort {
273272
res := s.FetchDVPortsResponse.Returnval
274273
if len(res) != 0 {
275274
return res
@@ -289,5 +288,108 @@ func (s *DistributedVirtualSwitch) dvPortgroups(_ *types.DistributedVirtualSwitc
289288
})
290289
}
291290
}
291+
292+
// filter ports by criteria
293+
res = s.filterDVPorts(res, criteria)
294+
292295
return res
293296
}
297+
298+
func (s *DistributedVirtualSwitch) filterDVPorts(
299+
ports []types.DistributedVirtualPort,
300+
criteria *types.DistributedVirtualSwitchPortCriteria,
301+
) []types.DistributedVirtualPort {
302+
if criteria == nil {
303+
return ports
304+
}
305+
306+
ports = s.filterDVPortsByPortgroupKey(ports, criteria)
307+
ports = s.filterDVPortsByPortKey(ports, criteria)
308+
ports = s.filterDVPortsByConnected(ports, criteria)
309+
310+
return ports
311+
}
312+
313+
func (s *DistributedVirtualSwitch) filterDVPortsByPortgroupKey(
314+
ports []types.DistributedVirtualPort,
315+
criteria *types.DistributedVirtualSwitchPortCriteria,
316+
) []types.DistributedVirtualPort {
317+
if len(criteria.PortgroupKey) == 0 || criteria.Inside == nil {
318+
return ports
319+
}
320+
321+
// inside portgroup keys
322+
if *criteria.Inside {
323+
filtered := []types.DistributedVirtualPort{}
324+
325+
for _, p := range ports {
326+
for _, pgk := range criteria.PortgroupKey {
327+
if p.PortgroupKey == pgk {
328+
filtered = append(filtered, p)
329+
break
330+
}
331+
}
332+
}
333+
return filtered
334+
}
335+
336+
// outside portgroup keys
337+
filtered := []types.DistributedVirtualPort{}
338+
339+
for _, p := range ports {
340+
found := false
341+
for _, pgk := range criteria.PortgroupKey {
342+
if p.PortgroupKey == pgk {
343+
found = true
344+
break
345+
}
346+
}
347+
348+
if !found {
349+
filtered = append(filtered, p)
350+
}
351+
}
352+
return filtered
353+
}
354+
355+
func (s *DistributedVirtualSwitch) filterDVPortsByPortKey(
356+
ports []types.DistributedVirtualPort,
357+
criteria *types.DistributedVirtualSwitchPortCriteria,
358+
) []types.DistributedVirtualPort {
359+
if len(criteria.PortKey) == 0 {
360+
return ports
361+
}
362+
363+
filtered := []types.DistributedVirtualPort{}
364+
365+
for _, p := range ports {
366+
for _, pk := range criteria.PortKey {
367+
if p.Key == pk {
368+
filtered = append(filtered, p)
369+
break
370+
}
371+
}
372+
}
373+
374+
return filtered
375+
}
376+
377+
func (s *DistributedVirtualSwitch) filterDVPortsByConnected(
378+
ports []types.DistributedVirtualPort,
379+
criteria *types.DistributedVirtualSwitchPortCriteria,
380+
) []types.DistributedVirtualPort {
381+
if criteria.Connected == nil {
382+
return ports
383+
}
384+
385+
filtered := []types.DistributedVirtualPort{}
386+
387+
for _, p := range ports {
388+
connected := p.Connectee != nil
389+
if connected == *criteria.Connected {
390+
filtered = append(filtered, p)
391+
}
392+
}
393+
394+
return filtered
395+
}

simulator/dvs_test.go

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,112 @@ func TestDVS(t *testing.T) {
170170
t.Fatal(err)
171171
}
172172
}
173+
174+
func TestFetchDVPortsCriteria(t *testing.T) {
175+
m := VPX()
176+
177+
defer m.Remove()
178+
179+
err := m.Create()
180+
if err != nil {
181+
t.Fatal(err)
182+
}
183+
184+
ctx := context.Background()
185+
c := m.Service.client
186+
187+
finder := find.NewFinder(c, false)
188+
dc, _ := finder.DatacenterList(ctx, "*")
189+
finder.SetDatacenter(dc[0])
190+
vswitch := Map.Any("DistributedVirtualSwitch").(*DistributedVirtualSwitch)
191+
dvs0 := object.NewDistributedVirtualSwitch(c, vswitch.Reference())
192+
pgs := vswitch.Portgroup
193+
if len(pgs) != 2 {
194+
t.Fatalf("expected 2 portgroups in DVS; got %d", len(pgs))
195+
}
196+
197+
tests := []struct {
198+
name string
199+
criteria *types.DistributedVirtualSwitchPortCriteria
200+
expected []types.DistributedVirtualPort
201+
}{
202+
{
203+
"empty criteria",
204+
&types.DistributedVirtualSwitchPortCriteria{},
205+
[]types.DistributedVirtualPort{
206+
{PortgroupKey: pgs[0].Value, Key: "0"},
207+
{PortgroupKey: pgs[1].Value, Key: "0"},
208+
},
209+
},
210+
{
211+
"inside PortgroupKeys",
212+
&types.DistributedVirtualSwitchPortCriteria{
213+
PortgroupKey: []string{pgs[0].Value},
214+
Inside: types.NewBool(true),
215+
},
216+
[]types.DistributedVirtualPort{
217+
{PortgroupKey: pgs[0].Value, Key: "0"},
218+
},
219+
},
220+
{
221+
"outside PortgroupKeys",
222+
&types.DistributedVirtualSwitchPortCriteria{
223+
PortgroupKey: []string{pgs[0].Value},
224+
Inside: types.NewBool(false),
225+
},
226+
[]types.DistributedVirtualPort{
227+
{PortgroupKey: pgs[1].Value, Key: "0"},
228+
},
229+
},
230+
{
231+
"PortKeys",
232+
&types.DistributedVirtualSwitchPortCriteria{
233+
PortKey: []string{"1"},
234+
},
235+
[]types.DistributedVirtualPort{},
236+
},
237+
{
238+
"connected",
239+
&types.DistributedVirtualSwitchPortCriteria{
240+
Connected: types.NewBool(true),
241+
},
242+
[]types.DistributedVirtualPort{},
243+
},
244+
{
245+
"not connected",
246+
&types.DistributedVirtualSwitchPortCriteria{
247+
Connected: types.NewBool(false),
248+
},
249+
[]types.DistributedVirtualPort{
250+
{PortgroupKey: pgs[0].Value, Key: "0"},
251+
{PortgroupKey: pgs[1].Value, Key: "0"},
252+
},
253+
},
254+
}
255+
256+
for _, test := range tests {
257+
t.Run(test.name, func(t *testing.T) {
258+
actual, err := dvs0.FetchDVPorts(context.TODO(), test.criteria)
259+
260+
if err != nil {
261+
t.Fatal(err)
262+
}
263+
264+
if len(actual) != len(test.expected) {
265+
t.Fatalf("expected %d ports; got %d", len(test.expected), len(actual))
266+
}
267+
268+
for i, p := range actual {
269+
if p.Key != test.expected[i].Key {
270+
t.Errorf("ports[%d]: expected Key `%s`; got `%s`",
271+
i, test.expected[i].Key, p.Key)
272+
}
273+
274+
if p.PortgroupKey != test.expected[i].PortgroupKey {
275+
t.Errorf("ports[%d]: expected PortgroupKey `%s`; got `%s`",
276+
i, test.expected[i].PortgroupKey, p.PortgroupKey)
277+
}
278+
}
279+
})
280+
}
281+
}

0 commit comments

Comments
 (0)