2022-11-01 19:03:23 +00:00
package service
import (
"context"
"fmt"
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
libcluster "github.com/hashicorp/consul/test/integration/consul-container/libs/cluster"
"github.com/hashicorp/consul/test/integration/consul-container/libs/utils"
2022-11-01 19:03:23 +00:00
)
2023-01-20 22:02:44 +00:00
const (
2023-02-13 19:09:12 +00:00
StaticServerServiceName = "static-server"
StaticServer2ServiceName = "static-server-2"
StaticClientServiceName = "static-client"
2023-01-20 22:02:44 +00:00
)
2023-02-03 15:20:22 +00:00
type ServiceOpts struct {
2023-02-09 14:45:31 +00:00
Name string
ID string
Meta map [ string ] string
HTTPPort int
GRPCPort int
2023-02-03 15:20:22 +00:00
}
func CreateAndRegisterStaticServerAndSidecar ( node libcluster . Agent , serviceOpts * ServiceOpts ) ( Service , Service , error ) {
2023-01-11 21:34:27 +00:00
// Do some trickery to ensure that partial completion is correctly torn
// down, but successful execution is not.
var deferClean utils . ResettableDefer
defer deferClean . Execute ( )
2023-01-20 22:02:44 +00:00
// Register the static-server service and sidecar first to prevent race with sidecar
// trying to get xDS before it's ready
2022-11-01 19:03:23 +00:00
req := & api . AgentServiceRegistration {
2023-02-03 15:20:22 +00:00
Name : serviceOpts . Name ,
ID : serviceOpts . ID ,
2023-02-09 14:45:31 +00:00
Port : serviceOpts . HTTPPort ,
2022-11-01 19:03:23 +00:00
Connect : & api . AgentServiceConnect {
SidecarService : & api . AgentServiceRegistration {
2023-01-11 21:34:27 +00:00
Proxy : & api . AgentServiceConnectProxyConfig { } ,
2022-11-01 19:03:23 +00:00
} ,
} ,
Check : & api . AgentServiceCheck {
2022-11-08 01:10:42 +00:00
Name : "Static Server Listening" ,
2023-02-09 14:45:31 +00:00
TCP : fmt . Sprintf ( "127.0.0.1:%d" , serviceOpts . HTTPPort ) ,
2022-11-01 19:03:23 +00:00
Interval : "10s" ,
2022-11-08 01:10:42 +00:00
Status : api . HealthPassing ,
2022-11-01 19:03:23 +00:00
} ,
2023-02-03 15:20:22 +00:00
Meta : serviceOpts . Meta ,
2022-11-01 19:03:23 +00:00
}
2023-01-20 22:02:44 +00:00
if err := node . GetClient ( ) . Agent ( ) . ServiceRegister ( req ) ; err != nil {
return nil , nil , err
}
// Create a service and proxy instance
2023-02-09 14:45:31 +00:00
serverService , err := NewExampleService ( context . Background ( ) , serviceOpts . ID , serviceOpts . HTTPPort , serviceOpts . GRPCPort , node )
2022-11-01 19:03:23 +00:00
if err != nil {
2023-01-20 22:02:44 +00:00
return nil , nil , err
2022-11-01 19:03:23 +00:00
}
2023-01-20 22:02:44 +00:00
deferClean . Add ( func ( ) {
_ = serverService . Terminate ( )
} )
2023-02-13 19:09:12 +00:00
serverConnectProxy , err := NewConnectService ( context . Background ( ) , fmt . Sprintf ( "%s-sidecar" , serviceOpts . ID ) , serviceOpts . ID , serviceOpts . HTTPPort , node ) // bindPort not used
2023-01-20 22:02:44 +00:00
if err != nil {
return nil , nil , err
}
deferClean . Add ( func ( ) {
_ = serverConnectProxy . Terminate ( )
} )
2022-11-01 19:03:23 +00:00
2023-01-11 21:34:27 +00:00
// disable cleanup functions now that we have an object with a Terminate() function
deferClean . Reset ( )
2022-11-01 19:03:23 +00:00
return serverService , serverConnectProxy , nil
}
2023-01-11 21:34:27 +00:00
func CreateAndRegisterStaticClientSidecar (
node libcluster . Agent ,
peerName string ,
localMeshGateway bool ,
) ( * ConnectContainer , error ) {
// Do some trickery to ensure that partial completion is correctly torn
// down, but successful execution is not.
var deferClean utils . ResettableDefer
defer deferClean . Execute ( )
2022-11-01 19:03:23 +00:00
mgwMode := api . MeshGatewayModeRemote
if localMeshGateway {
mgwMode = api . MeshGatewayModeLocal
}
2023-01-20 22:02:44 +00:00
// Register the static-client service and sidecar first to prevent race with sidecar
// trying to get xDS before it's ready
2022-11-01 19:03:23 +00:00
req := & api . AgentServiceRegistration {
2023-01-20 22:02:44 +00:00
Name : StaticClientServiceName ,
2022-11-01 19:03:23 +00:00
Port : 8080 ,
Connect : & api . AgentServiceConnect {
SidecarService : & api . AgentServiceRegistration {
Proxy : & api . AgentServiceConnectProxyConfig {
2023-01-11 21:34:27 +00:00
Upstreams : [ ] api . Upstream { {
2023-01-20 22:02:44 +00:00
DestinationName : StaticServerServiceName ,
2023-01-11 21:34:27 +00:00
DestinationPeer : peerName ,
LocalBindAddress : "0.0.0.0" ,
2023-01-27 15:19:10 +00:00
LocalBindPort : libcluster . ServiceUpstreamLocalBindPort ,
2023-01-11 21:34:27 +00:00
MeshGateway : api . MeshGatewayConfig {
Mode : mgwMode ,
2022-11-01 19:03:23 +00:00
} ,
2023-01-11 21:34:27 +00:00
} } ,
2022-11-01 19:03:23 +00:00
} ,
} ,
} ,
}
2023-01-20 22:02:44 +00:00
if err := node . GetClient ( ) . Agent ( ) . ServiceRegister ( req ) ; err != nil {
return nil , err
}
// Create a service and proxy instance
2023-01-27 15:19:10 +00:00
clientConnectProxy , err := NewConnectService ( context . Background ( ) , fmt . Sprintf ( "%s-sidecar" , StaticClientServiceName ) , StaticClientServiceName , libcluster . ServiceUpstreamLocalBindPort , node )
2022-11-01 19:03:23 +00:00
if err != nil {
2023-01-20 22:02:44 +00:00
return nil , err
2022-11-01 19:03:23 +00:00
}
2023-01-20 22:02:44 +00:00
deferClean . Add ( func ( ) {
_ = clientConnectProxy . Terminate ( )
} )
2022-11-01 19:03:23 +00:00
2023-01-11 21:34:27 +00:00
// disable cleanup functions now that we have an object with a Terminate() function
deferClean . Reset ( )
2022-11-01 19:03:23 +00:00
return clientConnectProxy , nil
}