Skip to content

Commit

Permalink
[8.17](backport #7035) fix(ipv6): support ipv6 address in grpc config (
Browse files Browse the repository at this point in the history
…#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 <blake.rouse@elastic.co>
(cherry picked from commit 5d91620)

# 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 <blake.rouse@elastic.co>
Co-authored-by: Panos Koutsovasilis <panos.koutsovasilis@elastic.co>
  • Loading branch information
4 people authored Mar 7, 2025
1 parent 709da10 commit 7b84684
Show file tree
Hide file tree
Showing 4 changed files with 87 additions and 5 deletions.
32 changes: 32 additions & 0 deletions changelog/fragments/1740712540-support-grpc-ipv6-host.yaml
Original file line number Diff line number Diff line change
@@ -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
5 changes: 3 additions & 2 deletions internal/pkg/agent/configuration/grpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
package configuration

import (
"fmt"
"net"
"strconv"

"github.com/elastic/elastic-agent/internal/pkg/agent/application/paths"
)
Expand Down Expand Up @@ -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
Expand Down
48 changes: 48 additions & 0 deletions internal/pkg/agent/configuration/grpc_test.go
Original file line number Diff line number Diff line change
@@ -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())
})
}
}
7 changes: 4 additions & 3 deletions pkg/component/runtime/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"net"
"net/url"
"path"
"strconv"
"strings"
"sync"
"time"
Expand Down Expand Up @@ -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
}
Expand Down

0 comments on commit 7b84684

Please sign in to comment.