Compare commits
3 Commits
pubsub-buf
...
v2.11.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d56514492b | ||
|
|
8979bfe059 | ||
|
|
ebacced232 |
2
.github/actions/setup-tf/action.yaml
vendored
2
.github/actions/setup-tf/action.yaml
vendored
@@ -7,5 +7,5 @@ runs:
|
||||
- name: Install Terraform
|
||||
uses: hashicorp/setup-terraform@v3
|
||||
with:
|
||||
terraform_version: 1.5.7
|
||||
terraform_version: 1.7.5
|
||||
terraform_wrapper: false
|
||||
|
||||
6
.github/workflows/release.yaml
vendored
6
.github/workflows/release.yaml
vendored
@@ -178,9 +178,9 @@ jobs:
|
||||
env:
|
||||
EV_SIGNING_CERT: ${{ secrets.EV_SIGNING_CERT }}
|
||||
|
||||
- name: Test migrations from current ref to main
|
||||
run: |
|
||||
make test-migrations
|
||||
# - name: Test migrations from current ref to main
|
||||
# run: |
|
||||
# make test-migrations
|
||||
|
||||
# Setup GCloud for signing Windows binaries.
|
||||
- name: Authenticate to Google Cloud
|
||||
|
||||
@@ -54,7 +54,7 @@ RUN mkdir -p /opt/terraform
|
||||
# The below step is optional if you wish to keep the existing version.
|
||||
# See https://github.com/coder/coder/blob/main/provisioner/terraform/install.go#L23-L24
|
||||
# for supported Terraform versions.
|
||||
ARG TERRAFORM_VERSION=1.5.6
|
||||
ARG TERRAFORM_VERSION=1.7.5
|
||||
RUN apk update && \
|
||||
apk del terraform && \
|
||||
curl -LOs https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip \
|
||||
|
||||
@@ -169,9 +169,9 @@ RUN apt-get update --quiet && apt-get install --yes \
|
||||
# Configure FIPS-compliant policies
|
||||
update-crypto-policies --set FIPS
|
||||
|
||||
# NOTE: In scripts/Dockerfile.base we specifically install Terraform version 1.6.6.
|
||||
# NOTE: In scripts/Dockerfile.base we specifically install Terraform version 1.7.5.
|
||||
# Installing the same version here to match.
|
||||
RUN wget -O /tmp/terraform.zip "https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_linux_amd64.zip" && \
|
||||
RUN wget -O /tmp/terraform.zip "https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip" && \
|
||||
unzip /tmp/terraform.zip -d /usr/local/bin && \
|
||||
rm -f /tmp/terraform.zip && \
|
||||
chmod +x /usr/local/bin/terraform && \
|
||||
|
||||
@@ -1485,10 +1485,17 @@ func (h *heartbeats) filter(mappings []mapping) []mapping {
|
||||
ok := m.coordinator == h.self
|
||||
if !ok {
|
||||
_, ok = h.coordinators[m.coordinator]
|
||||
if !ok {
|
||||
// If a mapping exists to a coordinator lost to heartbeats,
|
||||
// still add the mapping as LOST. If a coordinator misses
|
||||
// heartbeats but a client is still connected to it, this may be
|
||||
// the only mapping available for it. Newer mappings will take
|
||||
// precedence.
|
||||
m.kind = proto.CoordinateResponse_PeerUpdate_LOST
|
||||
}
|
||||
}
|
||||
if ok {
|
||||
out = append(out, m)
|
||||
}
|
||||
|
||||
out = append(out, m)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.uber.org/mock/gomock"
|
||||
"golang.org/x/xerrors"
|
||||
@@ -33,9 +34,9 @@ import (
|
||||
// make update-golden-files
|
||||
var UpdateGoldenFiles = flag.Bool("update", false, "update .golden files")
|
||||
|
||||
// TestHeartbeat_Cleanup is internal so that we can overwrite the cleanup period and not wait an hour for the timed
|
||||
// TestHeartbeats_Cleanup is internal so that we can overwrite the cleanup period and not wait an hour for the timed
|
||||
// cleanup.
|
||||
func TestHeartbeat_Cleanup(t *testing.T) {
|
||||
func TestHeartbeats_Cleanup(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctrl := gomock.NewController(t)
|
||||
@@ -78,6 +79,41 @@ func TestHeartbeat_Cleanup(t *testing.T) {
|
||||
close(waitForCleanup)
|
||||
}
|
||||
|
||||
func TestHeartbeats_LostCoordinator_MarkLost(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctrl := gomock.NewController(t)
|
||||
mStore := dbmock.NewMockStore(ctrl)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||
defer cancel()
|
||||
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
|
||||
|
||||
uut := &heartbeats{
|
||||
ctx: ctx,
|
||||
logger: logger,
|
||||
store: mStore,
|
||||
cleanupPeriod: time.Millisecond,
|
||||
coordinators: map[uuid.UUID]time.Time{
|
||||
uuid.New(): time.Now(),
|
||||
},
|
||||
}
|
||||
|
||||
mpngs := []mapping{{
|
||||
peer: uuid.New(),
|
||||
coordinator: uuid.New(),
|
||||
updatedAt: time.Now(),
|
||||
node: &proto.Node{},
|
||||
kind: proto.CoordinateResponse_PeerUpdate_NODE,
|
||||
}}
|
||||
|
||||
// Filter should still return the mapping without a coordinator, but marked
|
||||
// as LOST.
|
||||
got := uut.filter(mpngs)
|
||||
require.Len(t, got, 1)
|
||||
assert.Equal(t, proto.CoordinateResponse_PeerUpdate_LOST, got[0].kind)
|
||||
}
|
||||
|
||||
// TestLostPeerCleanupQueries tests that our SQL queries to clean up lost peers do what we expect,
|
||||
// that is, clean up peers and associated tunnels that have been lost for over 24 hours.
|
||||
func TestLostPeerCleanupQueries(t *testing.T) {
|
||||
|
||||
@@ -415,6 +415,52 @@ func TestPGCoordinatorSingle_MissedHeartbeats(t *testing.T) {
|
||||
assertEventuallyLost(ctx, t, store, client.id)
|
||||
}
|
||||
|
||||
func TestPGCoordinatorSingle_MissedHeartbeats_NoDrop(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !dbtestutil.WillUsePostgres() {
|
||||
t.Skip("test only with postgres")
|
||||
}
|
||||
store, ps := dbtestutil.NewDB(t)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitSuperLong)
|
||||
defer cancel()
|
||||
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
|
||||
|
||||
coordinator, err := tailnet.NewPGCoord(ctx, logger, ps, store)
|
||||
require.NoError(t, err)
|
||||
defer coordinator.Close()
|
||||
|
||||
agentID := uuid.New()
|
||||
|
||||
client := agpltest.NewPeer(ctx, t, coordinator, "client")
|
||||
defer client.Close(ctx)
|
||||
client.AddTunnel(agentID)
|
||||
|
||||
client.UpdateDERP(11)
|
||||
|
||||
// simulate a second coordinator via DB calls only --- our goal is to test
|
||||
// broken heart-beating, so we can't use a real coordinator
|
||||
fCoord2 := &fakeCoordinator{
|
||||
ctx: ctx,
|
||||
t: t,
|
||||
store: store,
|
||||
id: uuid.New(),
|
||||
}
|
||||
// simulate a single heartbeat, the coordinator is healthy
|
||||
fCoord2.heartbeat()
|
||||
|
||||
fCoord2.agentNode(agentID, &agpl.Node{PreferredDERP: 12})
|
||||
// since it's healthy the client should get the new node.
|
||||
client.AssertEventuallyHasDERP(agentID, 12)
|
||||
|
||||
// the heartbeat should then timeout and we'll get sent a LOST update, NOT a
|
||||
// disconnect.
|
||||
client.AssertEventuallyLost(agentID)
|
||||
|
||||
client.Close(ctx)
|
||||
|
||||
assertEventuallyLost(ctx, t, store, client.ID)
|
||||
}
|
||||
|
||||
func TestPGCoordinatorSingle_SendsHeartbeats(t *testing.T) {
|
||||
t.Parallel()
|
||||
if !dbtestutil.WillUsePostgres() {
|
||||
@@ -857,6 +903,16 @@ func newTestAgent(t *testing.T, coord agpl.CoordinatorV1, name string, id ...uui
|
||||
return a
|
||||
}
|
||||
|
||||
func newTestClient(t *testing.T, coord agpl.CoordinatorV1, agentID uuid.UUID, id ...uuid.UUID) *testConn {
|
||||
c := newTestConn(id)
|
||||
go func() {
|
||||
err := coord.ServeClient(c.serverWS, c.id, agentID)
|
||||
assert.NoError(t, err)
|
||||
close(c.closeChan)
|
||||
}()
|
||||
return c
|
||||
}
|
||||
|
||||
func (c *testConn) close() error {
|
||||
return c.ws.Close()
|
||||
}
|
||||
@@ -902,16 +958,6 @@ func (c *testConn) waitForClose(ctx context.Context, t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func newTestClient(t *testing.T, coord agpl.CoordinatorV1, agentID uuid.UUID, id ...uuid.UUID) *testConn {
|
||||
c := newTestConn(id)
|
||||
go func() {
|
||||
err := coord.ServeClient(c.serverWS, c.id, agentID)
|
||||
assert.NoError(t, err)
|
||||
close(c.closeChan)
|
||||
}()
|
||||
return c
|
||||
}
|
||||
|
||||
func assertEventuallyHasDERPs(ctx context.Context, t *testing.T, c *testConn, expected ...int) {
|
||||
t.Helper()
|
||||
for {
|
||||
|
||||
@@ -250,7 +250,7 @@ EOF
|
||||
main() {
|
||||
MAINLINE=1
|
||||
STABLE=0
|
||||
TERRAFORM_VERSION="1.6.6"
|
||||
TERRAFORM_VERSION="1.7.5"
|
||||
|
||||
if [ "${TRACE-}" ]; then
|
||||
set -x
|
||||
|
||||
@@ -20,10 +20,10 @@ var (
|
||||
// when Terraform is not available on the system.
|
||||
// NOTE: Keep this in sync with the version in scripts/Dockerfile.base.
|
||||
// NOTE: Keep this in sync with the version in install.sh.
|
||||
TerraformVersion = version.Must(version.NewVersion("1.6.6"))
|
||||
TerraformVersion = version.Must(version.NewVersion("1.7.5"))
|
||||
|
||||
minTerraformVersion = version.Must(version.NewVersion("1.1.0"))
|
||||
maxTerraformVersion = version.Must(version.NewVersion("1.6.9")) // use .9 to automatically allow patch releases
|
||||
maxTerraformVersion = version.Must(version.NewVersion("1.7.9")) // use .9 to automatically allow patch releases
|
||||
|
||||
terraformMinorVersionMismatch = xerrors.New("Terraform binary minor version mismatch.")
|
||||
)
|
||||
|
||||
@@ -10,7 +10,7 @@ RUN apk add --no-cache \
|
||||
curl \
|
||||
wget \
|
||||
bash \
|
||||
git \
|
||||
git=2.43.4-r0 \
|
||||
openssl \
|
||||
openssh-client && \
|
||||
addgroup \
|
||||
@@ -26,7 +26,7 @@ RUN apk add --no-cache \
|
||||
# Terraform was disabled in the edge repo due to a build issue.
|
||||
# https://gitlab.alpinelinux.org/alpine/aports/-/commit/f3e263d94cfac02d594bef83790c280e045eba35
|
||||
# Using wget for now. Note that busybox unzip doesn't support streaming.
|
||||
RUN ARCH="$(arch)"; if [ "${ARCH}" == "x86_64" ]; then ARCH="amd64"; elif [ "${ARCH}" == "aarch64" ]; then ARCH="arm64"; fi; wget -O /tmp/terraform.zip "https://releases.hashicorp.com/terraform/1.6.6/terraform_1.6.6_linux_${ARCH}.zip" && \
|
||||
RUN ARCH="$(arch)"; if [ "${ARCH}" == "x86_64" ]; then ARCH="amd64"; elif [ "${ARCH}" == "aarch64" ]; then ARCH="arm64"; fi; wget -O /tmp/terraform.zip "https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_${ARCH}.zip" && \
|
||||
busybox unzip /tmp/terraform.zip -d /usr/local/bin && \
|
||||
rm -f /tmp/terraform.zip && \
|
||||
chmod +x /usr/local/bin/terraform && \
|
||||
|
||||
Reference in New Issue
Block a user