Skip to content

Commit 1d970ba

Browse files
feat: cloudflare-go v2, reconcile deployment, expose metrics (#70)
Co-authored-by: Tom Plant <[email protected]>
1 parent 73b2c33 commit 1d970ba

File tree

6 files changed

+137
-110
lines changed

6 files changed

+137
-110
lines changed

go.mod

+6-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.22.0
55
toolchain go1.22.3
66

77
require (
8-
github.com/cloudflare/cloudflare-go v0.96.0
8+
github.com/cloudflare/cloudflare-go/v2 v2.2.0
99
github.com/onsi/ginkgo/v2 v2.19.0
1010
github.com/onsi/gomega v1.33.1
1111
k8s.io/api v0.30.1
@@ -28,18 +28,14 @@ require (
2828
github.com/go-openapi/jsonreference v0.20.2 // indirect
2929
github.com/go-openapi/swag v0.22.4 // indirect
3030
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
31-
github.com/goccy/go-json v0.10.2 // indirect
3231
github.com/gogo/protobuf v1.3.2 // indirect
3332
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
3433
github.com/golang/protobuf v1.5.4 // indirect
3534
github.com/google/gnostic-models v0.6.8 // indirect
3635
github.com/google/go-cmp v0.6.0 // indirect
37-
github.com/google/go-querystring v1.1.0 // indirect
3836
github.com/google/gofuzz v1.2.0 // indirect
3937
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect
4038
github.com/google/uuid v1.3.1 // indirect
41-
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
42-
github.com/hashicorp/go-retryablehttp v0.7.6 // indirect
4339
github.com/imdario/mergo v0.3.16 // indirect
4440
github.com/josharian/intern v1.0.0 // indirect
4541
github.com/json-iterator/go v1.1.12 // indirect
@@ -54,6 +50,11 @@ require (
5450
github.com/prometheus/common v0.45.0 // indirect
5551
github.com/prometheus/procfs v0.12.0 // indirect
5652
github.com/spf13/pflag v1.0.5 // indirect
53+
github.com/stretchr/testify v1.9.0 // indirect
54+
github.com/tidwall/gjson v1.14.4 // indirect
55+
github.com/tidwall/match v1.1.1 // indirect
56+
github.com/tidwall/pretty v1.2.1 // indirect
57+
github.com/tidwall/sjson v1.2.5 // indirect
5758
go.uber.org/multierr v1.11.0 // indirect
5859
go.uber.org/zap v1.26.0 // indirect
5960
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect

go.sum

+12-19
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
22
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
33
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
44
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5-
github.com/cloudflare/cloudflare-go v0.96.0 h1:wd+qrnyw+C2eXUUujE6BzFEOREkEfoCvogpO5h33FxI=
6-
github.com/cloudflare/cloudflare-go v0.96.0/go.mod h1:gLP9fJT8ROgRCjHNKxISNNKeU1JEg2yT5uPEEI8x9Ec=
5+
github.com/cloudflare/cloudflare-go/v2 v2.2.0 h1:ZUKQDfJ3brCrTSxHvcY7KiFjwYmSj2KwInXQkl2w1QQ=
6+
github.com/cloudflare/cloudflare-go/v2 v2.2.0/go.mod h1:AoIzb05z/rvdJLztPct4tSa+3IqXJJ6c+pbUFMOlTr8=
77
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
88
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
99
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -14,8 +14,6 @@ github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ
1414
github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
1515
github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
1616
github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
17-
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
18-
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
1917
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
2018
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
2119
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
@@ -32,8 +30,6 @@ github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogB
3230
github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
3331
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
3432
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
35-
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
36-
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
3733
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
3834
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
3935
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
@@ -44,26 +40,17 @@ github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek
4440
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
4541
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
4642
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
47-
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
4843
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
4944
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
5045
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
5146
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
52-
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
53-
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
5447
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
5548
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
5649
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
5750
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
5851
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
5952
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
6053
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
61-
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
62-
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
63-
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
64-
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
65-
github.com/hashicorp/go-retryablehttp v0.7.6 h1:TwRYfx2z2C4cLbXmT8I5PgP/xmuqASDyiVuGYfs9GZM=
66-
github.com/hashicorp/go-retryablehttp v0.7.6/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
6754
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
6855
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
6956
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
@@ -81,10 +68,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
8168
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
8269
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
8370
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
84-
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
85-
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
86-
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
87-
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
8871
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
8972
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k=
9073
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -123,6 +106,16 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO
123106
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
124107
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
125108
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
109+
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
110+
github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
111+
github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
112+
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
113+
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
114+
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
115+
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
116+
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
117+
github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY=
118+
github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28=
126119
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
127120
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
128121
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=

internal/controller/gateway_controller.go

+55-33
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import (
44
"context"
55
"errors"
66

7-
"github.com/cloudflare/cloudflare-go"
7+
"github.com/cloudflare/cloudflare-go/v2"
8+
"github.com/cloudflare/cloudflare-go/v2/shared"
9+
"github.com/cloudflare/cloudflare-go/v2/zero_trust"
810
apps "k8s.io/api/apps/v1"
911
core "k8s.io/api/core/v1"
1012
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1113
"k8s.io/apimachinery/pkg/runtime"
1214
"k8s.io/apimachinery/pkg/types"
15+
"k8s.io/apimachinery/pkg/util/intstr"
1316
ctrl "sigs.k8s.io/controller-runtime"
1417
"sigs.k8s.io/controller-runtime/pkg/client"
1518
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
@@ -109,18 +112,19 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
109112
log.Error(err, "Failed to delete Deployment")
110113
}
111114

112-
tunnel, tunnelInfo, err := api.ListTunnels(ctx, account, cloudflare.TunnelListParams{
113-
IsDeleted: cloudflare.BoolPtr(false),
114-
Name: gateway.Name,
115+
tunnel, err := api.ZeroTrust.Tunnels.List(ctx, zero_trust.TunnelListParams{
116+
AccountID: cloudflare.String(account),
117+
IsDeleted: cloudflare.Bool(false),
118+
Name: cloudflare.String(gateway.Name),
115119
})
116120
if err != nil {
117121
log.Error(err, "Failed to get tunnel from Cloudflare API")
118122
return ctrl.Result{}, err
119123
}
120124

121-
if tunnelInfo.Count > 0 {
125+
if len(tunnel.Result) > 0 {
122126
log.Info("Deleting Tunnel")
123-
if err := api.DeleteTunnel(ctx, account, tunnel[0].ID); err != nil {
127+
if _, err := api.ZeroTrust.Tunnels.Delete(ctx, tunnel.Result[0].ID, zero_trust.TunnelDeleteParams{}); err != nil {
124128
log.Error(err, "Failed to delete tunnel Deployment")
125129
return ctrl.Result{}, err
126130
}
@@ -150,25 +154,30 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
150154
return ctrl.Result{}, nil
151155
}
152156

153-
tunnels, info, err := api.ListTunnels(ctx, account, cloudflare.TunnelListParams{IsDeleted: cloudflare.BoolPtr(false), Name: gateway.Name})
157+
tunnels, err := api.ZeroTrust.Tunnels.List(ctx, zero_trust.TunnelListParams{
158+
AccountID: cloudflare.String(account),
159+
IsDeleted: cloudflare.Bool(false),
160+
Name: cloudflare.String(gateway.Name),
161+
})
154162
if err != nil {
155163
log.Error(err, "Failed to get Tunnel from Cloudflare API")
156164
return ctrl.Result{}, err
157165
}
158166

159-
tunnel := cloudflare.Tunnel{}
160-
if info.Count == 0 {
167+
tunnelID := ""
168+
if len(tunnels.Result) == 0 {
161169
log.Info("Creating tunnel")
162170
// secret is required, despite optional in docs and seemingly only needed for ConfigSrc=local
163-
tunnel, err = api.CreateTunnel(ctx, account, cloudflare.TunnelCreateParams{
164-
Name: gateway.Name,
165-
ConfigSrc: "cloudflare",
166-
Secret: "AQIDBAUGBwgBAgMEBQYHCAECAwQFBgcIAQIDBAUGBwg=",
171+
tunnel, err := api.ZeroTrust.Tunnels.New(ctx, zero_trust.TunnelNewParams{
172+
AccountID: cloudflare.String(account),
173+
Name: cloudflare.String(gateway.Name),
174+
TunnelSecret: cloudflare.String("AQIDBAUGBwgBAgMEBQYHCAECAwQFBgcIAQIDBAUGBwg="),
167175
})
168176
if err != nil {
169177
log.Error(err, "Failed to create tunnel")
170178
return ctrl.Result{}, err
171179
}
180+
tunnelID = tunnel.ID
172181
} else {
173182
// patch unsupported with api_token
174183
// if tunnels[0].Name != gateway.Name {
@@ -181,47 +190,60 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
181190
// }
182191
// }
183192
log.Info("Tunnel exists")
184-
tunnel = tunnels[0]
193+
tunnelID = tunnels.Result[0].ID
185194
}
186195

187-
token, err := api.GetTunnelToken(ctx, account, tunnel.ID)
196+
res, err := api.ZeroTrust.Tunnels.Token.Get(ctx, tunnelID, zero_trust.TunnelTokenGetParams{
197+
AccountID: cloudflare.String(account),
198+
})
188199
if err != nil {
189200
log.Error(err, "Failed to get tunnel token")
190201
return ctrl.Result{}, err
191202
}
203+
token := string((*res).(shared.UnionString))
192204

193-
if err := r.Get(ctx, types.NamespacedName{
194-
Namespace: gateway.Namespace,
195-
Name: gateway.Name,
196-
}, &apps.Deployment{}); err == nil {
197-
log.Info("Tunnel deployment exists")
198-
return ctrl.Result{}, nil
199-
}
200-
201-
labels := map[string]string{"cfargotunnel.com/name": gateway.Name}
202-
deployment := apps.Deployment{
205+
deployment := &apps.Deployment{
203206
ObjectMeta: v1.ObjectMeta{
204207
Namespace: gateway.Namespace,
205208
Name: gateway.Name,
206209
},
207-
Spec: apps.DeploymentSpec{
210+
}
211+
if _, err := controllerutil.CreateOrUpdate(ctx, r.Client, deployment, func() error {
212+
labels := map[string]string{"cfargotunnel.com/name": gateway.Name}
213+
deployment.Spec = apps.DeploymentSpec{
208214
Selector: &v1.LabelSelector{MatchLabels: labels},
209215
Template: core.PodTemplateSpec{
210216
ObjectMeta: v1.ObjectMeta{Labels: labels},
211217
Spec: core.PodSpec{Containers: []core.Container{{
212-
Name: "main",
218+
Name: "main",
213219
// renovate: datasource=docker
214220
Image: "cloudflare/cloudflared:2024.5.0",
215-
Args: []string{"tunnel", "--no-autoupdate", "run", "--token", token},
221+
Args: []string{"tunnel", "--no-autoupdate", "--metrics", "0.0.0.0:2000", "run", "--token", token},
222+
LivenessProbe: &core.Probe{
223+
FailureThreshold: 5,
224+
InitialDelaySeconds: 10,
225+
PeriodSeconds: 10,
226+
ProbeHandler: core.ProbeHandler{
227+
HTTPGet: &core.HTTPGetAction{
228+
Path: "/ready",
229+
Port: intstr.FromInt(2000),
230+
},
231+
},
232+
},
216233
}}},
217234
},
218-
},
219-
}
220-
221-
if err := r.Create(ctx, &deployment); err != nil {
222-
log.Error(err, "Failed to create tunnel deployment")
235+
Strategy: apps.DeploymentStrategy{
236+
RollingUpdate: &apps.RollingUpdateDeployment{
237+
MaxUnavailable: &intstr.IntOrString{IntVal: 0},
238+
},
239+
},
240+
}
241+
return nil
242+
}); err != nil {
243+
log.Error(err, "Failed to reconcile tunnel deployment")
223244
return ctrl.Result{}, err
224245
}
246+
log.Info("Reconciled tunnel deployment")
225247

226248
return ctrl.Result{}, nil
227249
}

internal/controller/gatewayclass_controller.go

+1-5
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,7 @@ type GatewayClassReconciler struct {
2323
//+kubebuilder:rbac:groups=gateway.networking.k8s.io,resources=gatewayclasses/finalizers,verbs=update
2424

2525
// Reconcile is part of the main kubernetes reconciliation loop which aims to
26-
// move the current state of the cluster closer to the desired state.
27-
// TODO(user): Modify the Reconcile function to compare the state specified by
28-
// the GatewayClass object against the actual cluster state, and then
29-
// perform operations to make the cluster state reflect the state specified by
30-
// the user.
26+
// move the current state of the cluster closer to the desired state.\
3127
//
3228
// For more details, check Reconcile and its Result here:
3329
// - https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/reconcile

0 commit comments

Comments
 (0)