From 1b89b122ee3cc64e3d7f2a2fa7ca9ab3e2daece5 Mon Sep 17 00:00:00 2001 From: Jason Staack Date: Sat, 21 Mar 2026 18:32:58 -0500 Subject: [PATCH] feat(16-04): add Collector interface and RouterOSCollector - Define Collector interface with Collect(ctx, dev, pub) error signature - Implement RouterOSCollector as thin wrapper delegating to PollDevice - Add compile-time interface assertion for RouterOSCollector Co-Authored-By: Claude Opus 4.6 (1M context) --- poller/internal/poller/collector.go | 19 ++++++++ poller/internal/poller/routeros_collector.go | 48 ++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 poller/internal/poller/collector.go create mode 100644 poller/internal/poller/routeros_collector.go diff --git a/poller/internal/poller/collector.go b/poller/internal/poller/collector.go new file mode 100644 index 0000000..0f90be2 --- /dev/null +++ b/poller/internal/poller/collector.go @@ -0,0 +1,19 @@ +package poller + +import ( + "context" + + "github.com/staack/the-other-dude/poller/internal/bus" + "github.com/staack/the-other-dude/poller/internal/store" +) + +// Collector defines the contract for device-type-specific data collection. +// Each device type (RouterOS, SNMP) implements this interface. +// The Scheduler dispatches to the appropriate Collector based on device_type. +type Collector interface { + // Collect performs one complete poll cycle for a device. + // It handles lock acquisition, credential decryption, connection, + // data collection, and event publishing. + // Returns ErrDeviceOffline if the device cannot be reached. + Collect(ctx context.Context, dev store.Device, pub *bus.Publisher) error +} diff --git a/poller/internal/poller/routeros_collector.go b/poller/internal/poller/routeros_collector.go new file mode 100644 index 0000000..e9e84fb --- /dev/null +++ b/poller/internal/poller/routeros_collector.go @@ -0,0 +1,48 @@ +package poller + +import ( + "context" + "time" + + "github.com/bsm/redislock" + + "github.com/staack/the-other-dude/poller/internal/bus" + "github.com/staack/the-other-dude/poller/internal/store" + "github.com/staack/the-other-dude/poller/internal/vault" +) + +// RouterOSCollector implements Collector for MikroTik RouterOS devices. +// It wraps the existing PollDevice logic, preserving identical behavior. +type RouterOSCollector struct { + locker *redislock.Client + credentialCache *vault.CredentialCache + connTimeout time.Duration + cmdTimeout time.Duration + lockTTL time.Duration +} + +// NewRouterOSCollector creates a RouterOSCollector with the given dependencies. +func NewRouterOSCollector( + locker *redislock.Client, + credentialCache *vault.CredentialCache, + connTimeout time.Duration, + cmdTimeout time.Duration, + lockTTL time.Duration, +) *RouterOSCollector { + return &RouterOSCollector{ + locker: locker, + credentialCache: credentialCache, + connTimeout: connTimeout, + cmdTimeout: cmdTimeout, + lockTTL: lockTTL, + } +} + +// Collect performs one RouterOS poll cycle. This is a thin wrapper around +// PollDevice -- all business logic remains in worker.go unchanged. +func (c *RouterOSCollector) Collect(ctx context.Context, dev store.Device, pub *bus.Publisher) error { + return PollDevice(ctx, dev, c.locker, pub, c.credentialCache, c.connTimeout, c.cmdTimeout, c.lockTTL) +} + +// Compile-time interface assertion. +var _ Collector = (*RouterOSCollector)(nil)