Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions control-plane/consul/consul.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import (
"net/http"
"time"

"github.com/hashicorp/consul-k8s/control-plane/version"
"github.com/hashicorp/consul-server-connection-manager/discovery"
capi "github.com/hashicorp/consul/api"

"github.com/hashicorp/consul-k8s/control-plane/version"
)

//go:generate mockery --name ServerConnectionManager --inpkg
Expand All @@ -20,7 +21,7 @@ type ServerConnectionManager interface {
Stop()
}

// NewClient returns a Consul API client. It adds a required User-Agent
// NewClient returns a V1 Consul API client. It adds a required User-Agent
// header that describes the version of consul-k8s making the call.
func NewClient(config *capi.Config, consulAPITimeout time.Duration) (*capi.Client, error) {
if consulAPITimeout <= 0 {
Expand Down Expand Up @@ -69,7 +70,7 @@ type Config struct {
}

// todo (ishustava): replace all usages of this one.
// NewClientFromConnMgrState creates a new API client with an IP address from the state
// NewClientFromConnMgrState creates a new V1 API client with an IP address from the state
// of the consul-server-connection-manager.
func NewClientFromConnMgrState(config *Config, state discovery.State) (*capi.Client, error) {
ipAddress := state.Address.IP
Expand All @@ -80,7 +81,7 @@ func NewClientFromConnMgrState(config *Config, state discovery.State) (*capi.Cli
return NewClient(config.APIClientConfig, config.APITimeout)
}

// NewClientFromConnMgr creates a new API client by first getting the state of the passed watcher.
// NewClientFromConnMgr creates a new V1 API client by first getting the state of the passed watcher.
func NewClientFromConnMgr(config *Config, watcher ServerConnectionManager) (*capi.Client, error) {
// Create a new consul client.
serverState, err := watcher.State()
Expand Down
40 changes: 40 additions & 0 deletions control-plane/consul/resource_client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package consul

import (
"context"
"fmt"

"github.com/hashicorp/consul-server-connection-manager/discovery"
"github.com/hashicorp/consul/proto-public/pbresource"
"github.com/hashicorp/go-hclog"
)

// NewResourceServiceClient creates a pbresource.ResourceServiceClient for creating V2 Consul resources.
// It is initialized with a consul-server-connection-manager discovery config to continuously find Consul
// server addresses.
// The caller should make sure to Stop() the returned `watcher` (preferably with a `defer`) to clean up the gRPC
// connection and the discovery client.
// The caller can also set `config.ServerWatchDisabled=false` to prevent subscribing to Consul server address
// changes, as is the case with single-shot operations.
func NewResourceServiceClient(ctx context.Context, config discovery.Config, logger hclog.Logger, hack int) (pbresource.ResourceServiceClient, *discovery.Watcher, error) {

watcher, err := discovery.NewWatcher(ctx, config, logger.Named("consul-server-connection-manager"))
if err != nil {
return nil, nil, fmt.Errorf("unable to create Consul server watcher: %w", err)
}

go watcher.Run()

// We recycle the GRPC connection from the discovery client because it
// should have all the necessary dial options, including the resolver that
// continuously updates Consul server addresses. Otherwise, a lot of code from consul-server-connection-manager
// would need to be duplicated
state, err := watcher.State()
if err != nil {
watcher.Stop()
return nil, nil, fmt.Errorf("unable to get connection manager state: %w", err)
}
resourceClient := pbresource.NewResourceServiceClient(state.GRPCConn)

return resourceClient, watcher, nil
}
102 changes: 102 additions & 0 deletions control-plane/consul/resource_client_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package consul

import (
"context"
"testing"

"github.com/hashicorp/consul-server-connection-manager/discovery"
pbcatalog "github.com/hashicorp/consul/proto-public/pbcatalog/v1alpha1"
"github.com/hashicorp/consul/proto-public/pbresource"
"github.com/hashicorp/consul/sdk/testutil"
"github.com/hashicorp/go-hclog"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/anypb"
)

func Test_NewResourceServiceClient(t *testing.T) {

var serverConfig *testutil.TestServerConfig
server, err := testutil.NewTestServerConfigT(t, func(c *testutil.TestServerConfig) {
c.Experiments = []string{"resource-apis"}
serverConfig = c
})
require.NoError(t, err)
defer server.Stop()

server.WaitForLeader(t)
server.WaitForActiveCARoot(t)

t.Logf("server grpc address on %d", serverConfig.Ports.GRPC)

// Create discovery configuration
discoverConfig := discovery.Config{
Addresses: "127.0.0.1",
GRPCPort: serverConfig.Ports.GRPC,
}

opts := hclog.LoggerOptions{Name: "resource-service-client"}
logger := hclog.New(&opts)
client, watcher, err := NewResourceServiceClient(context.Background(), discoverConfig, logger, serverConfig.Ports.GRPCTLS)
require.NoError(t, err)
require.NotNil(t, client)
require.NotNil(t, watcher)

defer watcher.Stop()

req := createWriteRequest(t, "foo")
res, err := client.Write(context.Background(), req)
require.NoError(t, err)
require.NotNil(t, res)
require.Equal(t, "foo", res.GetResource().GetId().GetName())

// NOTE: currently it isn't possible to test that the grpc connection responds to changes in the
// discovery server. The discovery response only includes the IP address of the host, so all servers
// for a local test are de-duplicated as a single entry.
}

func createWriteRequest(t *testing.T, name string) *pbresource.WriteRequest {

workload := &pbcatalog.Workload{
Addresses: []*pbcatalog.WorkloadAddress{
{Host: "10.0.0.1", Ports: []string{"public", "admin", "mesh"}},
},
Ports: map[string]*pbcatalog.WorkloadPort{
"public": {
Port: 80,
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
},
"admin": {
Port: 8080,
Protocol: pbcatalog.Protocol_PROTOCOL_TCP,
},
"mesh": {
Port: 20000,
Protocol: pbcatalog.Protocol_PROTOCOL_MESH,
},
},
NodeName: "k8s-node-0-virtual",
Identity: name,
}

proto, err := anypb.New(workload)
require.NoError(t, err)

req := &pbresource.WriteRequest{
Resource: &pbresource.Resource{
Id: &pbresource.ID{
Name: name,
Type: &pbresource.Type{
Group: "catalog",
GroupVersion: "v1alpha1",
Kind: "Workload",
},
Tenancy: &pbresource.Tenancy{
Partition: "default",
Namespace: "default",
},
},
Data: proto,
},
}
return req
}
34 changes: 22 additions & 12 deletions control-plane/go.mod
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
module github.com/hashicorp/consul-k8s/control-plane

// TODO(dans)
// This points to a commit on a dev branch. The replace directive should be removed when the SDK is published
// Even after this commit goes into main, the replace directive is needed be because `api` requires 0.14.1 of SDK
replace github.com/hashicorp/consul/sdk v0.14.1 => github.com/hashicorp/consul/sdk v0.4.1-0.20230821222840-992198e5f8c7

require (
github.com/cenkalti/backoff v2.2.1+incompatible
github.com/containernetworking/cni v1.1.1
Expand All @@ -8,9 +13,8 @@ require (
github.com/go-logr/logr v1.2.3
github.com/google/go-cmp v0.5.9
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
github.com/hashicorp/consul-k8s/control-plane/cni v0.0.0-20230511143918-bd16ab83383d
github.com/hashicorp/consul-server-connection-manager v0.1.3
github.com/hashicorp/consul/api v1.10.1-0.20230821180813-217d305b38d5
github.com/hashicorp/consul/proto-public v0.1.2-0.20230821180813-217d305b38d5 // this points to a commit on Consul main
github.com/hashicorp/consul/sdk v0.14.1
github.com/hashicorp/go-bexpr v0.1.11
github.com/hashicorp/go-discover v0.0.0-20230519164032-214571b6a530
Expand Down Expand Up @@ -43,7 +47,14 @@ require (
)

require (
cloud.google.com/go v0.65.0 // indirect
github.com/hashicorp/consul-k8s/control-plane/cni v0.0.0-20230821203006-4c95f8ff8d20
github.com/hashicorp/consul-server-connection-manager v0.1.4
google.golang.org/protobuf v1.30.0
)

require (
cloud.google.com/go/compute v1.19.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
github.com/Azure/azure-sdk-for-go v44.0.0+incompatible // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
github.com/Azure/go-autorest/autorest v0.11.18 // indirect
Expand All @@ -62,7 +73,7 @@ require (
github.com/bgentry/speakeasy v0.1.0 // indirect
github.com/cenkalti/backoff/v3 v3.0.0 // indirect
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/denverdino/aliyungo v0.0.0-20170926055100-d3308649c661 // indirect
github.com/digitalocean/godo v1.7.5 // indirect
Expand All @@ -84,9 +95,9 @@ require (
github.com/google/go-querystring v0.0.0-20170111101155-53e6ce116135 // indirect
github.com/google/gofuzz v1.1.0 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/gax-go/v2 v2.0.5 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
github.com/googleapis/gax-go/v2 v2.7.1 // indirect
github.com/gophercloud/gophercloud v0.1.0 // indirect
github.com/hashicorp/consul/proto-public v0.1.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
Expand Down Expand Up @@ -140,22 +151,21 @@ require (
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.480 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.480 // indirect
github.com/vmware/govmomi v0.18.0 // indirect
go.opencensus.io v0.22.4 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.11.0 // indirect
golang.org/x/mod v0.9.0 // indirect
golang.org/x/net v0.13.0 // indirect
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
golang.org/x/oauth2 v0.6.0 // indirect
golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/term v0.10.0 // indirect
golang.org/x/tools v0.7.0 // indirect
google.golang.org/api v0.30.0 // indirect
google.golang.org/api v0.114.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect
google.golang.org/grpc v1.49.0 // indirect
google.golang.org/protobuf v1.28.1 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.55.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/resty.v1 v1.12.0 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
Expand Down
Loading