Skip to content

Commit e570414

Browse files
authored
Merge pull request #18166 from moshevayner/add-linode-provider-draft
linode: add Linode (Akamai) node configuration and identity
2 parents 3e5a315 + c8fff02 commit e570414

187 files changed

Lines changed: 24237 additions & 80 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/kops-controller/main.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import (
4646
nodeidentitydo "k8s.io/kops/pkg/nodeidentity/do"
4747
nodeidentitygce "k8s.io/kops/pkg/nodeidentity/gce"
4848
nodeidentityhetzner "k8s.io/kops/pkg/nodeidentity/hetzner"
49+
nodeidentitylinode "k8s.io/kops/pkg/nodeidentity/linode"
4950
nodeidentitymetal "k8s.io/kops/pkg/nodeidentity/metal"
5051
nodeidentityos "k8s.io/kops/pkg/nodeidentity/openstack"
5152
nodeidentityscw "k8s.io/kops/pkg/nodeidentity/scaleway"
@@ -54,6 +55,7 @@ import (
5455
"k8s.io/kops/upup/pkg/fi/cloudup/do"
5556
"k8s.io/kops/upup/pkg/fi/cloudup/gce/tpm/gcetpmverifier"
5657
"k8s.io/kops/upup/pkg/fi/cloudup/hetzner"
58+
linodecloudup "k8s.io/kops/upup/pkg/fi/cloudup/linode"
5759
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
5860
"k8s.io/kops/upup/pkg/fi/cloudup/scaleway"
5961
"k8s.io/kops/util/pkg/vfs"
@@ -198,6 +200,14 @@ func main() {
198200
}
199201
verifiers = append(verifiers, verifier)
200202
}
203+
if opt.Server.Provider.Linode != nil {
204+
verifier, err := linodecloudup.NewLinodeVerifier(opt.Server.Provider.Linode)
205+
if err != nil {
206+
setupLog.Error(err, "unable to create verifier")
207+
os.Exit(1)
208+
}
209+
verifiers = append(verifiers, verifier)
210+
}
201211

202212
if opt.Server.PKI != nil {
203213
verifier, err := pkibootstrap.NewVerifier(opt.Server.PKI, mgr.GetClient())
@@ -352,6 +362,12 @@ func addNodeController(ctx context.Context, mgr manager.Manager, vfsContext *vfs
352362
return fmt.Errorf("error building metal node identifier: %w", err)
353363
}
354364

365+
case "linode":
366+
identifier, err = nodeidentitylinode.New(opt.CacheNodeidentityInfo)
367+
if err != nil {
368+
return fmt.Errorf("error building linode node identifier: %w", err)
369+
}
370+
355371
case "":
356372
return fmt.Errorf("must specify cloud")
357373

cmd/kops-controller/pkg/config/options.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"k8s.io/kops/upup/pkg/fi/cloudup/do"
2424
gcetpm "k8s.io/kops/upup/pkg/fi/cloudup/gce/tpm"
2525
"k8s.io/kops/upup/pkg/fi/cloudup/hetzner"
26+
"k8s.io/kops/upup/pkg/fi/cloudup/linode"
2627
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
2728
"k8s.io/kops/upup/pkg/fi/cloudup/scaleway"
2829
)
@@ -92,6 +93,7 @@ type ServerProviderOptions struct {
9293
DigitalOcean *do.DigitalOceanVerifierOptions `json:"do,omitempty"`
9394
Scaleway *scaleway.ScalewayVerifierOptions `json:"scaleway,omitempty"`
9495
Azure *azure.AzureVerifierOptions `json:"azure,omitempty"`
96+
Linode *linode.LinodeVerifierOptions `json:"linode,omitempty"`
9597
}
9698

9799
// DiscoveryOptions configures our support for discovery, particularly gossip DNS (i.e. k8s.local)

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ require (
5252
github.com/gophercloud/gophercloud/v2 v2.9.0
5353
github.com/hetznercloud/hcloud-go/v2 v2.32.0
5454
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7
55+
github.com/linode/linodego v1.67.0
5556
github.com/pelletier/go-toml v1.9.5
5657
github.com/pkg/sftp v1.13.10
5758
github.com/prometheus/client_golang v1.23.2
@@ -163,11 +164,12 @@ require (
163164
github.com/go-openapi/jsonreference v0.21.2 // indirect
164165
github.com/go-openapi/swag v0.23.1 // indirect
165166
github.com/go-openapi/swag/jsonname v0.25.1 // indirect
167+
github.com/go-resty/resty/v2 v2.17.2 // indirect
166168
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
167169
github.com/google/btree v1.1.3 // indirect
168170
github.com/google/gnostic-models v0.7.0 // indirect
169171
github.com/google/go-configfs-tsm v0.3.3-0.20240919001351-b4b5b84fdcbc // indirect
170-
github.com/google/go-querystring v1.1.0 // indirect
172+
github.com/google/go-querystring v1.2.0 // indirect
171173
github.com/google/go-sev-guest v0.14.0 // indirect
172174
github.com/google/go-tdx-guest v0.3.2-0.20241009005452-097ee70d0843 // indirect
173175
github.com/google/logger v1.1.1 // indirect
@@ -260,7 +262,7 @@ require (
260262
google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 // indirect
261263
google.golang.org/genproto/googleapis/rpc v0.0.0-20251124214823-79d6a2a48846 // indirect
262264
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
263-
gopkg.in/ini.v1 v1.67.0 // indirect
265+
gopkg.in/ini.v1 v1.67.1 // indirect
264266
gopkg.in/warnings.v0 v0.1.2 // indirect
265267
gopkg.in/yaml.v2 v2.4.0 // indirect
266268
gopkg.in/yaml.v3 v3.0.1 // indirect

go.sum

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,8 @@ github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZ
264264
github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
265265
github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU=
266266
github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo=
267+
github.com/go-resty/resty/v2 v2.17.2 h1:FQW5oHYcIlkCNrMD2lloGScxcHJ0gkjshV3qcQAyHQk=
268+
github.com/go-resty/resty/v2 v2.17.2/go.mod h1:kCKZ3wWmwJaNc7S29BRtUhJwy7iqmn+2mLtQrOyQlVA=
267269
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
268270
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
269271
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
@@ -291,9 +293,9 @@ github.com/google/go-attestation v0.5.1 h1:jqtOrLk5MNdliTKjPbIPrAaRKJaKW+0LIU2n/
291293
github.com/google/go-attestation v0.5.1/go.mod h1:KqGatdUhg5kPFkokyzSBDxwSCFyRgIgtRkMp6c3lOBQ=
292294
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
293295
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
294-
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
295296
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
296297
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
298+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
297299
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
298300
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
299301
github.com/google/go-configfs-tsm v0.3.3-0.20240919001351-b4b5b84fdcbc h1:SG12DWUUM5igxm+//YX5Yq4vhdoRnOG9HkCodkOn+YU=
@@ -302,8 +304,8 @@ github.com/google/go-containerregistry v0.20.7 h1:24VGNpS0IwrOZ2ms2P1QE3Xa5X9p4p
302304
github.com/google/go-containerregistry v0.20.7/go.mod h1:Lx5LCZQjLH1QBaMPeGwsME9biPeo1lPx6lbGj/UmzgM=
303305
github.com/google/go-eventlog v0.0.2-0.20241003021507-01bb555f7cba h1:05m5+kgZjxYUZrx3bZfkKHl6wkch+Khao6N21rFHInk=
304306
github.com/google/go-eventlog v0.0.2-0.20241003021507-01bb555f7cba/go.mod h1:7huE5P8w2NTObSwSJjboHmB7ioBNblkijdzoVa2skfQ=
305-
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
306-
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
307+
github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0=
308+
github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU=
307309
github.com/google/go-sev-guest v0.14.0 h1:dCb4F3YrHTtrDX3cYIPTifEDz7XagZmXQioxRBW4wOo=
308310
github.com/google/go-sev-guest v0.14.0/go.mod h1:SK9vW+uyfuzYdVN0m8BShL3OQCtXZe/JPF7ZkpD3760=
309311
github.com/google/go-tdx-guest v0.3.2-0.20241009005452-097ee70d0843 h1:+MoPobRN9HrDhGyn6HnF5NYo4uMBKaiFqAtf/D/OB4A=
@@ -385,6 +387,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
385387
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
386388
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7 h1:q9rwMYjPWIFOSijnxXre4+RGo8xS0NVbJzXg+F0NMHc=
387389
github.com/jacksontj/memberlistmesh v0.0.0-20190905163944-93462b9d2bb7/go.mod h1:fFX3XoduobgoJsVtpzIFRTgKZAbNhsSJIDNOgeUU5g4=
390+
github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A=
391+
github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
388392
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
389393
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
390394
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -414,6 +418,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
414418
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
415419
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
416420
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
421+
github.com/linode/linodego v1.67.0 h1:pomhFuuCCJI4N6emtB9027h1yXHY2/MIT0hwHEFwvq4=
422+
github.com/linode/linodego v1.67.0/go.mod h1:+9mbdu0P3WMRCl0QbVfiFavR+Iel7TCRDJk3nInyx14=
417423
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
418424
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
419425
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
@@ -585,13 +591,18 @@ github.com/spotinst/spotinst-sdk-go v1.372.0 h1:B4/+HK3D2Fe0821DOmw5RO4Lrzo2gi7o
585591
github.com/spotinst/spotinst-sdk-go v1.372.0/go.mod h1:Tn4/eb0SFY6IXmxz71CClujvbD/PuT+EO6Ta8v6AML4=
586592
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
587593
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
594+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
595+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
588596
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
589597
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
590598
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
591599
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
592600
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
593601
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
594602
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
603+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
604+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
605+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
595606
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
596607
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
597608
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
@@ -769,8 +780,8 @@ gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs=
769780
gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
770781
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
771782
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
772-
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
773-
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
783+
gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k=
784+
gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss=
774785
gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
775786
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
776787
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

nodeup/pkg/model/bootstrap_client.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/kops/upup/pkg/fi/cloudup/do"
3434
"k8s.io/kops/upup/pkg/fi/cloudup/gce/tpm/gcetpmsigner"
3535
"k8s.io/kops/upup/pkg/fi/cloudup/hetzner"
36+
"k8s.io/kops/upup/pkg/fi/cloudup/linode"
3637
"k8s.io/kops/upup/pkg/fi/cloudup/openstack"
3738
"k8s.io/kops/upup/pkg/fi/cloudup/scaleway"
3839
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
@@ -93,6 +94,12 @@ func (b BootstrapClientBuilder) Build(c *fi.NodeupModelBuilderContext) error {
9394
return err
9495
}
9596
authenticator = a
97+
case kops.CloudProviderLinode:
98+
a, err := linode.NewLinodeAuthenticator()
99+
if err != nil {
100+
return err
101+
}
102+
authenticator = a
96103

97104
case kops.CloudProviderMetal:
98105
a, err := pkibootstrap.NewAuthenticatorFromFile("/etc/kubernetes/kops/pki/machine/private.pem")

nodeup/pkg/model/linode.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
Copyright 2026 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package model
18+
19+
import (
20+
"bufio"
21+
"bytes"
22+
"fmt"
23+
"os"
24+
"strings"
25+
26+
"k8s.io/klog/v2"
27+
"k8s.io/kops/pkg/apis/kops"
28+
"k8s.io/kops/upup/pkg/fi"
29+
"k8s.io/kops/upup/pkg/fi/nodeup/nodetasks"
30+
)
31+
32+
// LinodeBuilder writes the Linode-specific configuration
33+
type LinodeBuilder struct {
34+
*NodeupModelContext
35+
}
36+
37+
var _ fi.NodeupModelBuilder = &LinodeBuilder{}
38+
39+
// Build configures Linode-specific node settings including swap disabling.
40+
func (b *LinodeBuilder) Build(c *fi.NodeupModelBuilderContext) error {
41+
if b.CloudProvider() != kops.CloudProviderLinode {
42+
return nil
43+
}
44+
45+
// Linode instances ship with swap enabled. Disable it when MemorySwapBehavior is unset,
46+
// since the default kubelet swap mode (NoSwap) requires swap to be off.
47+
if b.NodeupConfig.KubeletConfig.MemorySwapBehavior == "" {
48+
if err := b.disableSwap(c); err != nil {
49+
return fmt.Errorf("error disabling swap: %v", err)
50+
}
51+
}
52+
53+
return nil
54+
}
55+
56+
// disableSwap disables swap at the OS level and removes swap entries from /etc/fstab
57+
func (b *LinodeBuilder) disableSwap(c *fi.NodeupModelBuilderContext) error {
58+
// Read current /etc/fstab
59+
fstabPath := "/etc/fstab"
60+
fstabBytes, err := os.ReadFile(fstabPath)
61+
if err != nil {
62+
return fmt.Errorf("failed to read %s: %w", fstabPath, err)
63+
}
64+
65+
// Filter out swap entries
66+
var filteredLines []string
67+
scanner := bufio.NewScanner(bytes.NewReader(fstabBytes))
68+
for scanner.Scan() {
69+
line := scanner.Text()
70+
// Keep lines that don't contain " swap " or "\tswap\t"
71+
if !strings.Contains(line, " swap ") && !strings.Contains(line, "\tswap\t") {
72+
filteredLines = append(filteredLines, line)
73+
} else {
74+
klog.V(2).Infof("Removing swap entry from fstab: %s", line)
75+
}
76+
}
77+
if err := scanner.Err(); err != nil {
78+
return fmt.Errorf("error reading fstab: %w", err)
79+
}
80+
81+
// Write filtered fstab back
82+
filteredContent := strings.Join(filteredLines, "\n") + "\n"
83+
c.AddTask(&nodetasks.File{
84+
Path: fstabPath,
85+
Contents: fi.NewStringResource(filteredContent),
86+
Type: nodetasks.FileType_File,
87+
Mode: s("0644"),
88+
// Execute swapoff after updating fstab
89+
OnChangeExecute: [][]string{{"swapoff", "-a"}},
90+
})
91+
92+
return nil
93+
}

pkg/apis/kops/channel.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,7 @@ const (
293293
CloudProviderOpenstack CloudProviderID = "openstack"
294294
CloudProviderAzure CloudProviderID = "azure"
295295
CloudProviderScaleway CloudProviderID = "scaleway"
296+
CloudProviderLinode CloudProviderID = "linode"
296297

297298
// Experimental cloud providers
298299
CloudProviderMetal CloudProviderID = "metal"

pkg/nodeidentity/linode/OWNERS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# See the OWNERS docs at <https://go.k8s.io/owners>
2+
3+
labels:
4+
5+
- area/provider/linode

0 commit comments

Comments
 (0)