Skip to content

Commit

Permalink
Merge pull request #51 from madhanrm/vswitchwmi
Browse files Browse the repository at this point in the history
Vswitch wmi
  • Loading branch information
madhanrm authored Apr 26, 2021
2 parents c835dc3 + 9d2d650 commit 2fb7587
Show file tree
Hide file tree
Showing 16 changed files with 845 additions and 49 deletions.
44 changes: 44 additions & 0 deletions pkg/hardware/network/netadapter/netadapter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package netadapter

import (
wmi "github.com/microsoft/wmi/pkg/wmiinstance"
"github.com/microsoft/wmi/server2019/root/standardcimv2"
)

type NetworkAdapter struct {
*standardcimv2.MSFT_NetAdapter
}

// NewNetworkAdapter
func NewNetworkAdapter(instance *wmi.WmiInstance) (*NetworkAdapter, error) {
wmiadapter, err := standardcimv2.NewMSFT_NetAdapterEx1(instance)
if err != nil {
return nil, err
}
return &NetworkAdapter{wmiadapter}, nil
}

func (na *NetworkAdapter) CloneEx1() (*NetworkAdapter, error) {
tmp, err := na.Clone()
if err != nil {
return nil, err
}
return NewNetworkAdapter(tmp)
}

func (r *NetworkAdapter) GetInterfaceIndex() (value int32, err error) {
retValue, err := r.GetProperty("InterfaceIndex")
if err != nil {
return
}
if retValue == nil {
// Doesn't have any value. Return empty
return
}

value, _ = retValue.(int32)
return
}
26 changes: 26 additions & 0 deletions pkg/hardware/network/netadapter/netadapter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package netadapter

import (
wmihost "github.com/microsoft/wmi/pkg/base/host"
_ "github.com/microsoft/wmi/pkg/base/session"
"testing"
)

func TestGetNetworkAdapter(t *testing.T) {
whost := wmihost.NewWmiLocalHost()
adapter, err := GetNetworkAdapterByName(whost, "Ethernet")
if err != nil {
t.Fatalf("[%+v]", err)
}

defer adapter.Close()

ifdesc, err := adapter.GetPropertyInterfaceDescription()
if err != nil {
t.Fatalf("[%+v]", err)
}

t.Logf("Interface Description [%+v]\n", ifdesc)
}
36 changes: 36 additions & 0 deletions pkg/hardware/network/netroute/netroute.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package netroute

import (
wmi "github.com/microsoft/wmi/pkg/wmiinstance"
"github.com/microsoft/wmi/server2019/root/standardcimv2"
)

type NetworkRoute struct {
*standardcimv2.MSFT_NetRoute
}

// NewNetworkRoute
func NewNetworkRoute(instance *wmi.WmiInstance) (*NetworkRoute, error) {
wminetroute, err := standardcimv2.NewMSFT_NetRouteEx1(instance)
if err != nil {
return nil, err
}
return &NetworkRoute{wminetroute}, nil
}

func (r *NetworkRoute) GetInterfaceIndex() (value int32, err error) {
retValue, err := r.GetProperty("InterfaceIndex")
if err != nil {
return
}
if retValue == nil {
// Doesn't have any value. Return empty
return
}

value, _ = retValue.(int32)
return
}
9 changes: 9 additions & 0 deletions pkg/hardware/network/netroute/netroute_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package netroute

import (
wmihost "github.com/microsoft/wmi/pkg/base/host"
_ "github.com/microsoft/wmi/pkg/base/session"
"testing"
)
32 changes: 32 additions & 0 deletions pkg/hardware/network/netroute/netroutecollection.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package netroute

import (
wmi "github.com/microsoft/wmi/pkg/wmiinstance"
)

type NetworkRouteCollection []*NetworkRoute

func NewNetworkRouteCollection(instances []*wmi.WmiInstance) (col NetworkRouteCollection, err error) {
for _, inst := range instances {
na, err1 := NewNetworkRoute(inst)
if err1 != nil {
err = err1
return
}
col = append(col, na)
}
return
}
func (netroutes *NetworkRouteCollection) Close() (err error) {
for _, value := range *netroutes {
value.Close()
}
return nil
}

func (netroutes *NetworkRouteCollection) String() string {
return ""
}
91 changes: 91 additions & 0 deletions pkg/hardware/network/service/service.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

package service

import (
"fmt"

"github.com/microsoft/wmi/pkg/base/host"
"github.com/microsoft/wmi/pkg/base/instance"
"github.com/microsoft/wmi/pkg/base/query"
"github.com/microsoft/wmi/pkg/constant"
"github.com/microsoft/wmi/pkg/errors"

"github.com/microsoft/wmi/pkg/hardware/network/netadapter"
"github.com/microsoft/wmi/pkg/hardware/network/netroute"
"github.com/microsoft/wmi/server2019/root/standardcimv2"
)

// GetNetworkRouteByDestinationAddress
func GetNetworkRouteByDestinationAddress(whost *host.WmiHost, destinationPrefix string) (netroutes netroute.NetworkRouteCollection, err error) {
query := query.NewWmiQuery("MSFT_NetRoute", "DestinationPrefix", destinationPrefix)
instances, err := instance.GetWmiInstancesFromHost(whost, string(constant.StadardCimV2), query)
if err != nil {
return nil, err
}

return netroute.NewNetworkRouteCollection(instances)

}

// GetNetworkAdapterByName
func GetNetworkAdapterByName(whost *host.WmiHost, name string) (adapter *netadapter.NetworkAdapter, err error) {
creds := whost.GetCredential()
querytmp := query.NewWmiQuery("MSFT_NetAdapter", "Name", name)
tmp, err := standardcimv2.NewMSFT_NetAdapterEx6(whost.HostName, string(constant.StadardCimV2), creds.UserName, creds.Password, creds.Domain, querytmp)
if err != nil {
return
}
return &netadapter.NetworkAdapter{tmp}, nil
}

// GetNetworkAdapterByName
func GetNetworkAdapterByInterfaceIndex(whost *host.WmiHost, ifindex int32) (adapter *netadapter.NetworkAdapter, err error) {
creds := whost.GetCredential()
querytmp := query.NewWmiQuery("MSFT_NetAdapter", "InterfaceIndex", fmt.Sprintf("%d", ifindex))
tmp, err := standardcimv2.NewMSFT_NetAdapterEx6(whost.HostName, string(constant.StadardCimV2), creds.UserName, creds.Password, creds.Domain, querytmp)
if err != nil {
return
}
return &netadapter.NetworkAdapter{tmp}, nil
}

// FindDefaultExternalAdapter - finds the first physical adapter which has a default gateway
func FindFirstPhysicalAdapterWithDefaultRoute(whost *host.WmiHost) (adapter *netadapter.NetworkAdapter, err error) {
routes, err := GetNetworkRouteByDestinationAddress(whost, "0.0.0.0/0")
if err != nil {
return
}
defer routes.Close()

for _, route := range routes {
ifindex, err1 := route.GetInterfaceIndex()
if err1 != nil {
err = err1
return
}
adapter1, err1 := GetNetworkAdapterByInterfaceIndex(whost, ifindex)
if err1 != nil {
err = err1
return
}
defer adapter1.Close()

isvirtual, err1 := adapter1.GetPropertyVirtual()
if err1 != nil {
err = err1
return
}

if isvirtual {
continue
}

adapter, err = adapter1.CloneEx1()
return
}

err = errors.Wrapf(errors.NotFound, "No suitable adapter was found with default route")
return
}
70 changes: 70 additions & 0 deletions pkg/hardware/network/service/service_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
package service

import (
wmihost "github.com/microsoft/wmi/pkg/base/host"
_ "github.com/microsoft/wmi/pkg/base/session"
"testing"
)

func TestGetNetworkAdapter(t *testing.T) {
whost := wmihost.NewWmiLocalHost()
adapter, err := GetNetworkAdapterByName(whost, "Ethernet")
if err != nil {
t.Fatalf("[%+v]", err)
}
defer adapter.Close()

ifIndex, err := adapter.GetInterfaceIndex()
if err != nil {
t.Fatalf("[%+v]", err)
}

t.Logf("Interface Index [%+v]\n", ifIndex)
adapter1, err := GetNetworkAdapterByInterfaceIndex(whost, ifIndex)
if err != nil {
t.Fatalf("[%+v]", err)
}
defer adapter1.Close()
}

func TestFindFirstPhysicalAdapterWithDefaultRoute(t *testing.T) {
whost := wmihost.NewWmiLocalHost()
adapter, err := FindFirstPhysicalAdapterWithDefaultRoute(whost)
if err != nil {
t.Fatalf("[%+v]", err)
}
defer adapter.Close()

ifIndex, err := adapter.GetInterfaceIndex()
if err != nil {
t.Fatalf("[%+v]", err)
}
adapterName, err := adapter.GetPropertyName()
if err != nil {
t.Fatalf("[%+v]", err)
}

t.Logf("Interface Index [%+v] [%+v]\n", ifIndex, adapterName)

}

func TestGetNetworkRoute(t *testing.T) {
whost := wmihost.NewWmiLocalHost()
netroutes, err := GetNetworkRouteByDestinationAddress(whost, "0.0.0.0/0")
if err != nil {
t.Fatalf("[%+v]", err)
}

defer netroutes.Close()

for _, netroute := range netroutes {
ifIndex, err := netroute.GetInterfaceIndex()
if err != nil {
t.Fatalf("[%+v]", err)
}
t.Logf("Interface Index [%+v]\n", ifIndex)
}

}
Loading

0 comments on commit 2fb7587

Please sign in to comment.