Skip to content

Commit c633db0

Browse files
committed
feat(controller): expose controller IG and named ports for LB integration
1 parent c84fa56 commit c633db0

4 files changed

Lines changed: 73 additions & 0 deletions

File tree

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ limitations under the License.
510510
| <a name="input_metadata"></a> [metadata](#input\_metadata) | Metadata, provided as a map. | `map(string)` | `{}` | no |
511511
| <a name="input_min_cpu_platform"></a> [min\_cpu\_platform](#input\_min\_cpu\_platform) | Specifies a minimum CPU platform. Applicable values are the friendly names of<br/>CPU platforms, such as Intel Haswell or Intel Skylake. See the complete list:<br/>https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform | `string` | `null` | no |
512512
| <a name="input_munge_mount"></a> [munge\_mount](#input\_munge\_mount) | Remote munge mount for compute and login nodes to acquire the munge.key.<br/>By default, the munge mount server will be assumed to be the<br/>`var.slurm_control_host` (or `var.slurm_control_addr` if non-null) when<br/>`server_ip=null`. | <pre>object({<br/> server_ip = string<br/> remote_mount = string<br/> fs_type = string<br/> mount_options = string<br/> })</pre> | <pre>{<br/> "fs_type": "nfs",<br/> "mount_options": "",<br/> "remote_mount": "/etc/munge/",<br/> "server_ip": null<br/>}</pre> | no |
513+
| <a name="input_named_ports"></a> [named\_ports](#input\_named\_ports) | Named ports for the controller instance group. | <pre>list(object({<br/> name = string<br/> port = number<br/> }))</pre> | `[]` | no |
513514
| <a name="input_network_storage"></a> [network\_storage](#input\_network\_storage) | An array of network attached storage mounts to be configured on all instances. | <pre>list(object({<br/> server_ip = string,<br/> remote_mount = string,<br/> local_mount = string,<br/> local_mount_owner = optional(string)<br/> local_mount_permissions = optional(string)<br/> fs_type = string,<br/> mount_options = string,<br/> client_install_runner = optional(map(string))<br/> mount_runner = optional(map(string))<br/> }))</pre> | `[]` | no |
514515
| <a name="input_nodeset"></a> [nodeset](#input\_nodeset) | Define nodesets, as a list. | <pre>list(object({<br/> node_count_static = optional(number, 0)<br/> node_count_dynamic_max = optional(number, 1)<br/> node_conf = optional(map(string), {})<br/> nodeset_name = string<br/> additional_disks = optional(list(object({<br/> disk_name = optional(string)<br/> device_name = optional(string)<br/> disk_size_gb = optional(number)<br/> disk_type = optional(string)<br/> disk_labels = optional(map(string), {})<br/> auto_delete = optional(bool, true)<br/> boot = optional(bool, false)<br/> disk_resource_manager_tags = optional(map(string), {})<br/> })), [])<br/> bandwidth_tier = optional(string, "platform_default")<br/> can_ip_forward = optional(bool, false)<br/> disk_auto_delete = optional(bool, true)<br/> disk_labels = optional(map(string), {})<br/> disk_resource_manager_tags = optional(map(string), {})<br/> disk_size_gb = optional(number)<br/> disk_type = optional(string)<br/> disk_encryption_key = optional(string)<br/> disk_encryption_key_service_account = optional(string)<br/> enable_confidential_vm = optional(bool, false)<br/> confidential_instance_type = optional(string)<br/> enable_placement = optional(bool, false)<br/> placement_max_distance = optional(number, null)<br/> enable_oslogin = optional(bool, true)<br/> enable_shielded_vm = optional(bool, false)<br/> enable_maintenance_reservation = optional(bool, false)<br/> enable_opportunistic_maintenance = optional(bool, false)<br/> gpu = optional(object({<br/> count = number<br/> type = string<br/> }))<br/> accelerator_topology = optional(string, null)<br/> dws_flex = object({<br/> enabled = bool<br/> max_run_duration = number<br/> use_job_duration = bool<br/> use_bulk_insert = bool<br/> })<br/> labels = optional(map(string), {})<br/> machine_type = optional(string)<br/> advanced_machine_features = object({<br/> enable_nested_virtualization = optional(bool)<br/> threads_per_core = optional(number)<br/> turbo_mode = optional(string)<br/> visible_core_count = optional(number)<br/> performance_monitoring_unit = optional(string)<br/> enable_uefi_networking = optional(bool)<br/> })<br/> maintenance_interval = optional(string)<br/> instance_properties_json = string<br/> metadata = optional(map(string), {})<br/> min_cpu_platform = optional(string)<br/> network_tier = optional(string, "STANDARD")<br/> network_storage = optional(list(object({<br/> server_ip = string<br/> remote_mount = string<br/> local_mount = string<br/> local_mount_owner = optional(string)<br/> local_mount_permissions = optional(string)<br/> fs_type = string<br/> mount_options = string<br/> client_install_runner = optional(map(string))<br/> mount_runner = optional(map(string))<br/> })), [])<br/> on_host_maintenance = optional(string)<br/> preemptible = optional(bool, false)<br/> region = optional(string)<br/> resource_manager_tags = optional(map(string), {})<br/> service_account = optional(object({<br/> email = optional(string)<br/> scopes = optional(list(string), ["https://www.googleapis.com/auth/cloud-platform"])<br/> }))<br/> shielded_instance_config = optional(object({<br/> enable_integrity_monitoring = optional(bool, true)<br/> enable_secure_boot = optional(bool, true)<br/> enable_vtpm = optional(bool, true)<br/> }))<br/> source_image_family = optional(string)<br/> source_image_project = optional(string)<br/> source_image = optional(string)<br/> subnetwork_self_link = string<br/> additional_networks = optional(list(object({<br/> network = string<br/> subnetwork = string<br/> subnetwork_project = string<br/> network_ip = string<br/> nic_type = string<br/> stack_type = string<br/> queue_count = number<br/> access_config = list(object({<br/> nat_ip = string<br/> network_tier = string<br/> }))<br/> ipv6_access_config = list(object({<br/> network_tier = string<br/> }))<br/> alias_ip_range = list(object({<br/> ip_cidr_range = string<br/> subnetwork_range_name = string<br/> }))<br/> })))<br/> access_config = optional(list(object({<br/> nat_ip = string<br/> network_tier = string<br/> })))<br/> spot = optional(bool, false)<br/> tags = optional(list(string), [])<br/> termination_action = optional(string)<br/> reservation_name = optional(string)<br/> future_reservation = string<br/> startup_script = optional(list(object({<br/> filename = string<br/> content = string })), [])<br/><br/> zone_target_shape = string<br/> zone_policy_allow = set(string)<br/> zone_policy_deny = set(string)<br/> }))</pre> | `[]` | no |
515516
| <a name="input_nodeset_dyn"></a> [nodeset\_dyn](#input\_nodeset\_dyn) | Defines dynamic nodesets, as a list. | <pre>list(object({<br/> nodeset_name = string<br/> nodeset_feature = string<br/> }))</pre> | `[]` | no |
@@ -545,6 +546,10 @@ limitations under the License.
545546

546547
| Name | Description |
547548
| ---- | ----------- |
549+
| <a name="output_controller_instance_group"></a> [controller\_instance\_group](#output\_controller\_instance\_group) | Self-link of the controller instance group (zonal or regional) if HA is enabled. |
550+
| <a name="output_controller_instance_names"></a> [controller\_instance\_names](#output\_controller\_instance\_names) | Names of the controller instances when HA is enabled. |
551+
| <a name="output_controller_mig_id"></a> [controller\_mig\_id](#output\_controller\_mig\_id) | Fully qualified group manager id (zonal or regional). |
552+
| <a name="output_controller_mig_name"></a> [controller\_mig\_name](#output\_controller\_mig\_name) | Name of the controller Managed Instance Group. |
548553
| <a name="output_instructions"></a> [instructions](#output\_instructions) | Post deployment instructions. |
549554
| <a name="output_munge_deprecation_warning"></a> [munge\_deprecation\_warning](#output\_munge\_deprecation\_warning) | Deprecation warning for legacy MUNGE authentication. |
550555
| <a name="output_slurm_bucket"></a> [slurm\_bucket](#output\_slurm\_bucket) | GCS Bucket of Slurm cluster file storage. |

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/controller.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,14 @@ resource "google_compute_instance_group_manager" "controller_zonal_mig" {
293293
port = var.health_check.port
294294
}
295295

296+
dynamic "named_port" {
297+
for_each = var.named_ports
298+
content {
299+
name = named_port.value.name
300+
port = named_port.value.port
301+
}
302+
}
303+
296304
version {
297305
instance_template = module.slurm_controller_template.self_link
298306
}
@@ -332,6 +340,14 @@ resource "google_compute_region_instance_group_manager" "controller_regional_mig
332340
port = var.health_check.port
333341
}
334342

343+
dynamic "named_port" {
344+
for_each = var.named_ports
345+
content {
346+
name = named_port.value.name
347+
port = named_port.value.port
348+
}
349+
}
350+
335351
version {
336352
instance_template = module.slurm_controller_template.self_link
337353
}

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/outputs.tf

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,31 @@ output "slurm_control_host_port" {
7070
description = "The port number that the Slurm controller, slurmctld, listens to for work."
7171
value = var.slurm_control_host_port
7272
}
73+
output "controller_instance_group" {
74+
description = "Self-link of the controller instance group (zonal or regional) if HA is enabled."
75+
value = one(concat(
76+
google_compute_instance_group_manager.controller_zonal_mig[*].instance_group,
77+
google_compute_region_instance_group_manager.controller_regional_mig[*].instance_group
78+
))
79+
}
80+
81+
output "controller_mig_name" {
82+
description = "Name of the controller Managed Instance Group."
83+
value = one(concat(
84+
google_compute_instance_group_manager.controller_zonal_mig[*].name,
85+
google_compute_region_instance_group_manager.controller_regional_mig[*].name
86+
))
87+
}
88+
89+
output "controller_mig_id" {
90+
description = "Fully qualified group manager id (zonal or regional)."
91+
value = one(concat(
92+
google_compute_instance_group_manager.controller_zonal_mig[*].id,
93+
google_compute_region_instance_group_manager.controller_regional_mig[*].id
94+
))
95+
}
96+
97+
output "controller_instance_names" {
98+
description = "Names of the controller instances when HA is enabled."
99+
value = var.enable_backup_controller ? keys(local.mig_instances) : null
100+
}

community/modules/scheduler/schedmd-slurm-gcp-v6-controller/variables_controller_instance.tf

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,3 +488,27 @@ variable "health_check" {
488488
error_message = "The health_check.timeout_sec must be less than or equal to health_check.check_interval_sec."
489489
}
490490
}
491+
492+
variable "named_ports" {
493+
description = "Named ports for the controller instance group."
494+
type = list(object({
495+
name = string
496+
port = number
497+
}))
498+
default = []
499+
500+
validation {
501+
condition = alltrue([for p in var.named_ports : p.port > 0 && p.port <= 65535])
502+
error_message = "All named port numbers must be between 1 and 65535."
503+
}
504+
505+
validation {
506+
condition = alltrue([for p in var.named_ports : can(regex("^[a-z]([-a-z0-9]*[a-z0-9])?$", p.name)) && length(p.name) <= 63])
507+
error_message = "All named port names must be valid RFC 1035 labels (1-63 characters, lowercase letters, numbers, or hyphens, starting with a letter and ending with a letter or number)."
508+
}
509+
510+
validation {
511+
condition = length(var.named_ports) == length(distinct([for p in var.named_ports : p.name]))
512+
error_message = "All named port names must be unique."
513+
}
514+
}

0 commit comments

Comments
 (0)