Skip to content

Commit fad298d

Browse files
rsmittytalos-bot
authored andcommitted
feat: support config patches at the bootstrap provider level
This PR adds the ability to support config patching with bootstrap provider. An example of using this with a TalosConfig Template looks like: ```apiVersion: bootstrap.cluster.x-k8s.io/v1alpha3 kind: TalosConfigTemplate metadata: name: talos-aws-demo-workers namespace: default spec: template: spec: generateType: join configPatches: - op: add path: /machine/kubelet/extraArgs value: cloud-provider: "external"``` Signed-off-by: Spencer Smith <[email protected]>
1 parent dedd508 commit fad298d

9 files changed

+125
-17
lines changed

api/v1alpha2/zz_generated.conversion.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

api/v1alpha3/talosconfig_types.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ const (
2626

2727
// TalosConfigSpec defines the desired state of TalosConfig
2828
type TalosConfigSpec struct {
29-
GenerateType string `json:"generateType"` //none,init,controlplane,worker mutually exclusive w/ data
30-
Data string `json:"data,omitempty"`
29+
GenerateType string `json:"generateType"` //none,init,controlplane,worker mutually exclusive w/ data
30+
Data string `json:"data,omitempty"`
31+
ConfigPatches []ConfigPatches `json:"configPatches,omitempty"`
3132
// Important: Run "make" to regenerate code after modifying this file
3233
}
3334

api/v1alpha3/types.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
package v1alpha3
22

3+
import apiextensions "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
4+
35
// TalosConfigTemplateResource defines the Template structure
46
type TalosConfigTemplateResource struct {
57
Spec TalosConfigSpec `json:"spec,omitempty"`
68
}
9+
10+
// nb: we use apiextensions.JSON for the value below b/c we can't use interface{} with controller-gen.
11+
// found this workaround here: https://github.com/kubernetes-sigs/controller-tools/pull/126#issuecomment-630769075
12+
13+
type ConfigPatches struct {
14+
Op string `json:"op"`
15+
Path string `json:"path"`
16+
Value apiextensions.JSON `json:"value,omitempty"`
17+
}

api/v1alpha3/zz_generated.deepcopy.go

Lines changed: 27 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

config/crd/bases/bootstrap.cluster.x-k8s.io_talosconfigs.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,20 @@ spec:
9292
spec:
9393
description: TalosConfigSpec defines the desired state of TalosConfig
9494
properties:
95+
configPatches:
96+
items:
97+
properties:
98+
op:
99+
type: string
100+
path:
101+
type: string
102+
value:
103+
x-kubernetes-preserve-unknown-fields: true
104+
required:
105+
- op
106+
- path
107+
type: object
108+
type: array
95109
data:
96110
type: string
97111
generateType:

config/crd/bases/bootstrap.cluster.x-k8s.io_talosconfigtemplates.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ spec:
8686
spec:
8787
description: TalosConfigSpec defines the desired state of TalosConfig
8888
properties:
89+
configPatches:
90+
items:
91+
properties:
92+
op:
93+
type: string
94+
path:
95+
type: string
96+
value:
97+
x-kubernetes-preserve-unknown-fields: true
98+
required:
99+
- op
100+
- path
101+
type: object
102+
type: array
89103
data:
90104
type: string
91105
generateType:

controllers/talosconfig_controller.go

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ package controllers
1818
import (
1919
"context"
2020
"encoding/base64"
21+
"encoding/json"
2122
"errors"
2223
"fmt"
2324
"strconv"
2425
"strings"
2526

27+
jsonpatch "github.com/evanphx/json-patch"
2628
"github.com/go-logr/logr"
2729
bootstrapv1alpha3 "github.com/talos-systems/cluster-api-bootstrap-provider-talos/api/v1alpha3"
30+
"github.com/talos-systems/talos/pkg/machinery/config/configpatcher"
2831
"github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1"
2932
"github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1/generate"
3033
configmachine "github.com/talos-systems/talos/pkg/machinery/config/types/v1alpha1/machine"
@@ -61,8 +64,8 @@ type TalosConfigScope struct {
6164
}
6265

6366
type TalosConfigBundle struct {
64-
BoostrapData string
65-
TalosConfig string
67+
BootstrapData string
68+
TalosConfig string
6669
}
6770

6871
type talosConfig struct {
@@ -192,10 +195,31 @@ func (r *TalosConfigReconciler) Reconcile(req ctrl.Request) (_ ctrl.Result, rerr
192195
// Packet acts a fool if you don't prepend #!talos to the userdata
193196
// so we try to suss out if that's the type of machine getting created.
194197
if machine.Spec.InfrastructureRef.Kind == "PacketMachine" {
195-
retData.BoostrapData = "#!talos\n" + retData.BoostrapData
198+
retData.BootstrapData = "#!talos\n" + retData.BootstrapData
196199
}
197200

198-
err = r.writeBootstrapData(ctx, tcScope, []byte(retData.BoostrapData))
201+
// Handle patches to the machine config if they were specified
202+
// Note this will patch both pre-generated and user-provided configs.
203+
if len(config.Spec.ConfigPatches) > 0 {
204+
marshalledPatches, err := json.Marshal(config.Spec.ConfigPatches)
205+
if err != nil {
206+
return ctrl.Result{}, fmt.Errorf("failure marshalling config patches: %s", err)
207+
}
208+
209+
patch, err := jsonpatch.DecodePatch(marshalledPatches)
210+
if err != nil {
211+
return ctrl.Result{}, fmt.Errorf("failure decoding config patches from talosconfig to rfc6902 patch: %s", err)
212+
}
213+
214+
patchedBytes, err := configpatcher.JSON6902([]byte(retData.BootstrapData), patch)
215+
if err != nil {
216+
return ctrl.Result{}, err
217+
}
218+
219+
retData.BootstrapData = string(patchedBytes)
220+
}
221+
222+
err = r.writeBootstrapData(ctx, tcScope, []byte(retData.BootstrapData))
199223
if err != nil {
200224
return ctrl.Result{}, err
201225
}
@@ -257,7 +281,7 @@ func (r *TalosConfigReconciler) userConfigs(ctx context.Context, scope *TalosCon
257281
return retBundle, err
258282
}
259283

260-
retBundle.BoostrapData = userConfigStr
284+
retBundle.BootstrapData = userConfigStr
261285

262286
return retBundle, nil
263287
}
@@ -290,11 +314,17 @@ func (r *TalosConfigReconciler) genConfigs(ctx context.Context, scope *TalosConf
290314

291315
genOptions := []generate.GenOption{generate.WithDNSDomain(clusterDNS)}
292316

317+
secretBundle, err := generate.NewSecretsBundle()
318+
if err != nil {
319+
return retBundle, err
320+
}
321+
293322
APIEndpointPort := strconv.Itoa(int(scope.Cluster.Spec.ControlPlaneEndpoint.Port))
294323
input, err := generate.NewInput(
295324
scope.Cluster.Name,
296325
"https://"+scope.Cluster.Spec.ControlPlaneEndpoint.Host+":"+APIEndpointPort,
297326
k8sVersion,
327+
secretBundle,
298328
genOptions...,
299329
)
300330
if err != nil {
@@ -370,7 +400,7 @@ func (r *TalosConfigReconciler) genConfigs(ctx context.Context, scope *TalosConf
370400
return retBundle, err
371401
}
372402

373-
retBundle.BoostrapData = dataOut
403+
retBundle.BootstrapData = dataOut
374404

375405
return retBundle, nil
376406
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ go 1.13
55
replace github.com/kubernetes-sigs/bootkube => github.com/talos-systems/bootkube v0.14.1-0.20200131192519-720c01d02032
66

77
require (
8+
github.com/evanphx/json-patch v4.9.0+incompatible
89
github.com/go-logr/logr v0.1.0
910
github.com/onsi/ginkgo v1.12.0
1011
github.com/onsi/gomega v1.9.0
1112
github.com/talos-systems/crypto v0.2.0
12-
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201112172055-bef498db0af0
13+
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201203014938-ed31056d91d0
1314
gopkg.in/yaml.v2 v2.2.8
1415
k8s.io/api v0.18.2
16+
k8s.io/apiextensions-apiserver v0.18.2
1517
k8s.io/apimachinery v0.18.2
1618
k8s.io/client-go v0.18.2
1719
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89

go.sum

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,14 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
103103
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
104104
github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
105105
github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
106+
github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
107+
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
106108
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
107109
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
108110
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
109111
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
112+
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
113+
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
110114
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
111115
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
112116
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -426,8 +430,8 @@ github.com/talos-systems/crypto v0.2.0 h1:UwT8uhJ0eDlklY0vYwo1+LGoFgiqkPqjQnae6j
426430
github.com/talos-systems/crypto v0.2.0/go.mod h1:KwqG+jANKU1FNQIapmioHQ5fkovY1DJkAqMenjYBGh0=
427431
github.com/talos-systems/net v0.2.0 h1:QJ2ofYboG1Zjew9b+3RAjtLIfL0mIONGuc6/LyO68MM=
428432
github.com/talos-systems/net v0.2.0/go.mod h1:VreSAyRmxMtqussAHSKMKkJQa1YwBTSVfkmE4Jydam4=
429-
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201112172055-bef498db0af0 h1:h4fT5GinodvBw6kpGoB8P0lO3Ryq6Wjr0ztwYGaipJM=
430-
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201112172055-bef498db0af0/go.mod h1:4xp8SuXcr15gHoFNeVwimzri0fVgzPjZQY1ZLEBsrbk=
433+
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201203014938-ed31056d91d0 h1:K06TtYs+qFQx3ywfDgCGAxQXqZZiruafsSkEzcCzeo4=
434+
github.com/talos-systems/talos/pkg/machinery v0.0.0-20201203014938-ed31056d91d0/go.mod h1:B65hstKxqtVs6lxnSjKpBuVatJY9hOoC/p/3oCKI8sA=
431435
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
432436
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
433437
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
@@ -467,6 +471,8 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
467471
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
468472
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
469473
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
474+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
475+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
470476
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
471477
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
472478
golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -498,9 +504,10 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL
498504
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
499505
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
500506
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
501-
golang.org/x/net v0.0.0-20191109021931-daa7c04131f5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
502507
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
503508
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
509+
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
510+
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
504511
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
505512
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
506513
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
@@ -533,17 +540,22 @@ golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7w
533540
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg=
534541
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
535542
golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
543+
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
536544
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
537-
golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
538545
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
539546
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
540547
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU=
541548
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
549+
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
550+
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
551+
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
542552
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
543553
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
544554
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
545555
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
546556
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
557+
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
558+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
547559
golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
548560
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
549561
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

0 commit comments

Comments
 (0)