1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
use super::*;

pub use template::{KubeadmConfigTemplate, KubeadmConfigTemplateSpec};

mod template;

/// KubeadmConfigSpec defines the desired state of KubeadmConfig.
/// Either ClusterConfiguration and InitConfiguration should be defined or the JoinConfiguration should be defined.
#[skip_serializing_none]
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
// #[kube(
//     group = "infrastructure.cluster.x-k8s.io",
//     version = "v1beta1",
//     kind = "AWSCluster",
//     plural = "awsclusters",
//     status = "AWSClusterStatus"
// )]
// #[kube(namespaced)]
// #[kube(schema = "disabled")]
pub struct KubeadmConfigSpec {
    /// ClusterConfiguration along with InitConfiguration are the configurations necessary for the init command
    // +optional
    pub cluster_configuration: Option<ClusterConfiguration>, // `json:"clusterConfiguration,omitempty"`

    // InitConfiguration along with ClusterConfiguration are the configurations necessary for the init command
    // +optional
    pub init_configuration: Option<InitConfiguration>, // `json:"initConfiguration,omitempty"`

    /// JoinConfiguration is the kubeadm configuration for the join command
    // +optional
    pub join_configuration: Option<JoinConfiguration>, // `json:"joinConfiguration,omitempty"`

    /// Files specifies extra files to be passed to user_data upon creation.
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub files: Vec<File>, // `json:"files,omitempty"`

    /// DiskSetup specifies options for the creation of partition tables and file systems on devices.
    // +optional
    pub disk_setup: Option<DiskSetup>, // `json:"diskSetup,omitempty"`

    /// Mounts specifies a list of mount points to be setup.
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub mounts: Vec<MountPoints>, // `json:"mounts,omitempty"`

    /// PreKubeadmCommands specifies extra commands to run before kubeadm runs
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub pre_kubeadm_commands: Vec<String>, // `json:"preKubeadmCommands,omitempty"`

    /// PostKubeadmCommands specifies extra commands to run after kubeadm runs
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub post_kubeadm_commands: Vec<String>, // `json:"postKubeadmCommands,omitempty"`

    /// Users specifies extra users to add
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub users: Vec<User>, // `json:"users,omitempty"`

    /// NTP specifies NTP configuration
    // +optional
    pub ntp: Option<Ntp>, // `json:"ntp,omitempty"`

    /// Format specifies the output format of the bootstrap data
    // +optional
    pub format: Option<Format>, // `json:"format,omitempty"`

    // Verbosity is the number for the kubeadm log level verbosity.
    // It overrides the `--v` flag in kubeadm commands.
    // +optional
    pub verbosity: Option<i32>, // `json:"verbosity,omitempty"`

    // UseExperimentalRetryJoin replaces a basic kubeadm command with a shell
    // script with retries for joins.
    //
    // This is meant to be an experimental temporary workaround on some environments
    // where joins fail due to timing (and other issues). The long term goal is to add retries to
    // kubeadm proper and use that functionality.
    //
    // This will add about 40KB to userdata
    //
    // For more information, refer to https://github.com/kubernetes-sigs/cluster-api/pull/2763#discussion_r397306055.
    // +optional
    pub use_experimental_retry_join: Option<bool>, // `json:"useExperimentalRetryJoin,omitempty"`
}

/// File defines the input for generating write_files in cloud-init.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct File {
    /// Path specifies the full path on disk where to store the file.
    pub path: String, // `json:"path"`

    /// Owner specifies the ownership of the file, e.g. "root:root".
    // +optional
    pub owner: Option<String>, // `json:"owner,omitempty"`

    /// Permissions specifies the permissions to assign to the file, e.g. "0640".
    // +optional
    pub permissions: Option<String>, // `json:"permissions,omitempty"`

    /// Encoding specifies the encoding of the file contents.
    // +optional
    pub encoding: Option<Encoding>, // `json:"encoding,omitempty"`

    /// Content is the actual content of the file.
    // +optional
    pub content: Option<String>, // `json:"content,omitempty"`

    /// ContentFrom is a referenced source of content to populate the file.
    // +optional
    pub content_from: Option<FileSource>, // `json:"contentFrom,omitempty"`
}

/// DiskSetup defines input for generated disk_setup and fs_setup in cloud-init.
#[skip_serializing_none]
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DiskSetup {
    /// Partitions specifies the list of the partitions to setup.
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub partitions: Vec<Partition>, // `json:"partitions,omitempty"`

    /// Filesystems specifies the list of file systems to setup.
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub filesystems: Vec<Filesystem>, // `json:"filesystems,omitempty"`
}

/// MountPoints defines input for generated mounts in cloud-init.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MountPoints(Vec<String>);

/// User defines the input for a generated user in cloud-init.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
    /// Name specifies the user name
    pub name: String, // `json:"name"`

    /// Gecos specifies the gecos to use for the user
    // +optional
    pub gecos: Option<String>, // `json:"gecos,omitempty"`

    // Groups specifies the additional groups for the user
    // +optional
    pub groups: Option<String>, // `json:"groups,omitempty"`

    // HomeDir specifies the home directory to use for the user
    // +optional
    pub home_dir: Option<String>, // `json:"homeDir,omitempty"`

    // Inactive specifies whether to mark the user as inactive
    // +optional
    pub inactive: Option<bool>, // `json:"inactive,omitempty"`

    // Shell specifies the user's shell
    // +optional
    pub shell: Option<String>, // `json:"shell,omitempty"`

    // Passwd specifies a hashed password for the user
    // +optional
    pub passwd: Option<String>, // `json:"passwd,omitempty"`

    // PrimaryGroup specifies the primary group for the user
    // +optional
    pub primary_group: Option<String>, // `json:"primaryGroup,omitempty"`

    // LockPassword specifies if password login should be disabled
    // +optional
    pub lock_password: Option<bool>, // `json:"lockPassword,omitempty"`

    // Sudo specifies a sudo role for the user
    // +optional
    pub sudo: Option<String>, // `json:"sudo,omitempty"`

    // SSHAuthorizedKeys specifies a list of ssh authorized keys for the user
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub ssh_authorized_keys: Vec<String>, // `json:"sshAuthorizedKeys,omitempty"`
}

/// NTP defines input for generated ntp in cloud-init.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Ntp {
    /// Servers specifies which NTP servers to use
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub servers: Vec<String>, // `json:"servers,omitempty"`

    /// Enabled specifies whether NTP should be enabled
    // +optional
    pub enabled: Option<bool>, // `json:"enabled,omitempty"`
}

/// Format specifies the output format of the bootstrap data
// +kubebuilder:validation:Enum=cloud-config
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum Format {
    #[serde(rename = "cloud-config")]
    CloudConfig,
}

/// Encoding specifies the cloud-init file encoding.
// +kubebuilder:validation:Enum=base64;gzip;gzip+base64
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum Encoding {
    /// Base64 implies the contents of the file are encoded as base64.
    #[serde(rename = "base64")]
    Base64,
    /// Gzip implies the contents of the file are encoded with gzip.
    #[serde(rename = "gzip")]
    Gzip,
    /// GzipBase64 implies the contents of the file are first base64 encoded and then gzip encoded.
    #[serde(rename = "gzip+base64")]
    GzipBase64,
}

/// FileSource is a union of all possible external source types for file data.
/// Only one field may be populated in any given instance. Developers adding new
/// sources of data for target systems should add them here.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FileSource {
    /// Secret represents a secret that should populate this file.
    pub secret: SecretFileSource, // `json:"secret"`
}

/// SecretFileSource adapts a Secret into a FileSource.
///
/// The contents of the target Secret's Data field will be presented
/// as files using the keys in the Data field as the file names.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SecretFileSource {
    /// Name of the secret in the KubeadmBootstrapConfig's namespace to use.
    pub name: String, // `json:"name"`

    /// Key is the key in the secret's data map for this value.
    pub key: String, // `json:"key"`
}

/// Partition defines how to create and layout a partition.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Partition {
    /// Device is the name of the device.
    pub device: String, // `json:"device"`
    /// Layout specifies the device layout.
    /// If it is true, a single partition will be created for the entire device.
    /// When layout is false, it means don't partition or ignore existing partitioning.
    pub layout: bool, // `json:"layout"`
    /// Overwrite describes whether to skip checks and create the partition if a partition or filesystem is found on the device.
    /// Use with caution. Default is 'false'.
    // +optional
    pub overwrite: Option<bool>, // `json:"overwrite,omitempty"`
    /// TableType specifies the tupe of partition table. The following are supported:
    /// 'mbr': default and setups a MS-DOS partition table
    /// 'gpt': setups a GPT partition table
    // +optional
    pub table_type: Option<String>, // `json:"tableType,omitempty"`
}

// Filesystem defines the file systems to be created.
#[skip_serializing_none]
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Filesystem {
    /// Device specifies the device name
    pub device: String, // `json:"device"`
    /// Filesystem specifies the file system type.
    pub filesystem: String, // `json:"filesystem"`
    /// Label specifies the file system label to be used. If set to None, no label is used.
    pub label: String, // `json:"label"`
    /// Partition specifies the partition to use. The valid options are: "auto|any", "auto", "any", "none", and <NUM>, where NUM is the actual partition number.
    // +optional
    pub partition: Option<String>, // `json:"partition,omitempty"`
    /// Overwrite defines whether or not to overwrite any existing filesystem.
    /// If true, any pre-existing file system will be destroyed. Use with Caution.
    // +optional
    pub overwrite: Option<bool>, // `json:"overwrite,omitempty"`
    /// ReplaceFS is a special directive, used for Microsoft Azure that instructs cloud-init to replace a file system of <FS_TYPE>.
    /// NOTE: unless you define a label, this requires the use of the 'any' partition directive.
    // +optional
    #[serde(rename = "replaceFS")]
    pub replace_fs: Option<String>, // `json:"replaceFS,omitempty"`
    // ExtraOpts defined extra options to add to the command for creating the file system.
    // +optional
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub extra_opts: Vec<String>, // `json:"extraOpts,omitempty"`
}

/* =========
package v1beta1

import (
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
)



// KubeadmConfigStatus defines the observed state of KubeadmConfig.
type KubeadmConfigStatus struct {
    // Ready indicates the BootstrapData field is ready to be consumed
    // +optional
    Ready bool `json:"ready"`

    // DataSecretName is the name of the secret that stores the bootstrap data script.
    // +optional
    DataSecretName *string `json:"dataSecretName,omitempty"`

    // FailureReason will be set on non-retryable errors
    // +optional
    FailureReason string `json:"failureReason,omitempty"`

    // FailureMessage will be set on non-retryable errors
    // +optional
    FailureMessage string `json:"failureMessage,omitempty"`

    // ObservedGeneration is the latest generation observed by the controller.
    // +optional
    ObservedGeneration int64 `json:"observedGeneration,omitempty"`

    // Conditions defines current service state of the KubeadmConfig.
    // +optional
    Conditions clusterv1.Conditions `json:"conditions,omitempty"`
}

// +kubebuilder:object:root=true
// +kubebuilder:resource:path=kubeadmconfigs,scope=Namespaced,categories=cluster-api
// +kubebuilder:storageversion
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="Cluster",type="string",JSONPath=".metadata.labels['cluster\\.x-k8s\\.io/cluster-name']",description="Cluster"
// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="Time duration since creation of KubeadmConfig"

// KubeadmConfig is the Schema for the kubeadmconfigs API.
type KubeadmConfig struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   KubeadmConfigSpec   `json:"spec,omitempty"`
    Status KubeadmConfigStatus `json:"status,omitempty"`
}

// GetConditions returns the set of conditions for this object.
func (c *KubeadmConfig) GetConditions() clusterv1.Conditions {
    return c.Status.Conditions
}

// SetConditions sets the conditions on this object.
func (c *KubeadmConfig) SetConditions(conditions clusterv1.Conditions) {
    c.Status.Conditions = conditions
}

// +kubebuilder:object:root=true

// KubeadmConfigList contains a list of KubeadmConfig.
type KubeadmConfigList struct {
    metav1.TypeMeta `json:",inline"`
    metav1.ListMeta `json:"metadata,omitempty"`
    Items           []KubeadmConfig `json:"items"`
}

func init() {
    SchemeBuilder.Register(&KubeadmConfig{}, &KubeadmConfigList{})
}






========= */