snapshot of https://github.com/grpc/grpc-go.git (master, 2026-09-15; blobs > 131072B omitted)
Some checks failed
codecov / upload (push) Failing after 13m59s
CodeQL / Analyze (push) Failing after 1s
Testing / vet-proto (push) Failing after 1s
Testing / tests (arm, latest) (push) Waiting to run
Testing / extras (latest) (push) Failing after 1s
Testing / static checks (latest-1) (push) Failing after 1s
Testing / tests (-race, latest) (push) Failing after 1s
Testing / tests (i386, latest) (push) Failing after 1s
Testing / tests (latest) (push) Failing after 1s
Testing / tests (latest-1) (push) Failing after 1s
Lock Threads / lock (push) Failing after 1s
govulncheck / govulncheck (.) (push) Failing after 1s
govulncheck / govulncheck (./cmd/protoc-gen-go-grpc) (push) Failing after 1s
govulncheck / govulncheck (./gcp/observability) (push) Failing after 1s
govulncheck / govulncheck (./security/advancedtls) (push) Failing after 1s
govulncheck / govulncheck (./stats/opencensus) (push) Failing after 1s
Stale bot / stale (push) Failing after 1s
Some checks failed
codecov / upload (push) Failing after 13m59s
CodeQL / Analyze (push) Failing after 1s
Testing / vet-proto (push) Failing after 1s
Testing / tests (arm, latest) (push) Waiting to run
Testing / extras (latest) (push) Failing after 1s
Testing / static checks (latest-1) (push) Failing after 1s
Testing / tests (-race, latest) (push) Failing after 1s
Testing / tests (i386, latest) (push) Failing after 1s
Testing / tests (latest) (push) Failing after 1s
Testing / tests (latest-1) (push) Failing after 1s
Lock Threads / lock (push) Failing after 1s
govulncheck / govulncheck (.) (push) Failing after 1s
govulncheck / govulncheck (./cmd/protoc-gen-go-grpc) (push) Failing after 1s
govulncheck / govulncheck (./gcp/observability) (push) Failing after 1s
govulncheck / govulncheck (./security/advancedtls) (push) Failing after 1s
govulncheck / govulncheck (./stats/opencensus) (push) Failing after 1s
Stale bot / stale (push) Failing after 1s
This commit is contained in:
47
experimental/balancer/hostname/hostname.go
Normal file
47
experimental/balancer/hostname/hostname.go
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2026 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// Package hostname contains utilities for the endpoint hostname attribute
|
||||
// (used for per-endpoint :authority / SNI override).
|
||||
//
|
||||
// # Experimental
|
||||
//
|
||||
// Notice: All APIs in this package are EXPERIMENTAL and may be changed
|
||||
// or removed in a later release.
|
||||
package hostname
|
||||
|
||||
import "google.golang.org/grpc/resolver"
|
||||
|
||||
type hostnameKey struct{}
|
||||
|
||||
// Set returns a copy of the given endpoint with the hostname attribute
|
||||
// set. If hostname is empty the endpoint is returned unmodified.
|
||||
func Set(endpoint resolver.Endpoint, hostname string) resolver.Endpoint {
|
||||
if hostname == "" {
|
||||
return endpoint
|
||||
}
|
||||
endpoint.Attributes = endpoint.Attributes.WithValue(hostnameKey{}, hostname)
|
||||
return endpoint
|
||||
}
|
||||
|
||||
// FromEndpoint returns the hostname attribute of endpoint. If this
|
||||
// attribute is not set, it returns the empty string.
|
||||
func FromEndpoint(endpoint resolver.Endpoint) string {
|
||||
h, _ := endpoint.Attributes.Value(hostnameKey{}).(string)
|
||||
return h
|
||||
}
|
||||
75
experimental/balancer/hostname/hostname_test.go
Normal file
75
experimental/balancer/hostname/hostname_test.go
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2026 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package hostname_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"google.golang.org/grpc/attributes"
|
||||
"google.golang.org/grpc/experimental/balancer/hostname"
|
||||
"google.golang.org/grpc/internal/grpctest"
|
||||
"google.golang.org/grpc/resolver"
|
||||
)
|
||||
|
||||
type s struct {
|
||||
grpctest.Tester
|
||||
}
|
||||
|
||||
func Test(t *testing.T) {
|
||||
grpctest.RunSubTests(t, s{})
|
||||
}
|
||||
|
||||
func (s) TestHostnameToAndFromEndpoint(t *testing.T) {
|
||||
tests := []struct {
|
||||
desc string
|
||||
inputHostname string
|
||||
inputAttributes *attributes.Attributes
|
||||
wantHostname string
|
||||
}{
|
||||
{
|
||||
desc: "empty_attributes",
|
||||
inputHostname: "myservice.example.com",
|
||||
wantHostname: "myservice.example.com",
|
||||
},
|
||||
{
|
||||
desc: "non-empty_attributes",
|
||||
inputHostname: "myservice.example.com",
|
||||
inputAttributes: attributes.New("foo", "bar"),
|
||||
wantHostname: "myservice.example.com",
|
||||
},
|
||||
{
|
||||
desc: "hostname_not_present_in_empty_attributes",
|
||||
},
|
||||
{
|
||||
desc: "hostname_not_present_in_non-empty_attributes",
|
||||
inputAttributes: attributes.New("foo", "bar"),
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
endpoint := resolver.Endpoint{Attributes: test.inputAttributes}
|
||||
endpoint = hostname.Set(endpoint, test.inputHostname)
|
||||
gotHostname := hostname.FromEndpoint(endpoint)
|
||||
if gotHostname != test.wantHostname {
|
||||
t.Errorf("hostname.FromEndpoint(%+v) = %q, want %q", endpoint, gotHostname, test.wantHostname)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
60
experimental/balancer/weight/weight.go
Normal file
60
experimental/balancer/weight/weight.go
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2025 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// Package weight contains utilities to manage endpoint weights.
|
||||
// Weights may be used by LB policies to distribute load across
|
||||
// multiple endpoints.
|
||||
//
|
||||
// # Experimental
|
||||
//
|
||||
// Notice: All APIs in this package are EXPERIMENTAL and may be changed
|
||||
// or removed in a later release.
|
||||
package weight
|
||||
|
||||
import "google.golang.org/grpc/resolver"
|
||||
|
||||
// attributeKey is the type used as the key to store EndpointInfo in the
|
||||
// Attributes field of resolver.Endpoint.
|
||||
type attributeKey struct{}
|
||||
|
||||
// EndpointInfo will be stored in the Attributes field of Endpoints.
|
||||
type EndpointInfo struct {
|
||||
Weight uint32
|
||||
}
|
||||
|
||||
// Equal allows the values to be compared by Attributes.Equal.
|
||||
func (a EndpointInfo) Equal(o any) bool {
|
||||
oa, ok := o.(EndpointInfo)
|
||||
return ok && oa.Weight == a.Weight
|
||||
}
|
||||
|
||||
// Set returns a copy of endpoint in which the Attributes field is
|
||||
// updated with EndpointInfo.
|
||||
func Set(endpoint resolver.Endpoint, epInfo EndpointInfo) resolver.Endpoint {
|
||||
endpoint.Attributes = endpoint.Attributes.WithValue(attributeKey{}, epInfo)
|
||||
return endpoint
|
||||
}
|
||||
|
||||
// FromEndpoint returns the EndpointInfo stored in the Attributes
|
||||
// field of an endpoint. It returns an empty EndpointInfo if attribute
|
||||
// is not found.
|
||||
func FromEndpoint(endpoint resolver.Endpoint) EndpointInfo {
|
||||
v := endpoint.Attributes.Value(attributeKey{})
|
||||
ei, _ := v.(EndpointInfo)
|
||||
return ei
|
||||
}
|
||||
83
experimental/balancer/weight/weight_test.go
Normal file
83
experimental/balancer/weight/weight_test.go
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
*
|
||||
* Copyright 2025 gRPC authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package weight_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"google.golang.org/grpc/attributes"
|
||||
"google.golang.org/grpc/experimental/balancer/weight"
|
||||
"google.golang.org/grpc/internal/grpctest"
|
||||
"google.golang.org/grpc/resolver"
|
||||
)
|
||||
|
||||
type s struct {
|
||||
grpctest.Tester
|
||||
}
|
||||
|
||||
func Test(t *testing.T) {
|
||||
grpctest.RunSubTests(t, s{})
|
||||
}
|
||||
|
||||
func (s) TestEndpointInfoToAndFromAttributes(t *testing.T) {
|
||||
tests := []struct {
|
||||
desc string
|
||||
inputEndpointInfo weight.EndpointInfo
|
||||
inputAttributes *attributes.Attributes
|
||||
wantEndpointInfo weight.EndpointInfo
|
||||
}{
|
||||
{
|
||||
desc: "empty_attributes",
|
||||
inputEndpointInfo: weight.EndpointInfo{Weight: 100},
|
||||
inputAttributes: nil,
|
||||
wantEndpointInfo: weight.EndpointInfo{Weight: 100},
|
||||
},
|
||||
{
|
||||
desc: "non-empty_attributes",
|
||||
inputEndpointInfo: weight.EndpointInfo{Weight: 100},
|
||||
inputAttributes: attributes.New("foo", "bar"),
|
||||
wantEndpointInfo: weight.EndpointInfo{Weight: 100},
|
||||
},
|
||||
{
|
||||
desc: "endpointInfo_not_present_in_empty_attributes",
|
||||
inputEndpointInfo: weight.EndpointInfo{},
|
||||
inputAttributes: nil,
|
||||
wantEndpointInfo: weight.EndpointInfo{},
|
||||
},
|
||||
{
|
||||
desc: "endpointInfo_not_present_in_non-empty_attributes",
|
||||
inputEndpointInfo: weight.EndpointInfo{},
|
||||
inputAttributes: attributes.New("foo", "bar"),
|
||||
wantEndpointInfo: weight.EndpointInfo{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
endpoint := resolver.Endpoint{Attributes: test.inputAttributes}
|
||||
endpoint = weight.Set(endpoint, test.inputEndpointInfo)
|
||||
gotEndpointInfo := weight.FromEndpoint(endpoint)
|
||||
if !cmp.Equal(gotEndpointInfo, test.wantEndpointInfo) {
|
||||
t.Errorf("gotEndpointInfo: %v, wantEndpointInfo: %v", gotEndpointInfo, test.wantEndpointInfo)
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user