2023-03-28 22:48:58 +00:00
|
|
|
// Copyright (c) HashiCorp, Inc.
|
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
2023-01-11 21:34:27 +00:00
|
|
|
package cluster
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
2023-05-31 17:18:00 +00:00
|
|
|
"io"
|
2023-01-11 21:34:27 +00:00
|
|
|
|
|
|
|
"github.com/testcontainers/testcontainers-go"
|
2023-06-16 20:29:50 +00:00
|
|
|
"google.golang.org/grpc"
|
2023-01-11 21:34:27 +00:00
|
|
|
|
2023-01-20 22:02:44 +00:00
|
|
|
"github.com/hashicorp/consul/api"
|
|
|
|
|
2023-01-11 21:34:27 +00:00
|
|
|
"github.com/hashicorp/consul/test/integration/consul-container/libs/utils"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Agent represent a Consul agent abstraction
|
|
|
|
type Agent interface {
|
|
|
|
GetIP() string
|
|
|
|
GetClient() *api.Client
|
2023-02-07 19:13:19 +00:00
|
|
|
NewClient(string, bool) (*api.Client, error)
|
2023-01-11 21:34:27 +00:00
|
|
|
GetName() string
|
2023-02-07 19:13:19 +00:00
|
|
|
GetAgentName() string
|
2023-03-06 18:28:02 +00:00
|
|
|
GetPartition() string
|
2023-01-11 21:34:27 +00:00
|
|
|
GetPod() testcontainers.Container
|
2023-05-31 17:18:00 +00:00
|
|
|
Logs(context.Context) (io.ReadCloser, error)
|
2023-01-27 15:19:10 +00:00
|
|
|
ClaimAdminPort() (int, error)
|
2023-01-11 21:34:27 +00:00
|
|
|
GetConfig() Config
|
|
|
|
GetInfo() AgentInfo
|
|
|
|
GetDatacenter() string
|
2023-02-24 20:57:44 +00:00
|
|
|
GetNetwork() string
|
2023-01-11 21:34:27 +00:00
|
|
|
IsServer() bool
|
|
|
|
RegisterTermination(func() error)
|
|
|
|
Terminate() error
|
2023-01-30 14:49:52 +00:00
|
|
|
TerminateAndRetainPod(bool) error
|
2023-01-11 21:34:27 +00:00
|
|
|
Upgrade(ctx context.Context, config Config) error
|
2023-02-07 19:13:19 +00:00
|
|
|
Exec(ctx context.Context, cmd []string) (string, error)
|
2023-01-11 21:34:27 +00:00
|
|
|
DataDir() string
|
2023-06-16 20:29:50 +00:00
|
|
|
GetGRPCConn() *grpc.ClientConn
|
2023-01-11 21:34:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Config is a set of configurations required to create a Agent
|
|
|
|
//
|
|
|
|
// Constructed by (Builder).ToAgentConfig()
|
|
|
|
type Config struct {
|
2023-04-12 22:00:56 +00:00
|
|
|
// NodeName is set for the consul agent name and container name
|
|
|
|
// Equivalent to the -node command-line flag.
|
|
|
|
// If empty, a randam name will be generated
|
|
|
|
NodeName string
|
|
|
|
// NodeID is used to configure node_id in agent config file
|
|
|
|
// Equivalent to the -node-id command-line flag.
|
|
|
|
// If empty, a randam name will be generated
|
|
|
|
NodeID string
|
|
|
|
|
|
|
|
// ExternalDataDir is data directory to copy consul data from, if set.
|
|
|
|
// This directory contains subdirectories like raft, serf, services
|
|
|
|
ExternalDataDir string
|
|
|
|
|
2023-01-11 21:34:27 +00:00
|
|
|
ScratchDir string
|
|
|
|
CertVolume string
|
|
|
|
CACert string
|
|
|
|
JSON string
|
|
|
|
ConfigBuilder *ConfigBuilder
|
|
|
|
Image string
|
|
|
|
Version string
|
|
|
|
Cmd []string
|
2023-01-19 15:43:33 +00:00
|
|
|
LogConsumer testcontainers.LogConsumer
|
2023-01-11 21:34:27 +00:00
|
|
|
|
|
|
|
// service defaults
|
|
|
|
UseAPIWithTLS bool // TODO
|
|
|
|
UseGRPCWithTLS bool
|
2023-02-07 19:13:19 +00:00
|
|
|
|
|
|
|
ACLEnabled bool
|
2023-01-11 21:34:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *Config) DockerImage() string {
|
|
|
|
return utils.DockerImage(c.Image, c.Version)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Clone copies everything. It is the caller's job to replace fields that
|
|
|
|
// should be unique.
|
|
|
|
func (c Config) Clone() Config {
|
|
|
|
c2 := c
|
|
|
|
if c.Cmd != nil {
|
|
|
|
c2.Cmd = make([]string, len(c.Cmd))
|
|
|
|
for i, v := range c.Cmd {
|
|
|
|
c2.Cmd[i] = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return c2
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: refactor away
|
|
|
|
type AgentInfo struct {
|
|
|
|
CACertFile string
|
|
|
|
UseTLSForAPI bool
|
|
|
|
UseTLSForGRPC bool
|
2023-04-18 13:49:53 +00:00
|
|
|
DebugURI string
|
2023-01-11 21:34:27 +00:00
|
|
|
}
|