Skip to content
This repository was archived by the owner on Jul 30, 2021. It is now read-only.

Commit ac0359e

Browse files
committed
Generate Controlplane Init Bootstrap data
This PR generates the `kubeadm init` bootstrap data It will wait unitl the infrastructure is ready before allowing anything beyond the bootstrap control plane from joining the cluster. Signed-off-by: Chuck Ha <[email protected]>
1 parent b7ccf8b commit ac0359e

12 files changed

+157
-381
lines changed

api/v1alpha2/kubeadmbootstrapconfig_types.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@ import (
2121
kubeadmv1beta1 "sigs.k8s.io/cluster-api-bootstrap-provider-kubeadm/kubeadm/v1beta1"
2222
)
2323

24-
// KubeadmConfigSpec defines the desired state of KubeadmConfig
24+
// KubeadmConfigSpec defines the desired state of KubeadmConfig.
25+
// Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined.
2526
type KubeadmConfigSpec struct {
26-
ClusterConfiguration kubeadmv1beta1.ClusterConfiguration `json:"clusterConfiguration"`
27-
InitConfiguration kubeadmv1beta1.InitConfiguration `json:"initConfiguration,omitempty"`
28-
JoinConfiguration kubeadmv1beta1.JoinConfiguration `json:"joinConfiguration,omitempty"`
29-
// AdditionalUserDataFiles specifies extra files to be passed to user_data upon creation.
27+
// ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command
3028
// +optional
31-
AdditionalUserDataFiles []Files `json:"additionalUserDataFiles,omitempty"`
29+
ClusterConfiguration *kubeadmv1beta1.ClusterConfiguration `json:"clusterConfiguration,omitempty"`
30+
// InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command
31+
// +optional
32+
InitConfiguration *kubeadmv1beta1.InitConfiguration `json:"initConfiguration,omitempty"`
33+
// JoinConfiguration is the kubeadm configuration for the join command
34+
// +optional
35+
JoinConfiguration *kubeadmv1beta1.JoinConfiguration `json:"joinConfiguration,omitempty"`
3236
}
3337

3438
// KubeadmConfigStatus defines the observed state of KubeadmConfig

api/v1alpha2/zz_generated.deepcopy.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ package v1alpha2
2222

2323
import (
2424
runtime "k8s.io/apimachinery/pkg/runtime"
25+
"sigs.k8s.io/cluster-api-bootstrap-provider-kubeadm/kubeadm/v1beta1"
2526
)
2627

2728
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
@@ -101,13 +102,20 @@ func (in *KubeadmConfigList) DeepCopyObject() runtime.Object {
101102
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
102103
func (in *KubeadmConfigSpec) DeepCopyInto(out *KubeadmConfigSpec) {
103104
*out = *in
104-
in.ClusterConfiguration.DeepCopyInto(&out.ClusterConfiguration)
105-
in.InitConfiguration.DeepCopyInto(&out.InitConfiguration)
106-
in.JoinConfiguration.DeepCopyInto(&out.JoinConfiguration)
107-
if in.AdditionalUserDataFiles != nil {
108-
in, out := &in.AdditionalUserDataFiles, &out.AdditionalUserDataFiles
109-
*out = make([]Files, len(*in))
110-
copy(*out, *in)
105+
if in.ClusterConfiguration != nil {
106+
in, out := &in.ClusterConfiguration, &out.ClusterConfiguration
107+
*out = new(v1beta1.ClusterConfiguration)
108+
(*in).DeepCopyInto(*out)
109+
}
110+
if in.InitConfiguration != nil {
111+
in, out := &in.InitConfiguration, &out.InitConfiguration
112+
*out = new(v1beta1.InitConfiguration)
113+
(*in).DeepCopyInto(*out)
114+
}
115+
if in.JoinConfiguration != nil {
116+
in, out := &in.JoinConfiguration, &out.JoinConfiguration
117+
*out = new(v1beta1.JoinConfiguration)
118+
(*in).DeepCopyInto(*out)
111119
}
112120
}
113121

cloudinit/cloudinit.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,25 +38,25 @@ type BaseUserData struct {
3838
WriteFiles []v1alpha2.Files
3939
}
4040

41-
func generate(kind string, tpl string, data interface{}) (string, error) {
41+
func generate(kind string, tpl string, data interface{}) ([]byte, error) {
4242
tm := template.New(kind).Funcs(defaultTemplateFuncMap)
4343
if _, err := tm.Parse(filesTemplate); err != nil {
44-
return "", errors.Wrap(err, "failed to parse files template")
44+
return nil, errors.Wrap(err, "failed to parse files template")
4545
}
4646

4747
if _, err := tm.Parse(commandsTemplate); err != nil {
48-
return "", errors.Wrap(err, "failed to parse commands template")
48+
return nil, errors.Wrap(err, "failed to parse commands template")
4949
}
5050

5151
t, err := tm.Parse(tpl)
5252
if err != nil {
53-
return "", errors.Wrapf(err, "failed to parse %s template", kind)
53+
return nil, errors.Wrapf(err, "failed to parse %s template", kind)
5454
}
5555

5656
var out bytes.Buffer
5757
if err := t.Execute(&out, data); err != nil {
58-
return "", errors.Wrapf(err, "failed to generate %s template", kind)
58+
return nil, errors.Wrapf(err, "failed to generate %s template", kind)
5959
}
6060

61-
return out.String(), nil
61+
return out.Bytes(), nil
6262
}

cloudinit/controlplane_certs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ limitations under the License.
1717
package cloudinit
1818

1919
import (
20-
"errors"
20+
"github.com/pkg/errors"
2121
"sigs.k8s.io/cluster-api-bootstrap-provider-kubeadm/api/v1alpha2"
2222
)
2323

cloudinit/controlplane_init.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ limitations under the License.
1616

1717
package cloudinit
1818

19-
import (
20-
"github.com/pkg/errors"
21-
)
22-
2319
const (
2420
controlPlaneCloudInit = `{{.Header}}
2521
{{template "files" .WriteFiles}}
@@ -42,23 +38,23 @@ type ControlPlaneInput struct {
4238
BaseUserData
4339
Certificates
4440

45-
ClusterConfiguration string
46-
InitConfiguration string
41+
ClusterConfiguration []byte
42+
InitConfiguration []byte
4743
}
4844

4945
// NewInitControlPlane returns the user data string to be used on a controlplane instance.
50-
func NewInitControlPlane(input *ControlPlaneInput) (string, error) {
46+
func NewInitControlPlane(input *ControlPlaneInput) ([]byte, error) {
5147
input.Header = cloudConfigHeader
5248
if err := input.Certificates.validate(); err != nil {
53-
return "", errors.Wrapf(err, "ControlPlaneInput is invalid")
49+
return nil, err
5450
}
5551

5652
input.WriteFiles = certificatesToFiles(input.Certificates)
5753
input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...)
5854
userData, err := generate("InitControlplane", controlPlaneCloudInit, input)
5955
if err != nil {
60-
return "", errors.Wrapf(err, "failed to generate user data for new control plane machine")
56+
return nil, err
6157
}
6258

63-
return userData, err
59+
return userData, nil
6460
}

cloudinit/controlplane_join.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,28 +34,28 @@ runcmd:
3434
`
3535
)
3636

37-
// ControlPlaneJoinInput defines context to generate controlplane instance user data for controlplane node join.
37+
// ControlPlaneJoinInput defines context to generate controlplane instance user data for control plane node join.
3838
type ControlPlaneJoinInput struct {
3939
BaseUserData
4040
Certificates
4141

4242
BootstrapToken string
4343
ControlPlaneAddress string
44-
JoinConfiguration string
44+
JoinConfiguration []byte
4545
}
4646

47-
// NewJoinControlPlane returns the user data string to be used on a new contrplplane instance.
48-
func NewJoinControlPlane(input *ControlPlaneJoinInput) (string, error) {
47+
// NewJoinControlPlane returns the user data string to be used on a new control plane instance.
48+
func NewJoinControlPlane(input *ControlPlaneJoinInput) ([]byte, error) {
4949
input.Header = cloudConfigHeader
5050
if err := input.Certificates.validate(); err != nil {
51-
return "", errors.Wrapf(err, "ControlPlaneInput is invalid")
51+
return nil, errors.Wrapf(err, "ControlPlaneInput is invalid")
5252
}
5353

5454
input.WriteFiles = certificatesToFiles(input.Certificates)
5555
input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...)
5656
userData, err := generate("JoinControlplane", controlPlaneJoinCloudInit, input)
5757
if err != nil {
58-
return "", errors.Wrapf(err, "failed to generate user data for machine joining control plane")
58+
return nil, errors.Wrapf(err, "failed to generate user data for machine joining control plane")
5959
}
6060

6161
return userData, err

cloudinit/node.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ runcmd:
3535
type NodeInput struct {
3636
BaseUserData
3737

38-
JoinConfiguration string
38+
JoinConfiguration []byte
3939
}
4040

4141
// NewNode returns the user data string to be used on a node instance.
42-
func NewNode(input *NodeInput) (string, error) {
42+
func NewNode(input *NodeInput) ([]byte, error) {
4343
input.Header = cloudConfigHeader
4444
input.WriteFiles = append(input.WriteFiles, input.AdditionalFiles...)
4545
return generate("Node", nodeCloudInit, input)

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ spec:
2828
metadata:
2929
type: object
3030
spec:
31-
description: KubeadmConfigSpec defines the desired state of KubeadmConfig
31+
description: KubeadmConfigSpec defines the desired state of KubeadmConfig.
32+
Either ClusterConfiguration and InitConfiguration should be defined or
33+
the JoinConfiguration should be defined.
3234
properties:
3335
additionalUserDataFiles:
3436
description: AdditionalUserDataFiles specifies extra files to be passed
@@ -57,8 +59,8 @@ spec:
5759
type: object
5860
type: array
5961
clusterConfiguration:
60-
description: ClusterConfiguration contains cluster-wide configuration
61-
for a kubeadm cluster
62+
description: ClusterConfiguration along with InitConfiguration are the
63+
configurations necessary for the init command
6264
properties:
6365
apiServer:
6466
description: APIServer contains extra settings for the API server
@@ -375,8 +377,8 @@ spec:
375377
- networking
376378
type: object
377379
initConfiguration:
378-
description: InitConfiguration contains a list of elements that is specific
379-
"kubeadm init"-only runtime information.
380+
description: InitConfiguration along with ClusterConfiguration are the
381+
configurations necessary for the init command
380382
properties:
381383
apiVersion:
382384
description: 'APIVersion defines the versioned schema of this representation
@@ -525,8 +527,8 @@ spec:
525527
type: object
526528
type: object
527529
joinConfiguration:
528-
description: JoinConfiguration contains elements describing a particular
529-
node.
530+
description: JoinConfiguration is the kubeadm configuration for the
531+
join command
530532
properties:
531533
apiVersion:
532534
description: 'APIVersion defines the versioned schema of this representation
@@ -703,8 +705,6 @@ spec:
703705
- discovery
704706
- nodeRegistration
705707
type: object
706-
required:
707-
- clusterConfiguration
708708
type: object
709709
status:
710710
description: KubeadmConfigStatus defines the observed state of KubeadmConfig

controllers/control_plane_init_locker.go

Lines changed: 0 additions & 126 deletions
This file was deleted.

0 commit comments

Comments
 (0)