Skip to content

Commit 736b8d1

Browse files
committed
feat(controller): expose controller IG and named ports for LB integration
1 parent 36013bd commit 736b8d1

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 |
@@ -544,6 +545,10 @@ limitations under the License.
544545

545546
| Name | Description |
546547
| ---- | ----------- |
548+
| <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. |
549+
| <a name="output_controller_instance_names"></a> [controller\_instance\_names](#output\_controller\_instance\_names) | Names of the controller instances when HA is enabled. |
550+
| <a name="output_controller_mig_id"></a> [controller\_mig\_id](#output\_controller\_mig\_id) | Fully qualified group manager id (zonal or regional). |
551+
| <a name="output_controller_mig_name"></a> [controller\_mig\_name](#output\_controller\_mig\_name) | Name of the controller Managed Instance Group. |
547552
| <a name="output_instructions"></a> [instructions](#output\_instructions) | Post deployment instructions. |
548553
| <a name="output_munge_deprecation_warning"></a> [munge\_deprecation\_warning](#output\_munge\_deprecation\_warning) | Deprecation warning for legacy MUNGE authentication. |
549554
| <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
@@ -65,3 +65,31 @@ output "instructions" {
6565
gcloud logging read labels.hostname=${local.slurm_cluster_name}-controller
6666
EOT
6767
}
68+
output "controller_instance_group" {
69+
description = "Self-link of the controller instance group (zonal or regional) if HA is enabled."
70+
value = one(concat(
71+
google_compute_instance_group_manager.controller_zonal_mig[*].instance_group,
72+
google_compute_region_instance_group_manager.controller_regional_mig[*].instance_group
73+
))
74+
}
75+
76+
output "controller_mig_name" {
77+
description = "Name of the controller Managed Instance Group."
78+
value = one(concat(
79+
google_compute_instance_group_manager.controller_zonal_mig[*].name,
80+
google_compute_region_instance_group_manager.controller_regional_mig[*].name
81+
))
82+
}
83+
84+
output "controller_mig_id" {
85+
description = "Fully qualified group manager id (zonal or regional)."
86+
value = one(concat(
87+
google_compute_instance_group_manager.controller_zonal_mig[*].id,
88+
google_compute_region_instance_group_manager.controller_regional_mig[*].id
89+
))
90+
}
91+
92+
output "controller_instance_names" {
93+
description = "Names of the controller instances when HA is enabled."
94+
value = var.enable_backup_controller ? keys(local.mig_instances) : null
95+
}

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)