diff --git a/python-clusters/create-aks-cluster/cluster.py b/python-clusters/create-aks-cluster/cluster.py index 61e81d4..34c3c4d 100644 --- a/python-clusters/create-aks-cluster/cluster.py +++ b/python-clusters/create-aks-cluster/cluster.py @@ -14,7 +14,7 @@ from dku_kube.nvidia_utils import add_gpu_driver_if_needed from dku_azure.auth import get_credentials_from_connection_info, get_credentials_from_connection_infoV2 from dku_azure.clusters import ClusterBuilder -from dku_azure.utils import run_and_process_cloud_error, get_instance_metadata, get_subscription_id +from dku_azure.utils import run_and_process_cloud_error, get_instance_metadata, get_subscription_id, determine_node_pool_mode class MyCluster(Cluster): def __init__(self, cluster_id, cluster_name, config, plugin_config): @@ -306,6 +306,7 @@ def start(self): # Node pools install_gpu_driver = False gpu_node_pools_taints = set() + is_there_system_node_pool = False for idx, node_pool_conf in enumerate(self.config.get("nodePools", [])): node_pool_builder = cluster_builder.get_node_pool_builder() node_pool_builder.with_idx(idx) @@ -328,7 +329,11 @@ def start(self): min_num_nodes=node_pool_conf.get("minNumNodes", None), max_num_nodes=node_pool_conf.get("maxNumNodes", None)) - node_pool_builder.with_mode(mode=node_pool_conf.get("mode", "Automatic"), + input_node_pool_mode = node_pool_conf.get("mode", "Automatic") + applied_node_pool_mode = determine_node_pool_mode(node_pool_conf.get("mode", "Automatic"), is_there_system_node_pool) + if applied_node_pool_mode == "System": + is_there_system_node_pool = True + node_pool_builder.with_mode(mode=applied_node_pool_mode, system_pods_only=node_pool_conf.get("systemPodsOnly", True)) node_pool_builder.with_disk_size_gb(disk_size_gb=node_pool_conf.get("osDiskSizeGb", 0)) diff --git a/python-lib/dku_azure/clusters.py b/python-lib/dku_azure/clusters.py index 6c79bf3..ffdc511 100644 --- a/python-lib/dku_azure/clusters.py +++ b/python-lib/dku_azure/clusters.py @@ -303,10 +303,7 @@ def with_availability_zones(self, use_availability_zones): def build(self): agent_pool_profile_params = {} - if self.mode == "Automatic" and self.idx == 0: - agent_pool_profile_params["mode"] = "System" - else: - agent_pool_profile_params["mode"] = self.mode + agent_pool_profile_params["mode"] = self.mode agent_pool_profile_params["name"] = "nodepool{}".format(self.idx) agent_pool_profile_params["type"] = self.agent_pool_type agent_pool_profile_params["vm_size"] = self.vm_size diff --git a/python-lib/dku_azure/utils.py b/python-lib/dku_azure/utils.py index 80c7977..03232ed 100644 --- a/python-lib/dku_azure/utils.py +++ b/python-lib/dku_azure/utils.py @@ -94,3 +94,11 @@ def get_host_network(credentials=None, resource_group=None, connection_info=None logging.info("VNET: {}".format(vnet)) logging.info("SUBNET ID: {}".format(subnet_id)) return vnet, subnet_id + +def determine_node_pool_mode(input_node_pool_mode, is_existing_system_node_pool): + if input_node_pool_mode != "Automatic": + return input_node_pool_mode + if is_existing_system_node_pool: + return "User" + else: + return "System" \ No newline at end of file diff --git a/python-runnables/add-node-pool/runnable.py b/python-runnables/add-node-pool/runnable.py index f7edfae..33b43de 100644 --- a/python-runnables/add-node-pool/runnable.py +++ b/python-runnables/add-node-pool/runnable.py @@ -97,7 +97,12 @@ def run(self, progress_callback): min_num_nodes=node_pool_config.get("minNumNodes", None), max_num_nodes=node_pool_config.get("maxNumNodes", None)) - node_pool_builder.with_mode(mode=node_pool_config.get("mode", "Automatic"), + input_node_pool_mode = node_pool_config.get("mode", "Automatic") + # The cluster cannot be created without a System node pool (error raised), + # deleting the last System node pool is not possible (error raised), + # so adding an Automatic node pool will always result in adding a User node pool + applied_node_pool_mode = "User" if input_node_pool_mode == "Automatic" else input_node_pool_mode + node_pool_builder.with_mode(mode=applied_node_pool_mode, system_pods_only=node_pool_config.get("systemPodsOnly", True)) node_pool_builder.with_disk_size_gb(disk_size_gb=node_pool_config.get("osDiskSizeGb", 0))