Skip to content

Commit 8ac93c9

Browse files
authored
Merge pull request #10 from metalbear-co/big-change
Big change
2 parents abb1029 + 546b848 commit 8ac93c9

18 files changed

Lines changed: 946 additions & 33 deletions

README.md

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,53 @@ task redis:status
192192
task redis:clean
193193
```
194194

195+
## Preview Environments
196+
197+
Config: `apps/echo-app/mirrord-preview.json` - targets `deploy/echo-app`, steals traffic
198+
matching `X-Preview: <key>`. The preview pod uses the `echo-app:latest` image by default
199+
(loaded into minikube, so `image_pull_policy: "IfNotPresent"` is set in local values).
200+
201+
### Single-cluster test
202+
203+
Creates the PreviewSession directly on remote-1. The local operator handles it.
204+
205+
```bash
206+
task multicluster:preview:start:single-cluster PREVIEW_KEY=my-sc-preview
207+
208+
# Terminal 2 - traffic with header goes to preview pod
209+
task multicluster:preview:test:traffic PREVIEW_KEY=my-sc-preview
210+
211+
# Terminal 3 - traffic without header goes to original echo-app
212+
task multicluster:preview:test:traffic:no-header
213+
214+
task multicluster:preview:stop:single-cluster PREVIEW_KEY=my-sc-preview
215+
```
216+
217+
### Multi-cluster test
218+
219+
Creates the PreviewSession on the primary cluster. The `PreviewSessionSyncController`
220+
syncs it to the default cluster (remote-1) where the preview pod runs.
221+
222+
```bash
223+
task multicluster:preview:start PREVIEW_KEY=my-mc-preview
224+
225+
# Verify the CR exists on BOTH clusters (proves sync controller works)
226+
task multicluster:preview:list
227+
228+
# Traffic is generated on remote-1 where the echo-app service lives
229+
task multicluster:preview:test:traffic PREVIEW_KEY=my-mc-preview
230+
231+
task multicluster:preview:stop PREVIEW_KEY=my-mc-preview
232+
```
233+
234+
### What to look for
235+
236+
- `preview:list` should show the PreviewSession on both `mirrord-primary` and `mirrord-remote-1`
237+
for multi-cluster, or only on `mirrord-remote-1` for single-cluster
238+
- Traffic with the `X-Preview` header should return a response from the preview pod
239+
(different from the original echo-app's `cluster_id` JSON)
240+
- Traffic without the header should return normal echo-app responses
241+
195242
## Other Modules
196243

197244
### MySQL

Taskfile.yml

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ vars:
3838
ROOT_DIR:
3939
sh: pwd
4040
OPERATOR_DIR: '{{.OPERATOR_DIR | default (print .ROOT_DIR "/../operator")}}'
41-
CHARTS_DIR: '{{.CHARTS_DIR | default (print .ROOT_DIR "/../operator/charts/mirrord-operator")}}'
41+
CHARTS_DIR: '{{.CHARTS_DIR | default (print .ROOT_DIR "/../operator/public/charts/mirrord-operator")}}'
4242
SCRIPTS_DIR: '{{.SCRIPTS_DIR | default (print .ROOT_DIR "/scripts")}}'
4343
MIRRORD_DIR: '{{.MIRRORD_DIR | default (print .ROOT_DIR "/../mirrord")}}'
4444
OPERATOR_IMAGE: '{{.OPERATOR_IMAGE | default "mirrord-operator:custom"}}'
@@ -69,15 +69,15 @@ tasks:
6969
build:operator:
7070
desc: Build operator image
7171
cmds:
72-
- cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build --provenance=false -f operator/Dockerfile -t {{.OPERATOR_IMAGE}} --build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" operator
72+
- cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build --provenance=false -f operator/public/operator/Dockerfile -t {{.OPERATOR_IMAGE}} --build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" operator
7373
- task: operator:image:load
7474

7575
build:operator:nocache:
7676
desc: Build operator without any cache (clears sccache + Docker layers)
7777
cmds:
7878
- echo "Clearing sccache and target cache mounts..."
7979
- docker builder prune --filter type=exec.cachemount --force || true
80-
- cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build --provenance=false --no-cache -f operator/Dockerfile -t {{.OPERATOR_IMAGE}} --build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" operator
80+
- cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build --provenance=false --no-cache -f operator/public/operator/Dockerfile -t {{.OPERATOR_IMAGE}} --build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" operator
8181
- task: operator:image:load
8282

8383
build:operator:gcs:
@@ -95,7 +95,7 @@ tasks:
9595
msg: "GCS_BUCKET required"
9696
cmds:
9797
- |
98-
cd {{.OPERATOR_DIR}}/.. && docker build --provenance=false -f operator/Dockerfile -t {{.OPERATOR_IMAGE}} \
98+
cd {{.OPERATOR_DIR}}/.. && docker build --provenance=false -f operator/public/operator/Dockerfile -t {{.OPERATOR_IMAGE}} \
9999
--secret id=gcp_credentials,src={{.GCS_CREDENTIALS_FILE}} \
100100
--build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" \
101101
--build-arg GCS_BUCKET={{.GCS_BUCKET}} \
@@ -122,7 +122,7 @@ tasks:
122122
msg: "Custom issuer file not found"
123123
cmds:
124124
- |
125-
cd {{.OPERATOR_DIR}}/.. && docker build --provenance=false -f operator/Dockerfile -t {{.OPERATOR_IMAGE}} \
125+
cd {{.OPERATOR_DIR}}/.. && docker build --provenance=false -f operator/public/operator/Dockerfile -t {{.OPERATOR_IMAGE}} \
126126
--secret id=gcp_credentials,src={{.GCS_CREDENTIALS_FILE}} \
127127
--build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.CUSTOM_ISSUER_FILE}})" \
128128
--build-arg GCS_BUCKET={{.GCS_BUCKET}} \
@@ -630,6 +630,45 @@ tasks:
630630
- task: postgres:deploy:gcp:path
631631
- task: postgres:_reset:print:gcp:path
632632

633+
test:mssql:
634+
desc: "Run MSSQL test"
635+
deps: [operator:install]
636+
cmds:
637+
- task: mssql:test
638+
639+
test:mssql:quick:
640+
desc: "Quick MSSQL test - verify only"
641+
cmds:
642+
- task: mssql:verify
643+
644+
test:mssql:clean:
645+
desc: "Clean cluster and run MSSQL test"
646+
cmds:
647+
- task: cluster:delete
648+
- task: cluster:create
649+
- task: operator:install
650+
- task: mssql:test
651+
652+
test:mssql:clean:nobuild:
653+
desc: "Clean cluster and run MSSQL test (skip operator build)"
654+
cmds:
655+
- task: cluster:delete
656+
- task: cluster:create
657+
- task: license:create:secret
658+
- task: operator:install:nobuild
659+
- task: mssql:test
660+
661+
test:mssql:local:
662+
desc: "Run MSSQL app locally with mirrord"
663+
cmds:
664+
- task: mssql:run:local
665+
666+
test:mssql:setup:
667+
desc: "Setup MSSQL environment for local testing"
668+
deps: [operator:install]
669+
cmds:
670+
- task: mssql:setup:local
671+
633672
test:mongodb:
634673
desc: "Run MongoDB test"
635674
deps: [build:app:mongodb, operator:install]
@@ -765,8 +804,8 @@ tasks:
765804
- task: multicluster:teardown:all
766805
- echo "Building operator image..."
767806
- task: build:operator:multicluster
768-
- echo "Building echo-app..."
769-
- task: multicluster:echo-app:build
807+
# - echo "Building echo-app..."
808+
# - task: multicluster:echo-app:build
770809
- echo "Creating minikube profiles..."
771810
- task: multicluster:clusters:create
772811
- echo "Waiting for clusters to be ready..."
@@ -816,7 +855,7 @@ tasks:
816855
cmds:
817856
- |
818857
cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build \
819-
-f operator/Dockerfile \
858+
-f operator/public/operator/Dockerfile \
820859
-t {{.OPERATOR_IMAGE}} \
821860
--build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" \
822861
operator
@@ -826,7 +865,7 @@ tasks:
826865
cmds:
827866
- |
828867
cd {{.OPERATOR_DIR}}/.. && {{.CONTAINER_RUNTIME}} build --no-cache \
829-
-f operator/Dockerfile \
868+
-f operator/public/operator/Dockerfile \
830869
-t {{.OPERATOR_IMAGE}} \
831870
--build-arg OPERATOR_LICENSE_ISSUER_PUBLIC_KEY="$(cat {{.SCRIPTS_DIR}}/license-issuer.pem)" \
832871
operator
@@ -837,8 +876,8 @@ tasks:
837876
- task: multicluster:teardown:all
838877
- echo "Building operator image (no cache)..."
839878
- task: build:operator:multicluster:nocache
840-
- echo "Building echo-app..."
841-
- task: multicluster:echo-app:build
879+
# - echo "Building echo-app..."
880+
# - task: multicluster:echo-app:build
842881
- echo "Creating minikube profiles..."
843882
- task: multicluster:clusters:create
844883
- echo "Waiting for clusters to be ready..."

apps/echo-app/mirrord-preview.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"target": {
3+
"path": "deploy/echo-app",
4+
"namespace": "test-multicluster"
5+
},
6+
"feature": {
7+
"preview": {
8+
"ttl_mins": 30,
9+
"creation_timeout_secs": 300
10+
},
11+
"network": {
12+
"incoming": {
13+
"mode": "steal",
14+
"http_filter": {
15+
"header_filter": "X-Preview: {{ key }}"
16+
}
17+
}
18+
}
19+
}
20+
}

apps/mssql-app/Dockerfile

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
FROM golang:1.21-alpine AS builder
2+
WORKDIR /app
3+
COPY go.mod go.sum* ./
4+
RUN go mod download || true
5+
COPY . .
6+
RUN CGO_ENABLED=0 go build -o app main.go
7+
8+
FROM alpine:latest
9+
RUN apk --no-cache add ca-certificates
10+
WORKDIR /app
11+
COPY --from=builder /app/app .
12+
CMD ["./app"]

apps/mssql-app/go.mod

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module mssql-app
2+
3+
go 1.21
4+
5+
require github.com/microsoft/go-mssqldb v1.7.2
6+
7+
require (
8+
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
9+
github.com/golang-sql/sqlexp v0.1.0 // indirect
10+
golang.org/x/crypto v0.18.0 // indirect
11+
golang.org/x/text v0.14.0 // indirect
12+
)

apps/mssql-app/go.sum

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ=
2+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA=
3+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ=
4+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo=
5+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA=
6+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
7+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
8+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
9+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
10+
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
11+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
12+
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
13+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
14+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
15+
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
16+
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
17+
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
18+
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
19+
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
20+
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
21+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
22+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
23+
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
24+
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
25+
github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA=
26+
github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
27+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
28+
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
29+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
30+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
31+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
32+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
33+
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
34+
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
35+
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
36+
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
37+
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
38+
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
39+
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
40+
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
41+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
42+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)