From fcac49645a60b9009d68a8957004b5ed4086a928 Mon Sep 17 00:00:00 2001 From: Mauro Ezequiel Moltrasio Date: Tue, 15 Apr 2025 11:31:37 +0200 Subject: [PATCH] ROX-28981: Split methods for collector iservice Due to a limitation on collector side with the C++ gRPC API, we have decided to split the RPC method into one per message type collector can send. This patch changes and regenerates the protobuf definitions and reworks the collector service to comply with the new definition. --- collector/lib/CollectorOutput.cpp | 6 +- collector/lib/CollectorOutput.h | 5 +- collector/lib/ProcessSignalHandler.cpp | 6 +- collector/lib/SensorClient.cpp | 6 +- collector/lib/SensorClient.h | 9 +-- collector/lib/SensorClientFormatter.cpp | 32 ++------ collector/lib/SensorClientFormatter.h | 8 +- collector/proto/third_party/stackrox | 2 +- collector/test/CollectorOutputTest.cpp | 6 +- integration-tests/go.mod | 29 ++++--- integration-tests/go.sum | 78 +++++++++--------- integration-tests/pkg/mock_sensor/legacy.go | 31 ++++++++ integration-tests/pkg/mock_sensor/server.go | 87 ++++++++++++++------- 13 files changed, 172 insertions(+), 133 deletions(-) create mode 100644 integration-tests/pkg/mock_sensor/legacy.go diff --git a/collector/lib/CollectorOutput.cpp b/collector/lib/CollectorOutput.cpp index 6ac9392caa..a315cda020 100644 --- a/collector/lib/CollectorOutput.cpp +++ b/collector/lib/CollectorOutput.cpp @@ -1,7 +1,5 @@ #include "CollectorOutput.h" -#include "internalapi/sensor/collector_iservice.pb.h" - #include "GRPCUtil.h" #include "HostInfo.h" @@ -40,7 +38,7 @@ void CollectorOutput::HandleOutputError() { stream_interrupted_.notify_one(); } -SignalHandler::Result CollectorOutput::SensorOutput(const sensor::MsgFromCollector& msg) { +SignalHandler::Result CollectorOutput::SensorOutput(const sensor::ProcessSignal& msg) { for (auto& client : sensor_clients_) { auto res = client->SendMsg(msg); switch (res) { @@ -83,7 +81,7 @@ SignalHandler::Result CollectorOutput::SignalOutput(const sensor::SignalStreamMe SignalHandler::Result CollectorOutput::SendMsg(const MessageType& msg) { auto visitor = [this](auto&& m) { using T = std::decay_t; - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { return SensorOutput(m); } else if constexpr (std::is_same_v) { return SignalOutput(m); diff --git a/collector/lib/CollectorOutput.h b/collector/lib/CollectorOutput.h index 1546c29ee2..ebb3309e30 100644 --- a/collector/lib/CollectorOutput.h +++ b/collector/lib/CollectorOutput.h @@ -2,7 +2,6 @@ #include -#include "internalapi/sensor/collector_iservice.pb.h" #include "internalapi/sensor/signal_iservice.pb.h" #include "CollectorConfig.h" @@ -13,7 +12,7 @@ namespace collector { -using MessageType = std::variant; +using MessageType = std::variant; class CollectorOutput { public: @@ -62,7 +61,7 @@ class CollectorOutput { bool EstablishGrpcStreamSingle(); void HandleOutputError(); - SignalHandler::Result SensorOutput(const sensor::MsgFromCollector& msg); + SignalHandler::Result SensorOutput(const sensor::ProcessSignal& msg); SignalHandler::Result SignalOutput(const sensor::SignalStreamMessage& msg); std::vector> sensor_clients_; diff --git a/collector/lib/ProcessSignalHandler.cpp b/collector/lib/ProcessSignalHandler.cpp index f48fd0871b..3635c62a14 100644 --- a/collector/lib/ProcessSignalHandler.cpp +++ b/collector/lib/ProcessSignalHandler.cpp @@ -104,9 +104,9 @@ SignalHandler::Result ProcessSignalHandler::HandleSensorSignal(sinsp_evt* evt) { return IGNORED; } - dtrace_probe(signal_msg->process_signal()); + dtrace_probe(*signal_msg); - if (!rate_limiter_.Allow(compute_process_key(signal_msg->process_signal()))) { + if (!rate_limiter_.Allow(compute_process_key(*signal_msg))) { ++(stats_->nProcessRateLimitCount); return IGNORED; } @@ -128,7 +128,7 @@ SignalHandler::Result ProcessSignalHandler::HandleExistingProcessSensor(sinsp_th return IGNORED; } - if (!rate_limiter_.Allow(compute_process_key(signal_msg->process_signal()))) { + if (!rate_limiter_.Allow(compute_process_key(*signal_msg))) { ++(stats_->nProcessRateLimitCount); return IGNORED; } diff --git a/collector/lib/SensorClient.cpp b/collector/lib/SensorClient.cpp index 3420162ec2..2d3a7f21be 100644 --- a/collector/lib/SensorClient.cpp +++ b/collector/lib/SensorClient.cpp @@ -5,7 +5,7 @@ namespace collector { bool SensorClient::Recreate() { context_ = std::make_unique(); - writer_ = DuplexClient::CreateWithReadsIgnored(&sensor::CollectorService::Stub::AsyncCommunicate, channel_, context_.get()); + writer_ = DuplexClient::CreateWithReadsIgnored(&sensor::CollectorService::Stub::AsyncPushProcesses, channel_, context_.get()); if (!writer_->WaitUntilStarted(std::chrono::seconds(30))) { CLOG(ERROR) << "Signal stream not ready after 30 seconds. Retrying ..."; CLOG(ERROR) << "Error message: " << writer_->FinishNow().error_message(); @@ -18,14 +18,14 @@ bool SensorClient::Recreate() { return true; } -SignalHandler::Result SensorClient::SendMsg(const sensor::MsgFromCollector& msg) { +SignalHandler::Result SensorClient::SendMsg(const sensor::ProcessSignal& msg) { if (!stream_active_.load(std::memory_order_acquire)) { CLOG_THROTTLED(ERROR, std::chrono::seconds(10)) << "GRPC stream is not established"; return SignalHandler::ERROR; } - if (first_write_ && msg.has_process_signal()) { + if (first_write_) { first_write_ = false; return SignalHandler::NEEDS_REFRESH; } diff --git a/collector/lib/SensorClient.h b/collector/lib/SensorClient.h index 2c04ed3fd2..f5bebdac85 100644 --- a/collector/lib/SensorClient.h +++ b/collector/lib/SensorClient.h @@ -5,7 +5,6 @@ #include #include "internalapi/sensor/collector_iservice.grpc.pb.h" -#include "internalapi/sensor/collector_iservice.pb.h" #include "DuplexGRPC.h" #include "SignalHandler.h" @@ -39,7 +38,7 @@ class ISensorClient { * @returns A SignalHandler::Result with the outcome of the send * operation. */ - virtual SignalHandler::Result SendMsg(const sensor::MsgFromCollector& msg) = 0; + virtual SignalHandler::Result SendMsg(const sensor::ProcessSignal& msg) = 0; }; class SensorClient : public ISensorClient { @@ -60,7 +59,7 @@ class SensorClient : public ISensorClient { bool Recreate() override; - SignalHandler::Result SendMsg(const sensor::MsgFromCollector& msg) override; + SignalHandler::Result SendMsg(const sensor::ProcessSignal& msg) override; private: std::shared_ptr channel_; @@ -69,7 +68,7 @@ class SensorClient : public ISensorClient { // This needs to have the same lifetime as the class. std::unique_ptr context_; - std::unique_ptr> writer_; + std::unique_ptr> writer_; bool first_write_ = false; }; @@ -77,7 +76,7 @@ class SensorClient : public ISensorClient { class SensorClientStdout : public ISensorClient { bool Recreate() override { return true; } - SignalHandler::Result SendMsg(const sensor::MsgFromCollector& msg) override { + SignalHandler::Result SendMsg(const sensor::ProcessSignal& msg) override { LogProtobufMessage(msg); return SignalHandler::PROCESSED; } diff --git a/collector/lib/SensorClientFormatter.cpp b/collector/lib/SensorClientFormatter.cpp index a0756f77f5..c7b6f27e1d 100644 --- a/collector/lib/SensorClientFormatter.cpp +++ b/collector/lib/SensorClientFormatter.cpp @@ -4,7 +4,7 @@ #include -#include "internalapi/sensor/collector_iservice.pb.h" +#include "internalapi/sensor/collector.pb.h" #include "internalapi/sensor/signal_iservice.pb.h" #include "CollectorStats.h" @@ -67,7 +67,7 @@ SensorClientFormatter::SensorClientFormatter(sinsp* inspector, const CollectorCo SensorClientFormatter::~SensorClientFormatter() = default; -const sensor::MsgFromCollector* SensorClientFormatter::ToProtoMessage(sinsp_evt* event) { +const sensor::ProcessSignal* SensorClientFormatter::ToProtoMessage(sinsp_evt* event) { if (process_signals[event->get_type()] == ProcessSignalType::UNKNOWN_PROCESS_TYPE) { return nullptr; } @@ -79,39 +79,21 @@ const sensor::MsgFromCollector* SensorClientFormatter::ToProtoMessage(sinsp_evt* return nullptr; } - ProcessSignal* process_signal = CreateProcessSignal(event); - if (process_signal == nullptr) { - return nullptr; - } - - auto* msg = AllocateRoot(); - msg->clear_info(); - msg->clear_register_(); - msg->set_allocated_process_signal(process_signal); - return msg; + return CreateProcessSignal(event); } -const sensor::MsgFromCollector* SensorClientFormatter::ToProtoMessage(sinsp_threadinfo* tinfo) { +const sensor::ProcessSignal* SensorClientFormatter::ToProtoMessage(sinsp_threadinfo* tinfo) { Reset(); if (!ValidateProcessDetails(tinfo)) { CLOG(INFO) << "Dropping process event: " << tinfo; return nullptr; } - ProcessSignal* signal = CreateProcessSignal(tinfo); - if (signal == nullptr) { - return nullptr; - } - - auto* msg = AllocateRoot(); - msg->clear_register_(); - msg->clear_info(); - msg->set_allocated_process_signal(signal); - return msg; + return CreateProcessSignal(tinfo); } ProcessSignal* SensorClientFormatter::CreateProcessSignal(sinsp_evt* event) { - auto signal = Allocate(); + auto signal = AllocateRoot(); // set id signal->set_id(UUIDStr()); @@ -193,7 +175,7 @@ ProcessSignal* SensorClientFormatter::CreateProcessSignal(sinsp_evt* event) { } ProcessSignal* SensorClientFormatter::CreateProcessSignal(sinsp_threadinfo* tinfo) { - auto signal = Allocate(); + auto signal = AllocateRoot(); // set id signal->set_id(UUIDStr()); diff --git a/collector/lib/SensorClientFormatter.h b/collector/lib/SensorClientFormatter.h index 56b3085545..d518242e94 100644 --- a/collector/lib/SensorClientFormatter.h +++ b/collector/lib/SensorClientFormatter.h @@ -5,7 +5,6 @@ #include #include "api/v1/signal.pb.h" -#include "internalapi/sensor/collector_iservice.pb.h" #include "CollectorConfig.h" #include "ContainerMetadata.h" @@ -22,7 +21,7 @@ class EventExtractor; namespace collector { -class SensorClientFormatter : public ProtoSignalFormatter { +class SensorClientFormatter : public ProtoSignalFormatter { public: SensorClientFormatter(const SensorClientFormatter&) = delete; SensorClientFormatter(SensorClientFormatter&&) = delete; @@ -35,10 +34,9 @@ class SensorClientFormatter : public ProtoSignalFormatter #include -#include "internalapi/sensor/collector_iservice.pb.h" - #include "CollectorOutput.h" #include "SensorClient.h" #include "SignalServiceClient.h" @@ -11,7 +9,7 @@ namespace collector { class MockSensorClient : public ISensorClient { public: MOCK_METHOD(bool, Recreate, ()); - MOCK_METHOD(SignalHandler::Result, SendMsg, (const sensor::MsgFromCollector&)); + MOCK_METHOD(SignalHandler::Result, SendMsg, (const sensor::ProcessSignal&)); }; class MockSignalClient : public ISignalServiceClient { @@ -32,7 +30,7 @@ class CollectorOutputTest : public testing::Test { }; TEST_F(CollectorOutputTest, SensorClient) { - sensor::MsgFromCollector msg; + sensor::ProcessSignal msg; EXPECT_CALL(*sensor_client, SendMsg).Times(1).WillOnce(testing::Return(SignalHandler::PROCESSED)); diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 5f3e7ad325..bce8a0ed5c 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -16,10 +16,10 @@ require ( github.com/stackrox/rox v0.0.0-20210914215712-9ac265932e28 github.com/stretchr/testify v1.10.0 github.com/thoas/go-funk v0.9.3 - go.opentelemetry.io/otel/trace v1.34.0 + go.opentelemetry.io/otel/trace v1.35.0 golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 - golang.org/x/sys v0.31.0 - google.golang.org/grpc v1.71.0 + golang.org/x/sys v0.32.0 + google.golang.org/grpc v1.71.1 gopkg.in/yaml.v3 v3.0.1 k8s.io/api v0.32.3 k8s.io/apimachinery v0.32.3 @@ -46,7 +46,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag v0.23.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect @@ -67,7 +67,6 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.18.0 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect @@ -81,7 +80,7 @@ require ( github.com/opencontainers/image-spec v1.1.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240409071808-615f978279ca // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.21.1 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect @@ -93,24 +92,24 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.35.0 // indirect + go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/net v0.37.0 // indirect - golang.org/x/oauth2 v0.28.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/oauth2 v0.29.0 // indirect + golang.org/x/term v0.31.0 // indirect + golang.org/x/text v0.24.0 // indirect golang.org/x/time v0.11.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect - google.golang.org/protobuf v1.36.5 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect @@ -129,7 +128,7 @@ replace ( github.com/fullsailor/pkcs7 => github.com/stackrox/pkcs7 v0.0.0-20220914154527-cfdb0aa47179 github.com/heroku/docker-registry-client => github.com/stackrox/docker-registry-client v0.0.0-20230714151239-78b1f5f70b8a github.com/operator-framework/helm-operator-plugins => github.com/stackrox/helm-operator v0.0.10-0.20220919093109-89f9785764c6 - github.com/stackrox/rox => github.com/stackrox/stackrox v0.0.0-20250325114232-8e68c6a26ed1 + github.com/stackrox/rox => github.com/stackrox/stackrox v0.0.0-20250415091607-159cf2aea233 go.uber.org/zap => github.com/stackrox/zap v1.18.2-0.20240314134248-5f932edd0404 ) diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 046f56564e..6b133c81f9 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -50,8 +50,8 @@ github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1 github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -81,8 +81,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= -github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -140,10 +140,10 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0= -github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM= -github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= -github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= +github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= +github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= +github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -157,8 +157,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240409071808-615f978279ca/go.mod h1 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= -github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= @@ -176,8 +176,8 @@ github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stackrox/scanner v0.0.0-20240830165150-d133ba942d59 h1:XrOPpgBpAnwTXGbyAYSOongfFeVJJBWPTdWEgYw+Uck= github.com/stackrox/scanner v0.0.0-20240830165150-d133ba942d59/go.mod h1:xVs4A0Vur2djLSTZYtIj/5hgUORT1t405Fg0RX4/1kA= -github.com/stackrox/stackrox v0.0.0-20250325114232-8e68c6a26ed1 h1:jZAR27J5MMRkn3eEOVjtBdVSYKLmx0DP3QdtNUMDZFY= -github.com/stackrox/stackrox v0.0.0-20250325114232-8e68c6a26ed1/go.mod h1:AJRmMSul3qXVhjXf4FuRjw5OvzorgBRJ5/ght/sZq8w= +github.com/stackrox/stackrox v0.0.0-20250415091607-159cf2aea233 h1:4nPs380aJuWCdqZxSIxuXTFjKQF1fZ6UCv7RuwAksIw= +github.com/stackrox/stackrox v0.0.0-20250415091607-159cf2aea233/go.mod h1:OcfS0qFOxVTjbq25rXJlAst7CaKXLzpU/KIFpzaaq5I= github.com/stackrox/zap v1.18.2-0.20240314134248-5f932edd0404 h1:j2qhsZjUBpN4yaqEGkNrATdw3fE3vgMrVOhd44cUJDY= github.com/stackrox/zap v1.18.2-0.20240314134248-5f932edd0404/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -204,33 +204,35 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= -go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= -go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= -go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= -go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= -go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +go.uber.org/mock v0.5.1 h1:ASgazW/qBmR+A32MYFDB6E2POoTgOwT509VP0CT/fjs= +go.uber.org/mock v0.5.1/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= @@ -247,10 +249,10 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= +golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -258,14 +260,14 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -274,8 +276,8 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= -golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= +golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -284,10 +286,10 @@ google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb h1: google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= +google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/integration-tests/pkg/mock_sensor/legacy.go b/integration-tests/pkg/mock_sensor/legacy.go new file mode 100644 index 0000000000..d5fca3a42b --- /dev/null +++ b/integration-tests/pkg/mock_sensor/legacy.go @@ -0,0 +1,31 @@ +package mock_sensor + +import ( + sensorAPI "github.com/stackrox/rox/generated/internalapi/sensor" +) + +// This type is only used as a means to implement the legacy network service. +// Once the new network RPC is implemented, we can fully get rid of this. +type legacyNetworkServer struct { + *MockSensor +} + +func newLegacyServer(m *MockSensor) *legacyNetworkServer { + return &legacyNetworkServer{ + MockSensor: m, + } +} + +// PushNetworkConnectionInfo conforms to the Sensor API. It is here that networking +// events (connections and endpoints) are handled and stored/sent to the relevant channel +func (l *legacyNetworkServer) PushNetworkConnectionInfo(stream sensorAPI.NetworkConnectionInfoService_PushNetworkConnectionInfoServer) error { + for { + signal, err := stream.Recv() + if err != nil { + return err + } + + networkConnInfo := signal.GetInfo() + l.pushNetworkConnectionInfo(networkConnInfo) + } +} diff --git a/integration-tests/pkg/mock_sensor/server.go b/integration-tests/pkg/mock_sensor/server.go index 363753e035..867938ec5b 100644 --- a/integration-tests/pkg/mock_sensor/server.go +++ b/integration-tests/pkg/mock_sensor/server.go @@ -10,7 +10,9 @@ import ( "sync" "time" + "github.com/stackrox/rox/generated/internalapi/sensor" sensorAPI "github.com/stackrox/rox/generated/internalapi/sensor" + utils "github.com/stackrox/rox/pkg/net" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" @@ -56,16 +58,22 @@ type MockSensor struct { lineageChannel RingChan[*sensorAPI.ProcessSignal_LineageInfo] connectionChannel RingChan[*sensorAPI.NetworkConnection] endpointChannel RingChan[*sensorAPI.NetworkEndpoint] + + legacyServer *legacyNetworkServer } func NewMockSensor(test string) *MockSensor { - return &MockSensor{ + mockSensor := &MockSensor{ testName: test, processes: make(map[string]ProcessMap), processLineages: make(map[string]LineageMap), connections: make(map[string][]types.NetworkInfoBatch), endpoints: make(map[string]EndpointMap), } + + mockSensor.legacyServer = newLegacyServer(mockSensor) + + return mockSensor } // LiveProcesses returns a channel that can be used to read live @@ -267,7 +275,7 @@ func (m *MockSensor) Start() { ) sensorAPI.RegisterCollectorServiceServer(m.grpcServer, m) - sensorAPI.RegisterNetworkConnectionInfoServiceServer(m.grpcServer, m) + sensorAPI.RegisterNetworkConnectionInfoServiceServer(m.grpcServer, m.legacyServer) m.processChannel = NewRingChan[*sensorAPI.ProcessSignal](gDefaultRingSize) m.lineageChannel = NewRingChan[*sensorAPI.ProcessSignal_LineageInfo](gDefaultRingSize) @@ -330,23 +338,15 @@ func (m *MockSensor) convertToContainerConnsMap(connections []*sensorAPI.Network return containerConnsMap } -// Communicate conforms to the Sensor API. It is here that process signals and +// PushProcesses conforms to the Sensor API. It is here that process signals and // process lineage information is handled and stored/sent to the relevant channel -func (m *MockSensor) Communicate(stream sensorAPI.CollectorService_CommunicateServer) error { +func (m *MockSensor) PushProcesses(stream sensorAPI.CollectorService_PushProcessesServer) error { for { signal, err := stream.Recv() if err != nil { return err } - - switch signal.GetMsg().(type) { - case *sensorAPI.MsgFromCollector_ProcessSignal: - m.pushSignal(signal.GetProcessSignal()) - case *sensorAPI.MsgFromCollector_Register: - // Ignored event - case *sensorAPI.MsgFromCollector_Info: - // Unimplemented event - } + m.pushSignal(signal) } } @@ -391,27 +391,30 @@ func (m *MockSensor) pushSignal(signal *sensorAPI.ProcessSignal) error { // PushNetworkConnectionInfo conforms to the Sensor API. It is here that networking // events (connections and endpoints) are handled and stored/sent to the relevant channel -func (m *MockSensor) PushNetworkConnectionInfo(stream sensorAPI.NetworkConnectionInfoService_PushNetworkConnectionInfoServer) error { +func (m *MockSensor) PushNetworkConnectionInfo(stream sensorAPI.CollectorService_PushNetworkConnectionInfoServer) error { for { - signal, err := stream.Recv() + networkConnInfo, err := stream.Recv() if err != nil { return err } - networkConnInfo := signal.GetInfo() - connections := networkConnInfo.GetUpdatedConnections() - endpoints := networkConnInfo.GetUpdatedEndpoints() + m.pushNetworkConnectionInfo(networkConnInfo) + } +} - for _, endpoint := range endpoints { - m.pushEndpoint(endpoint.GetContainerId(), endpoint) - m.endpointChannel.Write(endpoint) - } +func (m *MockSensor) pushNetworkConnectionInfo(msg *sensor.NetworkConnectionInfo) { + connections := msg.GetUpdatedConnections() + endpoints := msg.GetUpdatedEndpoints() - containerConnsMap := m.convertToContainerConnsMap(connections) - m.pushConnections(containerConnsMap) - for _, connection := range connections { - m.connectionChannel.Write(connection) - } + for _, endpoint := range endpoints { + m.pushEndpoint(endpoint.GetContainerId(), endpoint) + m.endpointChannel.Write(endpoint) + } + + containerConnsMap := m.convertToContainerConnsMap(connections) + m.pushConnections(containerConnsMap) + for _, connection := range connections { + m.connectionChannel.Write(connection) } } @@ -532,6 +535,36 @@ func (m *MockSensor) pushEndpoint(containerID string, endpoint *sensorAPI.Networ } } +// translateAddress is a helper function for converting binary representations +// of network addresses (in the signals) to usable forms for testing +func translateAddress(addr *sensorAPI.NetworkAddress) string { + peerId := utils.NetworkPeerID{Port: uint16(addr.GetPort())} + addressData := addr.GetAddressData() + if len(addressData) > 0 { + peerId.Address = utils.IPFromBytes(addressData) + return peerId.String() + } + + // If there is no address data, this is either the source address or + // IpNetwork should be set and represent a CIDR block or external IP address. + ipNetworkData := addr.GetIpNetwork() + if len(ipNetworkData) == 0 { + return peerId.String() + } + + ipNetwork := utils.IPNetworkFromCIDRBytes(ipNetworkData) + prefixLen := ipNetwork.PrefixLen() + // If this is IPv4 and the prefix length is 32 or this is IPv6 and the prefix length + // is 128 this is a regular IP address and not a CIDR block + if (ipNetwork.Family() == utils.IPv4 && prefixLen == byte(32)) || + (ipNetwork.Family() == utils.IPv6 && prefixLen == byte(128)) { + peerId.Address = ipNetwork.IP() + } else { + peerId.IPNetwork = ipNetwork + } + return peerId.String() +} + func (m *MockSensor) SetTestName(testName string) { m.testName = testName }