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{})
}
========= */