Skip to content

Commit

Permalink
Add dpvs-agent source code
Browse files Browse the repository at this point in the history
  • Loading branch information
you-looks-not-tasty authored and ywc689 committed Jul 13, 2023
1 parent 7f5b69e commit 29df3fa
Show file tree
Hide file tree
Showing 249 changed files with 34,985 additions and 0 deletions.
2 changes: 2 additions & 0 deletions tools/dpvs-agent/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bin/
cmd/dpvs-agent-server/dpvs-agent
32 changes: 32 additions & 0 deletions tools/dpvs-agent/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
MAKE = make
SUBDIRS = cmd/dpvs-agent-server
INSDIR = $(PWD)/bin
export INSDIR

OPENAPISPEC = dpvs-agent-api.yaml

all:
for i in $(SUBDIRS); do $(MAKE) -C $$i || exit 1; done

clean:
for i in $(SUBDIRS); do $(MAKE) -C $$i clean || exit 1; done

install:all
-mkdir -p $(INSDIR)
for i in $(SUBDIRS); do $(MAKE) -C $$i install || exit 1; done

uninstall:
for i in $(SUBDIRS); do $(MAKE) -C $$i uninstall || exit 1; done

openapi: $(OPENAPISPEC)
ifeq ($(shell swagger version),)
$(error "golang `swagger` command not found. You can install it with `go get github.com/go-swagger/go-swagger@v0.30.4`")
endif
swagger generate server -A dpvs-agent -f $<
git checkout cmd/dpvs-agent-server/main.go

license:
ifeq ($(shell addlicense 2>&1|grep Usage),)
$(error "`addlicense` command not found. You can install it with `go install github.com/google/addlicense`")
endif
@addlicense -check -c "IQiYi Inc." -l apache -ignore dpvs/** . || /bin/true
4 changes: 4 additions & 0 deletions tools/dpvs-agent/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#build
```
swagger generate server -A dpvs-agent -f ./dpvs-agent-api.yaml
```
45 changes: 45 additions & 0 deletions tools/dpvs-agent/cmd/device/delete_device_name_addr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package device

import (
"github.com/dpvs-agent/pkg/ipc/pool"
"github.com/dpvs-agent/pkg/ipc/types"

apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

type delDeviceAddr struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewDelDeviceAddr(cp *pool.ConnPool, parentLogger hclog.Logger) *delDeviceAddr {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("DelDeviceAddr")
}
return &delDeviceAddr{connPool: cp, logger: logger}
}

// dpip addr add 192.168.88.16/32 dev dpdk0.102
func (h *delDeviceAddr) Handle(params apiDevice.DeleteDeviceNameAddrParams) middleware.Responder {
addr := types.NewInetAddrDetail()
addr.SetAddr(params.Spec.Addr)
addr.SetIfName(params.Name)

result := addr.Del(h.connPool, h.logger)
switch result {
case types.EDPVS_OK:
h.logger.Info("Delete addr from device success.", "Device Name", params.Name, "Addr", params.Spec.Addr)
return apiDevice.NewDeleteDeviceNameAddrOK()
case types.EDPVS_NOTEXIST:
h.logger.Warn("Delete a not exist addr from device done.", "Device Name", params.Name, "Addr", params.Spec.Addr, "result", result.String())
return apiDevice.NewDeleteDeviceNameAddrOK()
default:
h.logger.Error("Delete addr from device failed.", "Device Name", params.Name, "Addr", params.Spec.Addr, "result", result.String())
}

return apiDevice.NewDeleteDeviceNameAddrInternalServerError()
}
49 changes: 49 additions & 0 deletions tools/dpvs-agent/cmd/device/delete_device_name_netlink.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package device

import (
"fmt"

"github.com/vishvananda/netlink"

"github.com/dpvs-agent/pkg/ipc/pool"
apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

// ip link set xxx down
type setDeviceNetlinkDown struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewSetDeviceNetlinkDown(cp *pool.ConnPool, parentLogger hclog.Logger) *setDeviceNetlinkDown {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("SetDeviceNetlinkDown")
}
return &setDeviceNetlinkDown{connPool: cp, logger: logger}
}

func (h *setDeviceNetlinkDown) Handle(params apiDevice.DeleteDeviceNameNetlinkParams) middleware.Responder {
cmd := fmt.Sprintf("ip link set %s down", params.Name)
dev, err := netlink.LinkByName(params.Name)
if err != nil {
h.logger.Error("Get iface failed.", "Name", params.Name, "Error", err.Error())
return apiDevice.NewDeleteDeviceNameNetlinkInternalServerError()
}

if err := netlink.LinkSetDown(dev); err != nil {
h.logger.Error("Set iface down failed.", "cmd", cmd, "Error", err.Error())
return apiDevice.NewDeleteDeviceNameNetlinkInternalServerError()
}

if err := netlink.LinkDel(dev); err != nil {
h.logger.Error("Delete iface failed.", "Name", params.Name, "Error", err.Error())
return apiDevice.NewDeleteDeviceNameNetlinkInternalServerError()
}

h.logger.Info("Set down and remove iface success.", "cmd", cmd)
return apiDevice.NewDeleteDeviceNameNetlinkOK()
}
68 changes: 68 additions & 0 deletions tools/dpvs-agent/cmd/device/delete_device_name_netlink_addr.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package device

import (
"fmt"
"net"
"strings"

"github.com/vishvananda/netlink"

"github.com/dpvs-agent/pkg/ipc/pool"
apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

type delDeviceNetlinkAddr struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewDelDeviceNetlinkAddr(cp *pool.ConnPool, parentLogger hclog.Logger) *delDeviceNetlinkAddr {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("DelDeviceNetlinkAddr")
}
return &delDeviceNetlinkAddr{connPool: cp, logger: logger}
}

func (h *delDeviceNetlinkAddr) Handle(params apiDevice.DeleteDeviceNameNetlinkAddrParams) middleware.Responder {
var cidr string
if strings.Count(params.Spec.Addr, "/") == 0 {
ip := net.ParseIP(params.Spec.Addr)
if ip == nil {
return apiDevice.NewDeleteDeviceNameNetlinkAddrInternalServerError()
}

if ip.To4() != nil {
cidr = params.Spec.Addr + "/32"
} else {
cidr = params.Spec.Addr + "/128"
}
}

ip, ipnet, err := net.ParseCIDR(cidr)
if err != nil {
return apiDevice.NewDeleteDeviceNameNetlinkAddrInternalServerError()
}

cmd := fmt.Sprintf("ip addr del %s dev %s", cidr, params.Name)

ipnet.IP = ip
addr := &netlink.Addr{IPNet: ipnet}

link, err := netlink.LinkByName(params.Name)
if err != nil {
h.logger.Error("Get linux network device by name failed.", "device Name", params.Name, "Error", err.Error())
return apiDevice.NewDeleteDeviceNameNetlinkAddrInternalServerError()
}

if err := netlink.AddrDel(link, addr); err != nil {
h.logger.Error("linux network operation failed.", "cmd", cmd, "Error", err.Error())
return apiDevice.NewDeleteDeviceNameNetlinkAddrInternalServerError()
}

h.logger.Info("linux network operation success.", "cmd", cmd)
return apiDevice.NewDeleteDeviceNameNetlinkAddrOK()
}
59 changes: 59 additions & 0 deletions tools/dpvs-agent/cmd/device/delete_device_name_route.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package device

import (
"github.com/dpvs-agent/pkg/ipc/pool"
"github.com/dpvs-agent/pkg/ipc/types"

apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

type delDeviceRoute struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewDelDeviceRoute(cp *pool.ConnPool, parentLogger hclog.Logger) *delDeviceRoute {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("DelDeviceRoute")
}
return &delDeviceRoute{connPool: cp, logger: logger}
}

// dpip del route 192.168.88.16/32 dev dpdk0.102
func (h *delDeviceRoute) Handle(params apiDevice.DeleteDeviceNameRouteParams) middleware.Responder {

// dest [addr], [mask] and [dev name] is useful of delete route only
route := types.NewRouteDetail()
route.SetDevice(params.Name)
if params.Spec == nil {
// FIXME: front error
return apiDevice.NewDeleteDeviceNameRouteInternalServerError()
}

route.SetDst(params.Spec.Dst)
route.SetScope(params.Spec.Scope)
/*
route.SetSrc(params.Spec.Src)
route.SetGateway(params.Spec.Gateway)
route.SetScope(params.Spec.Scope)
route.SetMtu(params.Spec.Mtu)
route.SetMetric(params.Spec.Metric)
*/
result := route.Del(h.connPool, h.logger)
switch result {
case types.EDPVS_OK:
h.logger.Info("Delete route success.", "Device Name", params.Name, "route Dst", params.Spec.Dst)
return apiDevice.NewDeleteDeviceNameRouteOK()
case types.EDPVS_NOTEXIST:
h.logger.Warn("Delete not exist route done.", "Device Name", params.Name, "route Dst", params.Spec.Dst, "result", result.String())
return apiDevice.NewDeleteDeviceNameRouteOK()
default:
h.logger.Error("Delete route failed.", "Device Name", params.Name, "route Dst", params.Spec.Dst, "result", result.String())
}

return apiDevice.NewDeleteDeviceNameRouteInternalServerError()
}
46 changes: 46 additions & 0 deletions tools/dpvs-agent/cmd/device/delete_device_name_vlan.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package device

import (
// "github.com/dpvs-agent/models"
"github.com/dpvs-agent/pkg/ipc/pool"
"github.com/dpvs-agent/pkg/ipc/types"

apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

type delDeviceVlan struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewDelDeviceVlan(cp *pool.ConnPool, parentLogger hclog.Logger) *delDeviceVlan {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("DelDeviceVlan")
}
return &delDeviceVlan{connPool: cp, logger: logger}
}

// dpip vlan del dpdk0.102
func (h *delDeviceVlan) Handle(params apiDevice.DeleteDeviceNameVlanParams) middleware.Responder {
// vlan device delete is need device name only
vlan := types.NewVlanDevice()
vlan.SetIfName(params.Name)

result := vlan.Del(h.connPool, h.logger)
switch result {
case types.EDPVS_OK:
h.logger.Info("Delete dpvs vlan success.", "Vlan Name", params.Name)
return apiDevice.NewDeleteDeviceNameVlanOK()
case types.EDPVS_NOTEXIST:
h.logger.Warn("Delete dpvs vlan done.", "Vlan Name", params.Name, "result", result.String())
return apiDevice.NewDeleteDeviceNameVlanOK()
default:
h.logger.Error("Delete dpvs vlan failed.", "Vlan Name", params.Name, "result", result.String())
}

return apiDevice.NewDeleteDeviceNameVlanInternalServerError()
}
78 changes: 78 additions & 0 deletions tools/dpvs-agent/cmd/device/get_device_name_nic.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package device

import (
"strings"

"github.com/dpvs-agent/models"
"github.com/dpvs-agent/pkg/ipc/pool"
"github.com/dpvs-agent/pkg/ipc/types"

apiDevice "github.com/dpvs-agent/restapi/operations/device"

"github.com/go-openapi/runtime/middleware"
"github.com/hashicorp/go-hclog"
)

type getDeviceNameNic struct {
connPool *pool.ConnPool
logger hclog.Logger
}

func NewGetDeviceNameNic(cp *pool.ConnPool, parentLogger hclog.Logger) *getDeviceNameNic {
logger := hclog.Default()
if parentLogger != nil {
logger = parentLogger.Named("GetDeviceNameNic")
}
return &getDeviceNameNic{connPool: cp, logger: logger}
}

// dpip link show xxx
func (h *getDeviceNameNic) Handle(params apiDevice.GetDeviceNameNicParams) middleware.Responder {
name := make([]byte, 0x10)
copy(name[:], params.Name[:])

desc := types.NewNetifNicDesc()
list, err := desc.GetPortList(h.connPool, h.logger)
if err != types.EDPVS_OK {
h.logger.Info("Get netif ports failed.", "Error", err.String())
return apiDevice.NewGetDeviceNameNicInternalServerError()
}

h.logger.Info("Get netif port success.", "port list", list)
exist := false
specModels := new(models.NicDeviceSpecList)
specModels.Items = make([]*models.NicDeviceSpec, len(list.Entries))

for i, entry := range list.Entries {
specModels.Items[i] = new(models.NicDeviceSpec)
if strings.EqualFold(strings.ToLower(string(name)), strings.ToLower(entry.GetName())) {
exist = true
}

portName := entry.GetName()
desc.SetName(portName)
detail, err := desc.GetPortBasic(h.connPool, h.logger)
if err != types.EDPVS_OK {
h.logger.Error("Get netif port base info failed.", "portName", portName, "Error", err.String())
return apiDevice.NewGetDeviceNameNicInternalServerError()
}
h.logger.Info("Get netif port base info success.", "portName", portName, "port detail", detail)

stats, err := desc.GetPortStats(h.connPool, h.logger)
if err != types.EDPVS_OK {
h.logger.Error("Get netif port stats info failed.", "portName", portName, "Error", err.String())
return apiDevice.NewGetDeviceNameNicInternalServerError()
}
h.logger.Info("Get netif port stats info success.", "portName", portName, "port stats", stats)

specModels.Items[i].Detail = detail.GetModel()
specModels.Items[i].Stats = stats.GetModel()
}

if exist {
if *params.Stats {
}
}

return apiDevice.NewGetDeviceNameNicOK().WithPayload(specModels)
}
Loading

0 comments on commit 29df3fa

Please sign in to comment.