2 Commits

Author SHA1 Message Date
Pim van Pelt
b6d2e3b629 Upgrade go-agentx to v0.3.0, containing my ordering fix 2025-11-21 10:08:23 +01:00
Pim van Pelt
a0d5c61643 Remove redundant constructor, h/t sergio 2025-11-15 22:42:04 +01:00
15 changed files with 73 additions and 65 deletions

23
debian/changelog vendored
View File

@@ -1,9 +1,30 @@
govpp-snmp-agentx (1.1.6-1) bookworm; urgency=medium govpp-snmp-agentx (1.2.0-1) bookworm; urgency=medium
* Update go-agentx dependency from 0.2.1 to 0.3.0 to fix compilation issues
* Adapt to breaking changes in go-agentx Session API (now requires nameOID, name, handler)
* Update Client configuration to use dial options (WithTimeout, WithReconnectInterval)
* Remove access to unexported Session.Handler field (API change)
* NOTE: This version fixes compilation broken in 1.1.6-1 and 1.1.7-1
-- Pim van Pelt <pim@ipng.ch> Wed, 20 Nov 2024 00:00:00 +0000
govpp-snmp-agentx (1.1.7-1) bookworm; urgency=critical
* Refactor VPPClient constructor to use idiomatic Go patterns
* Remove redundant NewVPPClient() constructor function
* Update all code to use direct struct initialization (&VPPClient{})
* Improve code maintainability and follow Go best practices
* WARNING: This version is BROKEN due to go-agentx 0.2.1 incompatibility
-- Pim van Pelt <pim@ipng.ch> Fri, 15 Nov 2024 00:00:00 +0000
govpp-snmp-agentx (1.1.6-1) bookworm; urgency=critical
* Replace forked go-agentx dependency with upstream github.com/posteo/go-agentx * Replace forked go-agentx dependency with upstream github.com/posteo/go-agentx
* Remove local src/go-agentx/ directory and use official upstream package * Remove local src/go-agentx/ directory and use official upstream package
* Upgrade to go-agentx v0.2.1 from official GitHub repository * Upgrade to go-agentx v0.2.1 from official GitHub repository
* Improve dependency management and reduce maintenance overhead * Improve dependency management and reduce maintenance overhead
* WARNING: This version is BROKEN due to go-agentx 0.2.1 incompatibility
-- Pim van Pelt <pim@ipng.ch> Fri, 08 Nov 2024 00:00:00 +0000 -- Pim van Pelt <pim@ipng.ch> Fri, 08 Nov 2024 00:00:00 +0000

View File

@@ -31,12 +31,13 @@ func StartAgentXRoutine(interfaceMIB *ifmib.InterfaceMIB) error {
logger.Debugf("Connecting to AgentX at %s://%s", network, address) logger.Debugf("Connecting to AgentX at %s://%s", network, address)
client, err := agentx.Dial(network, address) client, err := agentx.Dial(network, address,
agentx.WithTimeout(1*time.Minute),
agentx.WithReconnectInterval(1*time.Second),
)
if err != nil { if err != nil {
return err return err
} }
client.Timeout = 1 * time.Minute
client.ReconnectInterval = 1 * time.Second
// Register the interface MIB with the AgentX client // Register the interface MIB with the AgentX client
if err := interfaceMIB.RegisterWithClient(client); err != nil { if err := interfaceMIB.RegisterWithClient(client); err != nil {

View File

@@ -3,7 +3,7 @@ module govpp-snmp-agentx
go 1.23.8 go 1.23.8
require ( require (
github.com/posteo/go-agentx v0.2.1 github.com/posteo/go-agentx v0.3.0
go.fd.io/govpp v0.12.0 go.fd.io/govpp v0.12.0
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )

View File

@@ -18,12 +18,11 @@ github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posteo/go-agentx v0.2.1 h1:HO0zO/+GosL0RYEodu7KNH9OF/rL5bJbhXNP1z3hkT8= github.com/posteo/go-agentx v0.3.0 h1:Mqu0qzPHxbyZF3+fKwN2vjW49t6TPPgivjjplcuouNw=
github.com/posteo/go-agentx v0.2.1/go.mod h1:EUR75CfAEDstQn3WqCs26Ti64EsggaSXDk2dgxPQ5TI= github.com/posteo/go-agentx v0.3.0/go.mod h1:YCWL7bzLlpSNeU9vnfEg1pdlllDs1v2mz+pRcg21CUg=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
go.fd.io/govpp v0.12.0 h1:5HnMzsKHSFdxglsFyEhR0g+CzncWiLYXG2NDYgNUrnE= go.fd.io/govpp v0.12.0 h1:5HnMzsKHSFdxglsFyEhR0g+CzncWiLYXG2NDYgNUrnE=

View File

@@ -178,13 +178,9 @@ func (m *InterfaceMIB) UpdateStats(interfaceStats *api.InterfaceStats) {
m.addInterfaceToMIB(&iface) m.addInterfaceToMIB(&iface)
} }
// Update both sessions with the new handler // Note: With go-agentx 0.3.0, handlers are set during session creation and cannot be changed
if m.ifEntrySession != nil {
m.ifEntrySession.Handler = m.handler
}
if m.ifXTableSession != nil { if m.ifXTableSession != nil {
m.ifXTableSession.Handler = m.handler logger.Printf("Updated IF-MIB data for %d interfaces", len(m.stats))
logger.Printf("Updated session handlers with new IF-MIB data for %d interfaces", len(m.stats))
} }
logger.Debugf("IF-MIB now contains %d interfaces", len(m.stats)) logger.Debugf("IF-MIB now contains %d interfaces", len(m.stats))
@@ -460,13 +456,13 @@ func (m *InterfaceMIB) RegisterWithClient(client *agentx.Client) error {
m.mutex.Lock() m.mutex.Lock()
defer m.mutex.Unlock() defer m.mutex.Unlock()
// Create separate sessions for each MIB // Create separate sessions for each MIB with the handler
ifEntrySession, err := client.Session() ifEntrySession, err := client.Session(value.MustParseOID(ifEntryOID), "ifEntry", m.handler)
if err != nil { if err != nil {
return fmt.Errorf("failed to create ifEntry session: %v", err) return fmt.Errorf("failed to create ifEntry session: %v", err)
} }
ifXTableSession, err := client.Session() ifXTableSession, err := client.Session(value.MustParseOID(ifXTableOID), "ifXTable", m.handler)
if err != nil { if err != nil {
return fmt.Errorf("failed to create ifXTable session: %v", err) return fmt.Errorf("failed to create ifXTable session: %v", err)
} }
@@ -474,10 +470,6 @@ func (m *InterfaceMIB) RegisterWithClient(client *agentx.Client) error {
m.ifEntrySession = ifEntrySession m.ifEntrySession = ifEntrySession
m.ifXTableSession = ifXTableSession m.ifXTableSession = ifXTableSession
// Set handlers for both sessions
ifEntrySession.Handler = m.handler
ifXTableSession.Handler = m.handler
// Register the classic ifEntry // Register the classic ifEntry
err = ifEntrySession.Register(127, value.MustParseOID(ifEntryOID)) err = ifEntrySession.Register(127, value.MustParseOID(ifEntryOID))
if err != nil { if err != nil {

View File

@@ -16,7 +16,7 @@ import (
"govpp-snmp-agentx/vpp" "govpp-snmp-agentx/vpp"
) )
const Version = "1.1.6-1" const Version = "1.2.0-1"
func main() { func main() {
debug := flag.Bool("debug", false, "Enable debug logging") debug := flag.Bool("debug", false, "Enable debug logging")
@@ -46,7 +46,7 @@ func main() {
} }
// Create VPP client and managers // Create VPP client and managers
vppClient := vpp.NewVPPClient() vppClient := &vpp.VPPClient{}
interfaceManager := vpp.NewInterfaceManager(vppClient) interfaceManager := vpp.NewInterfaceManager(vppClient)
statsManager := vpp.NewStatsManager(vppClient) statsManager := vpp.NewStatsManager(vppClient)

View File

@@ -29,11 +29,6 @@ type VPPClient struct {
connected bool connected bool
} }
// NewVPPClient creates a new VPP client instance
func NewVPPClient() *VPPClient {
return &VPPClient{}
}
// Connect establishes connections to both VPP API and Stats sockets // Connect establishes connections to both VPP API and Stats sockets
func (c *VPPClient) Connect() error { func (c *VPPClient) Connect() error {
logger.Debugf("Connecting to VPP (API: %s, Stats: %s)", *ApiAddr, *StatsAddr) logger.Debugf("Connecting to VPP (API: %s, Stats: %s)", *ApiAddr, *StatsAddr)

View File

@@ -10,7 +10,7 @@ import (
) )
func TestNewInterfaceManager(t *testing.T) { func TestNewInterfaceManager(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
if manager == nil { if manager == nil {
@@ -36,7 +36,7 @@ func TestNewInterfaceManager(t *testing.T) {
} }
func TestInterfaceManagerSetEventCallback(t *testing.T) { func TestInterfaceManagerSetEventCallback(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
var callbackCalled bool var callbackCalled bool
@@ -82,7 +82,7 @@ func TestInterfaceManagerSetEventCallback(t *testing.T) {
} }
func TestInterfaceManagerGetAllInterfaceDetailsWithoutConnection(t *testing.T) { func TestInterfaceManagerGetAllInterfaceDetailsWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
_, err := manager.GetAllInterfaceDetails() _, err := manager.GetAllInterfaceDetails()
@@ -101,7 +101,7 @@ func TestInterfaceManagerGetAllInterfaceDetailsWithoutConnection(t *testing.T) {
} }
func TestInterfaceManagerStartEventWatcherWithoutConnection(t *testing.T) { func TestInterfaceManagerStartEventWatcherWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
err := manager.StartEventWatcher() err := manager.StartEventWatcher()
@@ -120,7 +120,7 @@ func TestInterfaceManagerStartEventWatcherWithoutConnection(t *testing.T) {
} }
func TestInterfaceManagerHandleInterfaceEventWithoutCallback(t *testing.T) { func TestInterfaceManagerHandleInterfaceEventWithoutCallback(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
// Should not panic when callback is nil // Should not panic when callback is nil
@@ -128,7 +128,7 @@ func TestInterfaceManagerHandleInterfaceEventWithoutCallback(t *testing.T) {
} }
func TestInterfaceManagerInitializeEventWatchingWithoutConnection(t *testing.T) { func TestInterfaceManagerInitializeEventWatchingWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
err := manager.InitializeEventWatching() err := manager.InitializeEventWatching()
@@ -220,7 +220,7 @@ func TestInterfaceEventCallback(t *testing.T) {
} }
func TestInterfaceManagerStartStopEventMonitoring(t *testing.T) { func TestInterfaceManagerStartStopEventMonitoring(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
if manager.running { if manager.running {
@@ -248,7 +248,7 @@ func TestInterfaceManagerStartStopEventMonitoring(t *testing.T) {
} }
func TestInterfaceManagerEventMonitoringWithConnectionChanges(t *testing.T) { func TestInterfaceManagerEventMonitoringWithConnectionChanges(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewInterfaceManager(client) manager := NewInterfaceManager(client)
// Set a callback to track calls // Set a callback to track calls

View File

@@ -10,7 +10,7 @@ import (
) )
func TestNewStatsManager(t *testing.T) { func TestNewStatsManager(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
if manager == nil { if manager == nil {
@@ -36,7 +36,7 @@ func TestNewStatsManager(t *testing.T) {
} }
func TestStatsManagerSetStatsCallback(t *testing.T) { func TestStatsManagerSetStatsCallback(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
var callbackCalled bool var callbackCalled bool
@@ -85,7 +85,7 @@ func TestStatsManagerSetStatsCallback(t *testing.T) {
} }
func TestStatsManagerSetPeriod(t *testing.T) { func TestStatsManagerSetPeriod(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
newPeriod := 5 * time.Second newPeriod := 5 * time.Second
@@ -97,7 +97,7 @@ func TestStatsManagerSetPeriod(t *testing.T) {
} }
func TestStatsManagerStartStopStatsRoutine(t *testing.T) { func TestStatsManagerStartStopStatsRoutine(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
if manager.running { if manager.running {
@@ -125,7 +125,7 @@ func TestStatsManagerStartStopStatsRoutine(t *testing.T) {
} }
func TestStatsManagerGetInterfaceStatsWithoutConnection(t *testing.T) { func TestStatsManagerGetInterfaceStatsWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
_, err := manager.GetInterfaceStats() _, err := manager.GetInterfaceStats()
@@ -206,7 +206,7 @@ func TestStatsCallback(t *testing.T) {
} }
func TestStatsManagerQueryAndReportStatsWithoutConnection(t *testing.T) { func TestStatsManagerQueryAndReportStatsWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
// Should return false when not connected // Should return false when not connected
@@ -216,7 +216,7 @@ func TestStatsManagerQueryAndReportStatsWithoutConnection(t *testing.T) {
} }
func TestStatsManagerWithShortPeriod(t *testing.T) { func TestStatsManagerWithShortPeriod(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
manager := NewStatsManager(client) manager := NewStatsManager(client)
// Set a very short period for testing // Set a very short period for testing

View File

@@ -7,7 +7,7 @@ import (
) )
func TestNewVPPClient(t *testing.T) { func TestNewVPPClient(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
if client == nil { if client == nil {
t.Fatal("NewVPPClient() returned nil") t.Fatal("NewVPPClient() returned nil")
@@ -27,7 +27,7 @@ func TestNewVPPClient(t *testing.T) {
} }
func TestVPPClientDisconnect(t *testing.T) { func TestVPPClientDisconnect(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
// Should be safe to call disconnect on unconnected client // Should be safe to call disconnect on unconnected client
client.Disconnect() client.Disconnect()
@@ -38,7 +38,7 @@ func TestVPPClientDisconnect(t *testing.T) {
} }
func TestVPPClientNewAPIChannelWithoutConnection(t *testing.T) { func TestVPPClientNewAPIChannelWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
_, err := client.NewAPIChannel() _, err := client.NewAPIChannel()
if err == nil { if err == nil {
@@ -56,7 +56,7 @@ func TestVPPClientNewAPIChannelWithoutConnection(t *testing.T) {
} }
func TestVPPClientCheckLivenessWithoutConnection(t *testing.T) { func TestVPPClientCheckLivenessWithoutConnection(t *testing.T) {
client := NewVPPClient() client := &VPPClient{}
if client.CheckLiveness() { if client.CheckLiveness() {
t.Error("CheckLiveness() should return false when not connected") t.Error("CheckLiveness() should return false when not connected")
@@ -86,7 +86,7 @@ func TestVPPClientConnectWithInvalidPaths(t *testing.T) {
*StatsAddr = origStatsAddr *StatsAddr = origStatsAddr
}() }()
client := NewVPPClient() client := &VPPClient{}
err := client.Connect() err := client.Connect()
if err == nil { if err == nil {