Skip to content

Commit

Permalink
Enable terminating gateway policy to be generated via Auth Method
Browse files Browse the repository at this point in the history
  • Loading branch information
jmurret committed Mar 17, 2022
1 parent 32d513d commit 6acf329
Show file tree
Hide file tree
Showing 7 changed files with 323 additions and 160 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ func updateTerminatingGatewayToken(t *testing.T, consulClient *api.Client, rules
require.NoError(t, err)
var termGwTokenID string
for _, token := range tokens {
if strings.Contains(token.Description, "terminating-gateway-terminating-gateway-token") {
if strings.Contains(token.Description, "token created via login: {\"component\":\"terminating-gateway\"}") {
termGwTokenID = token.AccessorID
break
}
Expand Down
6 changes: 5 additions & 1 deletion charts/consul/templates/mesh-gateway-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,11 @@ spec:
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-ec", "/consul-bin/consul services deregister -id=\"{{ .Values.meshGateway.consulServiceName }}\"", "&&", "/bin/sh", "-ec", "/consul-bin/consul logout"]
command:
- "/bin/sh"
- "-ec"
- "/consul-bin/consul services deregister -id=\"{{ .Values.meshGateway.consulServiceName }}\""
- "/consul-bin/consul logout"

# consul-sidecar ensures the mesh gateway is always registered with
# the local Consul agent, even if it loses the initial registration.
Expand Down
31 changes: 20 additions & 11 deletions charts/consul/templates/terminating-gateways-deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@ spec:
{{- if (and $root.Values.global.tls.enabled $root.Values.global.tls.enableAutoEncrypt) }}
{{- include "consul.getAutoEncryptClientCA" $root | nindent 8 }}
{{- end }}
# service-init registers the terminating gateway service.
- name: service-init
# terminating-gateway-init registers the terminating gateway service with Consul.
- name: terminating-gateway-init
image: {{ $root.Values.global.imageK8S }}
env:
- name: HOST_IP
Expand Down Expand Up @@ -185,9 +185,14 @@ spec:
- |
{{- if $root.Values.global.acls.manageSystemACLs }}
consul-k8s-control-plane acl-init \
-secret-name="{{ template "consul.fullname" $root }}-{{ .name }}-terminating-gateway-acl-token" \
-k8s-namespace={{ $root.Release.Namespace }} \
-token-sink-file=/consul/service/acl-token
-component-name=terminating-gateway \
-acl-auth-method={{ template "consul.fullname" $root }}-k8s-component-auth-method \
{{- if $root.Values.global.adminPartitions.enabled }}
-partition={{ $root.Values.global.adminPartitions.name }} \
{{- end }}
-token-sink-file=/consul/service/acl-token \
-log-level={{ default $root.Values.global.logLevel }} \
-log-json={{ $root.Values.global.logJSON }}
{{- end }}
cat > /consul/service/service.hcl << EOF
Expand Down Expand Up @@ -252,6 +257,9 @@ spec:
volumeMounts:
- name: consul-bin
mountPath: /consul-bin
- mountPath: /consul/service
name: consul-service
readOnly: true
{{- if $root.Values.global.tls.enabled }}
{{- if $root.Values.global.tls.enableAutoEncrypt }}
- name: consul-auto-encrypt-ca-cert
Expand Down Expand Up @@ -280,12 +288,9 @@ spec:
fieldRef:
fieldPath: metadata.name
{{- if $root.Values.global.acls.manageSystemACLs }}
- name: CONSUL_HTTP_TOKEN
valueFrom:
secretKeyRef:
name: "{{ template "consul.fullname" $root }}-{{ .name }}-terminating-gateway-acl-token"
key: "token"
{{- end}}
- name: CONSUL_HTTP_TOKEN_FILE
value: "/consul/service/acl-token"
{{- end }}
{{- if $root.Values.global.tls.enabled }}
- name: CONSUL_HTTP_ADDR
value: https://$(HOST_IP):8501
Expand Down Expand Up @@ -345,6 +350,10 @@ spec:
-partition={{ $root.Values.global.adminPartitions.name }} \
{{- end }}
-id="${POD_NAME}"
{{- if $root.Values.global.acls.manageSystemACLs }}
- |
"/consul-bin/consul logout"
{{- end}}

# consul-sidecar ensures the terminating gateway is always registered with
# the local Consul agent, even if it loses the initial registration.
Expand Down
142 changes: 126 additions & 16 deletions charts/consul/test/unit/terminating-gateways-deployment.bats
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,29 @@ load _helpers
[ "${actual}" = "RELEASE-NAME-consul-terminating-gateway" ]
}

@test "terminatingGateways/Deployment: Adds consul service volumeMount to gateway container" {
cd `chart_dir`
local object=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | yq '.spec.template.spec.containers[0].volumeMounts[1]' | tee /dev/stderr)

local actual=$(echo $object |
yq -r '.name' | tee /dev/stderr)
[ "${actual}" = "consul-service" ]

local actual=$(echo $object |
yq -r '.mountPath' | tee /dev/stderr)
[ "${actual}" = "/consul/service" ]

local actual=$(echo $object |
yq -r '.readOnly' | tee /dev/stderr)
[ "${actual}" = "true" ]
}

#--------------------------------------------------------------------
# prerequisites

Expand Down Expand Up @@ -234,27 +257,112 @@ load _helpers
#--------------------------------------------------------------------
# global.acls.manageSystemACLs

@test "terminatingGateways/Deployment: CONSUL_HTTP_TOKEN env variable created when global.acls.manageSystemACLs=true" {
@test "terminatingGateways/Deployment: consul-sidecar uses -token-file flag when global.acls.manageSystemACLs=true" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq -s '[.[0].spec.template.spec.containers[0].env[].name] | any(contains("CONSUL_HTTP_TOKEN"))' | tee /dev/stderr)
yq -s '.[0].spec.template.spec.containers[1].command | any(contains("-token-file=/consul/service/acl-token"))' | tee /dev/stderr)
[ "${actual}" = "true" ]
}

@test "terminatingGateways/Deployment: consul-sidecar uses -token-file flag when global.acls.manageSystemACLs=true" {
@test "terminatingGateways/Deployment: Adds consul envvars CONSUL_HTTP_ADDR on terminating-gateway-init init container when ACLs are enabled and tls is enabled" {
cd `chart_dir`
local env=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
--set 'global.tls.enabled=true' \
. | tee /dev/stderr |
yq -r '.spec.template.spec.initContainers[1].env[]' | tee /dev/stderr)

local actual
actual=$(echo $env | jq -r '. | select(.name == "CONSUL_HTTP_ADDR") | .value' | tee /dev/stderr)
[ "${actual}" = "https://\$(HOST_IP):8501" ]
}

@test "terminatingGateways/Deployment: Adds consul envvars CONSUL_HTTP_ADDR on terminating-gateway-init init container when ACLs are enabled and tls is not enabled" {
cd `chart_dir`
local env=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'connectInject.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq -r '.spec.template.spec.initContainers[1].env[]' | tee /dev/stderr)

local actual
actual=$(echo $env | jq -r '. | select(.name == "CONSUL_HTTP_ADDR") | .value' | tee /dev/stderr)
[ "${actual}" = "http://\$(HOST_IP):8500" ]
}

@test "terminatingGateways/Deployment: Does not add consul envvars CONSUL_CACERT on terminating-gateway-init init container when ACLs are enabled and tls is not enabled" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq '.spec.template.spec.initContainers[1].env[] | select(.name == "CONSUL_CACERT")' | tee /dev/stderr)

[ "${actual}" = "" ]
}

@test "terminatingGateways/Deployment: Adds consul envvars CONSUL_CACERT on terminating-gateway-init init container when ACLs are enabled and tls is enabled" {
cd `chart_dir`
local env=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
--set 'global.tls.enabled=true' \
. | tee /dev/stderr |
yq -s '.[0].spec.template.spec.containers[1].command | any(contains("-token-file=/consul/service/acl-token"))' | tee /dev/stderr)
yq -r '.spec.template.spec.initContainers[1].env[]' | tee /dev/stderr)

local actual=$(echo $env | jq -r '. | select(.name == "CONSUL_CACERT") | .value' | tee /dev/stderr)
[ "${actual}" = "/consul/tls/ca/tls.crt" ]
}

@test "terminatingGateways/Deployment: CONSUL_HTTP_TOKEN_FILE is not set when acls are disabled" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=false' \
. | tee /dev/stderr |
yq '[.spec.template.spec.containers[0].env[0].name] | any(contains("CONSUL_HTTP_TOKEN_FILE"))' | tee /dev/stderr)
[ "${actual}" = "false" ]
}

@test "terminatingGateways/Deployment: CONSUL_HTTP_TOKEN_FILE is set when acls are enabled" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq -s '[.[0].spec.template.spec.containers[0].env[].name] | any(contains("CONSUL_HTTP_TOKEN_FILE"))' | tee /dev/stderr)
[ "${actual}" = "true" ]
}

@test "terminatingGateways/Deployment: consul-logout preStop hook is added when ACLs are enabled" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'terminatingGateways.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq '[.spec.template.spec.containers[0].lifecycle.preStop.exec.command[3]] | any(contains("consul-k8s-control-plane consul-logout"))' | tee /dev/stderr)
[ "${actual}" = "true" ]
}

Expand Down Expand Up @@ -1005,16 +1113,16 @@ key2: value2' \
}

#--------------------------------------------------------------------
# service-init init container command
# terminating-gateway-init init container command

@test "terminatingGateways/Deployment: service-init init container defaults" {
@test "terminatingGateways/Deployment: terminating-gateway-init init container defaults" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
. | tee /dev/stderr |
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "service-init"))[0] | .command[2]' | tee /dev/stderr)
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "terminating-gateway-init"))[0] | .command[2]' | tee /dev/stderr)

exp='
cat > /consul/service/service.hcl << EOF
Expand All @@ -1041,20 +1149,22 @@ EOF
[ "${actual}" = "${exp}" ]
}

@test "terminatingGateways/Deployment: service-init init container with acls.manageSystemACLs=true" {
@test "terminatingGateways/Deployment: terminating-gateway-init init container with acls.manageSystemACLs=true" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
--set 'terminatingGateways.enabled=true' \
--set 'connectInject.enabled=true' \
--set 'global.acls.manageSystemACLs=true' \
. | tee /dev/stderr |
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "service-init"))[0] | .command[2]' | tee /dev/stderr)
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "terminating-gateway-init"))[0] | .command[2]' | tee /dev/stderr)

exp='consul-k8s-control-plane acl-init \
-secret-name="RELEASE-NAME-consul-terminating-gateway-terminating-gateway-acl-token" \
-k8s-namespace=default \
-token-sink-file=/consul/service/acl-token
-component-name=terminating-gateway \
-acl-auth-method=RELEASE-NAME-consul-k8s-component-auth-method \
-token-sink-file=/consul/service/acl-token \
-log-level=info \
-log-json=false
cat > /consul/service/service.hcl << EOF
service {
Expand All @@ -1081,7 +1191,7 @@ EOF
[ "${actual}" = "${exp}" ]
}

@test "terminatingGateways/Deployment: service-init init container gateway namespace can be specified through defaults" {
@test "terminatingGateways/Deployment: terminating-gateway-init init container gateway namespace can be specified through defaults" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
Expand All @@ -1090,7 +1200,7 @@ EOF
--set 'global.enableConsulNamespaces=true' \
--set 'terminatingGateways.defaults.consulNamespace=namespace' \
. | tee /dev/stderr |
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "service-init"))[0] | .command[2]' | tee /dev/stderr)
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "terminating-gateway-init"))[0] | .command[2]' | tee /dev/stderr)

exp='
cat > /consul/service/service.hcl << EOF
Expand Down Expand Up @@ -1118,7 +1228,7 @@ EOF
[ "${actual}" = "${exp}" ]
}

@test "terminatingGateways/Deployment: service-init init container gateway namespace can be specified through specific gateway overriding defaults" {
@test "terminatingGateways/Deployment: terminating-gateway-init init container gateway namespace can be specified through specific gateway overriding defaults" {
cd `chart_dir`
local actual=$(helm template \
-s templates/terminating-gateways-deployment.yaml \
Expand All @@ -1129,7 +1239,7 @@ EOF
--set 'terminatingGateways.gateways[0].name=terminating-gateway' \
--set 'terminatingGateways.gateways[0].consulNamespace=new-namespace' \
. | tee /dev/stderr |
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "service-init"))[0] | .command[2]' | tee /dev/stderr)
yq -s -r '.[0].spec.template.spec.initContainers | map(select(.name == "terminating-gateway-init"))[0] | .command[2]' | tee /dev/stderr)

exp='
cat > /consul/service/service.hcl << EOF
Expand Down
Loading

0 comments on commit 6acf329

Please sign in to comment.