From 7b84684e75afb314c23fdce9f60169c642d5a9a2 Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 13:25:45 +0100 Subject: [PATCH] [8.17](backport #7035) fix(ipv6): support ipv6 address in grpc config (#7106) * fix(ipv6): support ipv6 address in grpc config (#7035) * fix(ipv6): support ipv6 address in grpc config joining addr port using string concat only works with ipv4 stdlib has funcs in the net pkg to properly support ipv6 * changelog: add fragment --------- Co-authored-by: Blake Rouse (cherry picked from commit 5d91620b22cde971b49bc8e6a0641de8e723e3b9) # Conflicts: # internal/pkg/agent/configuration/grpc.go # internal/pkg/agent/configuration/grpc_test.go * Update grpc.go * Update grpc_test.go --------- Co-authored-by: kruskall <99559985+kruskall@users.noreply.github.com> Co-authored-by: Blake Rouse Co-authored-by: Panos Koutsovasilis --- .../1740712540-support-grpc-ipv6-host.yaml | 32 +++++++++++++ internal/pkg/agent/configuration/grpc.go | 5 +- internal/pkg/agent/configuration/grpc_test.go | 48 +++++++++++++++++++ pkg/component/runtime/manager.go | 7 +-- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 changelog/fragments/1740712540-support-grpc-ipv6-host.yaml create mode 100644 internal/pkg/agent/configuration/grpc_test.go diff --git a/changelog/fragments/1740712540-support-grpc-ipv6-host.yaml b/changelog/fragments/1740712540-support-grpc-ipv6-host.yaml new file mode 100644 index 00000000000..b3bc5a8029a --- /dev/null +++ b/changelog/fragments/1740712540-support-grpc-ipv6-host.yaml @@ -0,0 +1,32 @@ +# Kind can be one of: +# - breaking-change: a change to previously-documented behavior +# - deprecation: functionality that is being removed in a later release +# - bug-fix: fixes a problem in a previous version +# - enhancement: extends functionality but does not break or fix existing behavior +# - feature: new functionality +# - known-issue: problems that we are aware of in a given version +# - security: impacts on the security of a product or a user’s deployment. +# - upgrade: important information for someone upgrading from a prior version +# - other: does not fit into any of the other categories +kind: bug-fix + +# Change summary; a 80ish characters long description of the change. +summary: support ipv6 host in grpc config + +# Long description; in case the summary is not enough to describe the change +# this field accommodate a description without length limits. +# NOTE: This field will be rendered only for breaking-change and known-issue kinds at the moment. +#description: + +# Affected component; usually one of "elastic-agent", "fleet-server", "filebeat", "metricbeat", "auditbeat", "all", etc. +component: elastic-agent + +# PR URL; optional; the PR number that added the changeset. +# If not present is automatically filled by the tooling finding the PR where this changelog fragment has been added. +# NOTE: the tooling supports backports, so it's able to fill the original PR number instead of the backport PR number. +# Please provide it if you are adding a fragment for a different PR. +pr: https://github.com/elastic/elastic-agent/pull/7035 + +# Issue URL; optional; the GitHub issue related to this changeset (either closes or is part of). +# If not present is automatically filled by the tooling with the issue linked to the PR number. +#issue: https://github.com/owner/repo/1234 diff --git a/internal/pkg/agent/configuration/grpc.go b/internal/pkg/agent/configuration/grpc.go index afb7771c6b3..bca20cccca6 100644 --- a/internal/pkg/agent/configuration/grpc.go +++ b/internal/pkg/agent/configuration/grpc.go @@ -5,7 +5,8 @@ package configuration import ( - "fmt" + "net" + "strconv" "github.com/elastic/elastic-agent/internal/pkg/agent/application/paths" ) @@ -43,7 +44,7 @@ func DefaultGRPCConfig() *GRPCConfig { // String returns the composed listen address for the GRPC. func (cfg *GRPCConfig) String() string { - return fmt.Sprintf("%s:%d", cfg.Address, cfg.Port) + return net.JoinHostPort(cfg.Address, strconv.Itoa(int(cfg.Port))) } // IsLocal returns true if port value is less than 0 diff --git a/internal/pkg/agent/configuration/grpc_test.go b/internal/pkg/agent/configuration/grpc_test.go new file mode 100644 index 00000000000..73398076c38 --- /dev/null +++ b/internal/pkg/agent/configuration/grpc_test.go @@ -0,0 +1,48 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package configuration + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGRPCAddr(t *testing.T) { + testcases := []struct { + name string + addr string + port uint16 + expected string + }{{ + name: "ipv4", + addr: "127.0.0.1", + expected: "127.0.0.1:0", + }, { + name: "ipv4+port", + addr: "127.0.0.1", + port: 1, + expected: "127.0.0.1:1", + }, { + name: "ipv6", + addr: "::1", + expected: "[::1]:0", + }, { + name: "ipv6+port", + addr: "::1", + port: 1, + expected: "[::1]:1", + }} + + for _, tc := range testcases { + t.Run(tc.name, func(t *testing.T) { + cfg := GRPCConfig{ + Address: tc.addr, + Port: tc.port, + } + assert.Equal(t, tc.expected, cfg.String()) + }) + } +} diff --git a/pkg/component/runtime/manager.go b/pkg/component/runtime/manager.go index 5ee8b5b4681..623d0e58df1 100644 --- a/pkg/component/runtime/manager.go +++ b/pkg/component/runtime/manager.go @@ -14,6 +14,7 @@ import ( "net" "net/url" "path" + "strconv" "strings" "sync" "time" @@ -988,9 +989,9 @@ func (m *Manager) getListenAddr() string { if m.isLocal { return m.listenAddr } - addr := strings.SplitN(m.listenAddr, ":", 2) - if len(addr) == 2 && addr[1] == "0" { - return fmt.Sprintf("%s:%d", addr[0], m.listenPort) + host, port, err := net.SplitHostPort(m.listenAddr) + if err == nil && port == "0" { + return net.JoinHostPort(host, strconv.Itoa(m.listenPort)) } return m.listenAddr }