Skip to content

Commit 6a9ce9e

Browse files
authored
Merge pull request #646 from vitobotta:config-refactoring
Config refactoring
2 parents e2c14a5 + 53dd3ec commit 6a9ce9e

Some content is hidden

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

76 files changed

+999
-595
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ delete.log
3838
/.bws/
3939
/bitwarden-state/
4040
.env
41+
hetzner-k3s-bin

src/cluster/create.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class Cluster::Create
1313
private getter configuration : Configuration::Loader
1414
private getter hetzner_client : Hetzner::Client { configuration.hetzner_client }
1515
private getter settings : Configuration::Main { configuration.settings }
16-
private getter autoscaling_worker_node_pools : Array(Configuration::WorkerNodePool) { settings.worker_node_pools.select(&.autoscaling_enabled) }
16+
private getter autoscaling_worker_node_pools : Array(Configuration::Models::WorkerNodePool) { settings.worker_node_pools.select(&.autoscaling_enabled) }
1717
private getter ssh_client : Util::SSH { Util::SSH.new(settings.networking.ssh.private_key_path, settings.networking.ssh.public_key_path) }
1818
private getter network : Hetzner::Network?
1919
private getter ssh_key : Hetzner::SSHKey

src/cluster/network_manager.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Cluster::NetworkManager
1919
settings: settings,
2020
hetzner_client: hetzner_client,
2121
network_name: settings.cluster_name,
22-
network_zone: ::Configuration::Settings::NodePool::Location.network_zone_by_location(default_masters_Location)
22+
network_zone: ::Configuration::Validators::NodePoolConfig::Location.network_zone_by_location(default_masters_Location)
2323
).run
2424
end
2525

src/configuration/addons.cr

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

src/configuration/datastore.cr

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

src/configuration/loader.cr

Lines changed: 43 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,36 @@ require "../hetzner/client"
77
require "../hetzner/instance_type"
88
require "../hetzner/location"
99

10-
require "./settings/configuration_file_path"
11-
require "./settings/cluster_name"
12-
require "./settings/kubeconfig_path"
13-
require "./settings/k3s_version"
14-
require "./settings/new_k3s_version"
15-
require "./networking"
16-
require "./settings/node_pool"
17-
require "./settings/node_pool/autoscaling"
18-
require "./settings/node_pool/pool_name"
19-
require "./settings/node_pool/instance_type"
20-
require "./settings/node_pool/location"
21-
require "./settings/node_pool/instance_count"
22-
require "./settings/node_pool/node_labels"
23-
require "./settings/node_pool/node_taints"
24-
require "./settings/datastore"
10+
require "./validators/configuration_file_path"
11+
require "./validators/cluster_name"
12+
require "./validators/kubeconfig_path"
13+
require "./validators/k3s_version"
14+
require "./validators/new_k3s_version"
15+
require "./models/networking"
16+
require "./validators/node_pool"
17+
require "./validators/node_pool_config/autoscaling"
18+
require "./validators/node_pool_config/pool_name"
19+
require "./validators/node_pool_config/instance_type"
20+
require "./validators/node_pool_config/location"
21+
require "./validators/node_pool_config/instance_count"
22+
require "./validators/node_pool_config/labels"
23+
require "./validators/node_pool_config/taints"
24+
require "./validators/datastore"
25+
require "./validators/networking_config/allowed_networks"
26+
require "./validators/networking_config/cni_config/cilium"
27+
require "./validators/networking_config/cni"
28+
require "./validators/networking_config/private_network"
29+
require "./validators/networking_config/public_network"
30+
require "./validators/networking_config/ssh"
31+
require "./validators/networking"
32+
require "./validators/worker_node_pools"
33+
require "./validators/masters_pool"
34+
require "./validators/kubectl_presence"
35+
require "./validators/helm_presence"
36+
require "./validators/create_settings"
37+
require "./validators/upgrade_settings"
38+
require "./validators/run_settings"
39+
require "./validators/command_specific_settings"
2540
require "../util"
2641

2742
class Configuration::Loader
@@ -44,7 +59,7 @@ class Configuration::Loader
4459
Path[settings.kubeconfig_path].expand(home: true).to_s
4560
end
4661

47-
getter masters_pool : Configuration::MasterNodePool do
62+
getter masters_pool : Configuration::Models::MasterNodePool do
4863
settings.masters_pool
4964
end
5065

@@ -66,64 +81,32 @@ class Configuration::Loader
6681
def initialize(@configuration_file_path, @new_k3s_version, @force)
6782
@settings = Configuration::Main.from_yaml(File.read(configuration_file_path))
6883

69-
Settings::ConfigurationFilePath.new(errors, configuration_file_path).validate
84+
Configuration::Validators::ConfigurationFilePath.new(errors, configuration_file_path).validate
7085

7186
print_errors unless errors.empty?
7287
end
7388

7489
def validate(command)
7590
log_line "Validating configuration..."
7691

77-
Settings::ClusterName.new(errors, settings.cluster_name).validate
92+
Configuration::Validators::ClusterName.new(errors, settings.cluster_name).validate
7893

7994
validate_command_specific_settings(command)
8095

8196
print_validation_result
8297
end
8398

8499
private def validate_command_specific_settings(command)
85-
case command
86-
when :create
87-
validate_create_settings
88-
when :delete
89-
when :upgrade
90-
validate_upgrade_settings
91-
when :run
92-
validate_run_settings
93-
end
94-
end
95-
96-
private def validate_create_settings
97-
Settings::KubeconfigPath.new(errors, kubeconfig_path, file_must_exist: false).validate
98-
Settings::K3sVersion.new(errors, settings.k3s_version).validate
99-
Settings::Datastore.new(errors, settings.datastore).validate
100-
101-
settings.networking.validate(errors, settings, hetzner_client, settings.networking.private_network)
102-
103-
validate_masters_pool
104-
validate_worker_node_pools
105-
106-
validate_kubectl_presence
107-
validate_helm_presence
108-
end
109-
110-
private def validate_run_settings
111-
validate_kubectl_presence
112-
end
113-
114-
private def validate_upgrade_settings
115-
Settings::KubeconfigPath.new(errors, kubeconfig_path, file_must_exist: true).validate
116-
Settings::NewK3sVersion.new(errors, settings.k3s_version, new_k3s_version).validate
117-
118-
validate_kubectl_presence
119-
end
120-
121-
private def validate_kubectl_presence
122-
errors << "kubectl is not installed or not in PATH" unless which("kubectl")
123-
end
124-
125-
private def validate_helm_presence
126-
errors << "helm is not installed or not in PATH" unless which("helm")
100+
Configuration::Validators::CommandSpecificSettings.new(
101+
errors: errors,
102+
settings: settings,
103+
kubeconfig_path: kubeconfig_path,
104+
hetzner_client: hetzner_client,
105+
masters_pool: masters_pool,
106+
instance_types: instance_types,
107+
all_locations: all_locations,
108+
new_k3s_version: new_k3s_version
109+
).validate(command)
127110
end
128111

129112
private def print_validation_result
@@ -135,42 +118,6 @@ class Configuration::Loader
135118
end
136119
end
137120

138-
private def validate_masters_pool
139-
Settings::NodePool.new(
140-
errors: errors,
141-
pool: settings.masters_pool,
142-
pool_type: :masters,
143-
masters_pool: masters_pool,
144-
instance_types: instance_types,
145-
all_locations: all_locations,
146-
datastore: settings.datastore
147-
).validate
148-
end
149-
150-
private def validate_worker_node_pools
151-
node_pools = settings.worker_node_pools || [] of Configuration::WorkerNodePool
152-
153-
if node_pools.empty? && !settings.schedule_workloads_on_masters
154-
errors << "At least one worker node pool is required in order to schedule workloads"
155-
return
156-
end
157-
158-
names = node_pools.map(&.name)
159-
errors << "Each worker node pool must have a unique name" if names.uniq.size != names.size
160-
161-
node_pools.each do |pool|
162-
Settings::NodePool.new(
163-
errors: errors,
164-
pool: pool,
165-
pool_type: :workers,
166-
masters_pool: masters_pool,
167-
instance_types: instance_types,
168-
all_locations: all_locations,
169-
datastore: settings.datastore
170-
).validate
171-
end
172-
end
173-
174121
private def print_errors
175122
log_line "Some information in the configuration file requires your attention, aborting."
176123

src/configuration/main.cr

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
require "yaml"
22

3-
require "./master_node_pool"
4-
require "./worker_node_pool"
5-
require "./datastore"
6-
require "./manifests"
7-
require "./embedded_registry_mirror"
8-
require "./local_path_storage_class"
9-
require "./addons"
10-
require "./cluster_autoscaler"
3+
require "./models/master_node_pool"
4+
require "./models/worker_node_pool"
5+
require "./models/datastore"
6+
require "./models/manifests"
7+
require "./models/embedded_registry_mirror"
8+
require "./models/local_path_storage_class"
9+
require "./models/addons"
10+
require "./models/addons_config/cluster_autoscaler"
1111

1212
class Configuration::Main
1313
include YAML::Serializable
@@ -18,8 +18,8 @@ class Configuration::Main
1818
getter k3s_version : String
1919
getter api_server_hostname : String?
2020
getter schedule_workloads_on_masters : Bool = false
21-
getter masters_pool : Configuration::MasterNodePool
22-
getter worker_node_pools : Array(Configuration::WorkerNodePool) = [] of Configuration::WorkerNodePool
21+
getter masters_pool : Configuration::Models::MasterNodePool
22+
getter worker_node_pools : Array(Configuration::Models::WorkerNodePool) = [] of Configuration::Models::WorkerNodePool
2323
getter additional_pre_k3s_commands : Array(String) = [] of String
2424
getter additional_post_k3s_commands : Array(String) = [] of String
2525
getter additional_packages : Array(String) = [] of String
@@ -33,13 +33,13 @@ class Configuration::Main
3333
getter image : String = "ubuntu-24.04"
3434
getter autoscaling_image : String?
3535
getter snapshot_os : String = "default"
36-
getter networking : Configuration::Networking = Configuration::Networking.new
37-
getter datastore : Configuration::Datastore = Configuration::Datastore.new
38-
getter manifests : Configuration::Manifests = Configuration::Manifests.new
39-
getter embedded_registry_mirror : Configuration::EmbeddedRegistryMirror = Configuration::EmbeddedRegistryMirror.new
40-
getter local_path_storage_class : Configuration::LocalPathStorageClass = Configuration::LocalPathStorageClass.new
41-
getter addons : Configuration::Addons = Configuration::Addons.new
42-
getter cluster_autoscaler : Configuration::ClusterAutoscaler = Configuration::ClusterAutoscaler.new
36+
getter networking : Configuration::Models::Networking = Configuration::Models::Networking.new
37+
getter datastore : Configuration::Models::Datastore = Configuration::Models::Datastore.new
38+
getter manifests : Configuration::Models::Manifests = Configuration::Models::Manifests.new
39+
getter embedded_registry_mirror : Configuration::Models::EmbeddedRegistryMirror = Configuration::Models::EmbeddedRegistryMirror.new
40+
getter local_path_storage_class : Configuration::Models::LocalPathStorageClass = Configuration::Models::LocalPathStorageClass.new
41+
getter addons : Configuration::Models::Addons = Configuration::Models::Addons.new
42+
getter cluster_autoscaler : Configuration::Models::AddonsConfig::ClusterAutoscaler = Configuration::Models::AddonsConfig::ClusterAutoscaler.new
4343
getter include_instance_type_in_instance_name : Bool = false
4444
getter protect_against_deletion : Bool = true
4545
getter create_load_balancer_for_the_kubernetes_api : Bool = false

src/configuration/manifests.cr

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

src/configuration/models/addons.cr

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module Configuration
2+
module Models
3+
class Addons
4+
include YAML::Serializable
5+
include YAML::Serializable::Unmapped
6+
7+
# Generic toggle struct – can be extended later with more settings per addon
8+
class Toggle
9+
include YAML::Serializable
10+
include YAML::Serializable::Unmapped
11+
12+
getter enabled : Bool
13+
14+
def initialize(@enabled : Bool = true)
15+
end
16+
17+
def enabled?
18+
enabled
19+
end
20+
end
21+
22+
# Addon definitions with sensible defaults (true unless specified otherwise)
23+
getter csi_driver : Toggle = Toggle.new(true)
24+
getter traefik : Toggle = Toggle.new(false)
25+
getter servicelb : Toggle = Toggle.new(false)
26+
getter metrics_server : Toggle = Toggle.new(false)
27+
getter cloud_controller_manager : Toggle = Toggle.new(true)
28+
getter cluster_autoscaler : Toggle = Toggle.new(true)
29+
30+
def initialize
31+
end
32+
end
33+
end
34+
end

src/configuration/cluster_autoscaler.cr renamed to src/configuration/models/addons_config/cluster_autoscaler.cr

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require "yaml"
22

3-
class Configuration::ClusterAutoscaler
3+
class Configuration::Models::AddonsConfig::ClusterAutoscaler
44
include YAML::Serializable
55

66
property scan_interval : String = "10s"
@@ -11,8 +11,4 @@ class Configuration::ClusterAutoscaler
1111

1212
def initialize
1313
end
14-
15-
def initialize(pull : YAML::PullParser)
16-
previous_def(pull)
17-
end
1814
end

0 commit comments

Comments
 (0)