Skip to content

Commit

Permalink
vcsim: Fix port filtering by criteria in FetchDVPorts
Browse files Browse the repository at this point in the history
Closes: #2733
Signed-off-by: syuparn <s.hello.spagetti@gmail.com>
  • Loading branch information
Syuparn committed Feb 5, 2022
1 parent 5cd154f commit 811b829
Show file tree
Hide file tree
Showing 2 changed files with 213 additions and 2 deletions.
106 changes: 104 additions & 2 deletions simulator/dvs.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,8 +268,7 @@ func (s *DistributedVirtualSwitch) DestroyTask(ctx *Context, req *types.Destroy_
}
}

func (s *DistributedVirtualSwitch) dvPortgroups(_ *types.DistributedVirtualSwitchPortCriteria) []types.DistributedVirtualPort {
// TODO(agui): Filter is not implemented yet
func (s *DistributedVirtualSwitch) dvPortgroups(criteria *types.DistributedVirtualSwitchPortCriteria) []types.DistributedVirtualPort {
res := s.FetchDVPortsResponse.Returnval
if len(res) != 0 {
return res
Expand All @@ -289,5 +288,108 @@ func (s *DistributedVirtualSwitch) dvPortgroups(_ *types.DistributedVirtualSwitc
})
}
}

// filter ports by criteria
res = s.filterDVPorts(res, criteria)

return res
}

func (s *DistributedVirtualSwitch) filterDVPorts(
ports []types.DistributedVirtualPort,
criteria *types.DistributedVirtualSwitchPortCriteria,
) []types.DistributedVirtualPort {
if criteria == nil {
return ports
}

ports = s.filterDVPortsByPortgroupKey(ports, criteria)
ports = s.filterDVPortsByPortKey(ports, criteria)
ports = s.filterDVPortsByConnected(ports, criteria)

return ports
}

func (s *DistributedVirtualSwitch) filterDVPortsByPortgroupKey(
ports []types.DistributedVirtualPort,
criteria *types.DistributedVirtualSwitchPortCriteria,
) []types.DistributedVirtualPort {
if len(criteria.PortgroupKey) == 0 || criteria.Inside == nil {
return ports
}

// inside portgroup keys
if *criteria.Inside {
filtered := []types.DistributedVirtualPort{}

for _, p := range ports {
for _, pgk := range criteria.PortgroupKey {
if p.PortgroupKey == pgk {
filtered = append(filtered, p)
break
}
}
}
return filtered
}

// outside portgroup keys
filtered := []types.DistributedVirtualPort{}

for _, p := range ports {
found := false
for _, pgk := range criteria.PortgroupKey {
if p.PortgroupKey == pgk {
found = true
break
}
}

if !found {
filtered = append(filtered, p)
}
}
return filtered
}

func (s *DistributedVirtualSwitch) filterDVPortsByPortKey(
ports []types.DistributedVirtualPort,
criteria *types.DistributedVirtualSwitchPortCriteria,
) []types.DistributedVirtualPort {
if len(criteria.PortKey) == 0 {
return ports
}

filtered := []types.DistributedVirtualPort{}

for _, p := range ports {
for _, pk := range criteria.PortKey {
if p.Key == pk {
filtered = append(filtered, p)
break
}
}
}

return filtered
}

func (s *DistributedVirtualSwitch) filterDVPortsByConnected(
ports []types.DistributedVirtualPort,
criteria *types.DistributedVirtualSwitchPortCriteria,
) []types.DistributedVirtualPort {
if criteria.Connected == nil {
return ports
}

filtered := []types.DistributedVirtualPort{}

for _, p := range ports {
connected := p.Connectee != nil
if connected == *criteria.Connected {
filtered = append(filtered, p)
}
}

return filtered
}
109 changes: 109 additions & 0 deletions simulator/dvs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,3 +170,112 @@ func TestDVS(t *testing.T) {
t.Fatal(err)
}
}

func TestFetchDVPortsCriteria(t *testing.T) {
m := VPX()

defer m.Remove()

err := m.Create()
if err != nil {
t.Fatal(err)
}

ctx := context.Background()
c := m.Service.client

finder := find.NewFinder(c, false)
dc, _ := finder.DatacenterList(ctx, "*")
finder.SetDatacenter(dc[0])
vswitch := Map.Any("DistributedVirtualSwitch").(*DistributedVirtualSwitch)
dvs0 := object.NewDistributedVirtualSwitch(c, vswitch.Reference())
pgs := vswitch.Portgroup
if len(pgs) != 2 {
t.Fatalf("expected 2 portgroups in DVS; got %d", len(pgs))
}

tests := []struct {
name string
criteria *types.DistributedVirtualSwitchPortCriteria
expected []types.DistributedVirtualPort
}{
{
"empty criteria",
&types.DistributedVirtualSwitchPortCriteria{},
[]types.DistributedVirtualPort{
{PortgroupKey: pgs[0].Value, Key: "0"},
{PortgroupKey: pgs[1].Value, Key: "0"},
},
},
{
"inside PortgroupKeys",
&types.DistributedVirtualSwitchPortCriteria{
PortgroupKey: []string{pgs[0].Value},
Inside: types.NewBool(true),
},
[]types.DistributedVirtualPort{
{PortgroupKey: pgs[0].Value, Key: "0"},
},
},
{
"outside PortgroupKeys",
&types.DistributedVirtualSwitchPortCriteria{
PortgroupKey: []string{pgs[0].Value},
Inside: types.NewBool(false),
},
[]types.DistributedVirtualPort{
{PortgroupKey: pgs[1].Value, Key: "0"},
},
},
{
"PortKeys",
&types.DistributedVirtualSwitchPortCriteria{
PortKey: []string{"1"},
},
[]types.DistributedVirtualPort{},
},
{
"connected",
&types.DistributedVirtualSwitchPortCriteria{
Connected: types.NewBool(true),
},
[]types.DistributedVirtualPort{},
},
{
"not connected",
&types.DistributedVirtualSwitchPortCriteria{
Connected: types.NewBool(false),
},
[]types.DistributedVirtualPort{
{PortgroupKey: pgs[0].Value, Key: "0"},
{PortgroupKey: pgs[1].Value, Key: "0"},
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
actual, err := dvs0.FetchDVPorts(context.TODO(), test.criteria)

if err != nil {
t.Fatal(err)
}

if len(actual) != len(test.expected) {
t.Fatalf("expected %d ports; got %d", len(test.expected), len(actual))
}

for i, p := range actual {
if p.Key != test.expected[i].Key {
t.Errorf("ports[%d]: expected Key `%s`; got `%s`",
i, test.expected[i].Key, p.Key)
}

if p.PortgroupKey != test.expected[i].PortgroupKey {
t.Errorf("ports[%d]: expected PortgroupKey `%s`; got `%s`",
i, test.expected[i].PortgroupKey, p.PortgroupKey)
}
}
})
}
}

0 comments on commit 811b829

Please sign in to comment.