From 28b6c91c3e0b61af06224a5f66d77a316b12a442 Mon Sep 17 00:00:00 2001 From: Ross Thomson Date: Fri, 7 Aug 2026 20:51:19 +0000 Subject: [PATCH] WIP: Symphony integration TAG=agy CONV=58caca3f-0bc2-49af-961f-de3865579be4 --- .../modules/instance_template/README.md | 75 ---- .../modules/instance_template/main.tf | 227 ---------- .../modules/instance_template/outputs.tf | 28 -- .../modules/instance_template/variables.tf | 393 ------------------ .../modules/instance_template/versions.tf | 30 -- .../modules/logging_sink/README.md | 37 -- .../modules/logging_sink/main.tf | 49 --- .../modules/logging_sink/output.tf | 23 - .../modules/logging_sink/variables.tf | 50 --- .../modules/pubsub_subscription/README.md | 36 -- .../modules/pubsub_subscription/main.tf | 28 -- .../modules/pubsub_subscription/output.tf | 23 - .../modules/pubsub_subscription/variables.tf | 58 --- .../modules/pubsub_topic/README.md | 33 -- .../modules/pubsub_topic/main.tf | 37 -- .../modules/pubsub_topic/outputs.tf | 23 - .../modules/pubsub_topic/variables.tf | 43 -- .../scripts/hf-gce_symphony.sh | 7 +- .../scripts/install_symphony.sh | 8 + ibm-symphony-on-gcp/symphony.yaml | 59 +-- ibm-symphony-on-gcp/symphony_deployment.yaml | 16 +- 21 files changed, 57 insertions(+), 1226 deletions(-) delete mode 100644 ibm-symphony-on-gcp/modules/instance_template/README.md delete mode 100644 ibm-symphony-on-gcp/modules/instance_template/main.tf delete mode 100644 ibm-symphony-on-gcp/modules/instance_template/outputs.tf delete mode 100644 ibm-symphony-on-gcp/modules/instance_template/variables.tf delete mode 100644 ibm-symphony-on-gcp/modules/instance_template/versions.tf delete mode 100644 ibm-symphony-on-gcp/modules/logging_sink/README.md delete mode 100644 ibm-symphony-on-gcp/modules/logging_sink/main.tf delete mode 100644 ibm-symphony-on-gcp/modules/logging_sink/output.tf delete mode 100644 ibm-symphony-on-gcp/modules/logging_sink/variables.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_subscription/README.md delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_subscription/main.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_subscription/output.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_subscription/variables.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_topic/README.md delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_topic/main.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_topic/outputs.tf delete mode 100644 ibm-symphony-on-gcp/modules/pubsub_topic/variables.tf diff --git a/ibm-symphony-on-gcp/modules/instance_template/README.md b/ibm-symphony-on-gcp/modules/instance_template/README.md deleted file mode 100644 index 4217ade..0000000 --- a/ibm-symphony-on-gcp/modules/instance_template/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# Terraform Google Compute Engine Instance Template Module - -This module creates a Google Compute Engine instance template. - -## Usage - -```hcl -module "instance_template" { - source = "./modules/instance_template" - project_id = "your-gcp-project-id" - name_prefix = "my-instance-template" - machine_type = "n2-standard-2" - region = "us-central1" - service_account_email = "your-service-account@your-project.iam.gserviceaccount.com" - subnetwork_self_link = "projects/your-project/regions/us-central1/subnetworks/your-subnetwork" -} -``` - -## Inputs - -| Name | Description | Type | Default | Required | -| --------------------------- | ------------------------------------------------------------------------ | ------------- | ----------------------------------------------------- | :------: | -| `project_id` | The GCP project ID. | `string` | `null` | yes | -| `name_prefix` | Name prefix for the instance template. | `string` | n/a | yes | -| `machine_type` | Machine type to create, e.g. n1-standard-1. | `string` | `"n1-standard-1"` | no | -| `min_cpu_platform` | Specifies a minimum CPU platform. | `string` | `null` | no | -| `can_ip_forward` | Enable IP forwarding. | `string` | `"false"` | no | -| `tags` | Network tags, provided as a list. | `list(string)`| `[]` | no | -| `labels` | Labels, provided as a map. | `map(string)` | `{}` | no | -| `preemptible` | Allow the instance to be preempted. | `bool` | `false` | no | -| `spot` | Provision as a SPOT preemptible instance. | `bool` | `false` | no | -| `instance_termination_action`| Action to take when Compute Engine preempts the VM (`STOP` or `DELETE`). | `string` | `null` | no | -| `automatic_restart` | Specifies whether the instance should be automatically restarted. | `bool` | `true` | no | -| `on_host_maintenance` | Instance availability Policy. | `string` | `"MIGRATE"` | no | -| `region` | Region where the instance template should be created. | `string` | n/a | yes | -| `advanced_machine_features` | Advanced machine features. | `object` | n/a | yes | -| `resource_manager_tags` | A set of key/value resource manager tag pairs to bind to the instances. | `map(string)` | `{}` | no | -| `source_image` | Source disk image. | `string` | `""` | no | -| `source_image_family` | Source image family. | `string` | `"centos-7"` | no | -| `source_image_project` | Project where the source image comes from. | `string` | `"centos-cloud"` | no | -| `disk_size_gb` | Boot disk size in GB. | `string` | `"100"` | no | -| `disk_type` | Boot disk type. | `string` | `"pd-standard"` | no | -| `disk_labels` | Labels to be assigned to boot disk. | `map(string)` | `{}` | no | -| `disk_encryption_key` | The id of the encryption key to use to encrypt all the disks. | `string` | `null` | no | -| `auto_delete` | Whether or not the boot disk should be auto-deleted. | `string` | `"true"` | no | -| `disk_resource_manager_tags`| Key/value resource manager tag pairs to bind to the instance disks. | `map(string)` | `{}` | no | -| `additional_disks` | List of maps of additional disks. | `list(object)`| `[]` | no | -| `network` | The name or self_link of the network to attach this interface to. | `string` | `""` | no | -| `nic_type` | The type of vNIC to be used on this interface (GVNIC, VIRTIO_NET). | `string` | `null` | no | -| `subnetwork_self_link` | The self link of the subnetwork to attach the VM. | `string` | `null` | no | -| `network_ip` | Private IP address to assign to the instance. | `string` | `""` | no | -| `stack_type` | The stack type for this network interface (IPV4_IPV6 or IPV4_ONLY). | `string` | `null` | no | -| `additional_networks` | Additional network interface details. | `list(object)`| `[]` | no | -| `total_egress_bandwidth_tier`| Network bandwidth tier (TIER_1 or DEFAULT). | `string` | `"DEFAULT"` | no | -| `startup_script` | User startup script to run when instances spin up. | `string` | `""` | no | -| `metadata` | Metadata, provided as a map. | `map(string)` | `{}` | no | -| `enable_shielded_vm` | Whether to enable the Shielded VM configuration. | `bool` | `false` | no | -| `shielded_instance_config` | Shielded VM configuration for the instance. | `object` | `{...}` | no | -| `enable_confidential_vm` | Whether to enable the Confidential VM configuration. | `bool` | `false` | no | -| `service_account_email` | Service account to run VMs. | `string` | n/a | yes | -| `access_config` | Access configurations for public IPs. | `list(object)`| `[]` | no | -| `ipv6_access_config` | IPv6 access configurations. | `list(object)`| `[]` | no | -| `gpu` | GPU information (type and count). | `object` | `null` | no | -| `alias_ip_range` | An array of alias IP ranges for this network interface. | `object` | `null` | no | -| `max_run_duration` | The duration in seconds of the instance. | `number` | `null` | no | -| `provisioning_model` | The provisioning model of the instance. | `string` | `null` | no | -| `reservation_affinity` | Specifies the reservations that this instance can consume from. | `object` | `null` | no | - -## Outputs - -| Name | Description | -| ---------- | ----------------------------------------- | -| `self_link`| Self-link of instance template. | -| `name` | Name of instance template. | -| `tags` | Tags that will be associated with instance(s). | \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/instance_template/main.tf b/ibm-symphony-on-gcp/modules/instance_template/main.tf deleted file mode 100644 index 9be7cc0..0000000 --- a/ibm-symphony-on-gcp/modules/instance_template/main.tf +++ /dev/null @@ -1,227 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -######### -# Locals -######### - -locals { - source_image = var.source_image != "" ? var.source_image : "centos-7-v20201112" - source_image_family = var.source_image_family != "" ? var.source_image_family : "centos-7" - source_image_project = var.source_image_project != "" ? var.source_image_project : "centos-cloud" - - boot_disk = [ - { - source_image = var.source_image != "" ? format("${local.source_image_project}/${local.source_image}") : format("${local.source_image_project}/${local.source_image_family}") - disk_size_gb = var.disk_size_gb - disk_type = var.disk_type - disk_labels = var.disk_labels - auto_delete = var.auto_delete - disk_resource_manager_tags = var.disk_resource_manager_tags - boot = "true" - }, - ] - - all_disks = concat(local.boot_disk, var.additional_disks) - - # NOTE: Even if all the shielded_instance_config or confidential_instance_config - # values are false, if the config block exists and an unsupported image is chosen, - # the apply will fail so we use a single-value array with the default value to - # initialize the block only if it is enabled. - shielded_vm_configs = var.enable_shielded_vm ? [true] : [] - - gpu_enabled = var.gpu != null - alias_ip_range_enabled = var.alias_ip_range != null - preemptible = var.preemptible || var.spot - on_host_maintenance = ( - local.preemptible || var.enable_confidential_vm || local.gpu_enabled - ? "TERMINATE" - : var.on_host_maintenance - ) - automatic_restart = ( - # must be false when preemptible is true - local.preemptible ? false : var.automatic_restart - ) - - nic_type = var.total_egress_bandwidth_tier == "TIER_1" ? "GVNIC" : var.nic_type - - - provisioning_model = coalesce(var.provisioning_model, local.preemptible ? "SPOT" : "STANDARD") -} - -data "google_project" "this" { - project_id = var.project_id -} - -#################### -# Instance Template -#################### -resource "google_compute_instance_template" "tpl" { - provider = google-beta - name_prefix = "${var.name_prefix}-" - project = var.project_id - machine_type = var.machine_type - labels = var.labels - metadata = var.metadata - tags = var.tags - can_ip_forward = var.can_ip_forward - metadata_startup_script = var.startup_script - region = var.region - min_cpu_platform = var.min_cpu_platform - resource_manager_tags = var.resource_manager_tags - - service_account { - email = var.service_account_email - scopes = ["cloud-platform"] - } - - - dynamic "disk" { - for_each = local.all_disks - content { - auto_delete = lookup(disk.value, "auto_delete", null) - boot = lookup(disk.value, "boot", null) - device_name = lookup(disk.value, "device_name", null) - disk_name = lookup(disk.value, "disk_name", null) - disk_size_gb = lookup(disk.value, "disk_size_gb", lookup(disk.value, "disk_type", null) == "local-ssd" ? "375" : null) - disk_type = lookup(disk.value, "disk_type", null) - interface = lookup(disk.value, "interface", lookup(disk.value, "disk_type", null) == "local-ssd" ? "NVME" : null) - mode = lookup(disk.value, "mode", null) - source = lookup(disk.value, "source", null) - source_image = lookup(disk.value, "source_image", null) - type = lookup(disk.value, "disk_type", null) == "local-ssd" ? "SCRATCH" : "PERSISTENT" - labels = (lookup(disk.value, "source", null) != null || lookup(disk.value, "disk_type", null) == "local-ssd") ? null : lookup(disk.value, "disk_labels", null) - resource_manager_tags = lookup(disk.value, "disk_resource_manager_tags", {}) - - dynamic "disk_encryption_key" { - for_each = compact([var.disk_encryption_key == null ? null : 1]) - content { - kms_key_self_link = var.disk_encryption_key - } - } - } - } - - network_interface { - network = var.network - subnetwork = var.subnetwork_self_link - network_ip = try(coalesce(var.network_ip), null) - nic_type = local.nic_type - stack_type = var.stack_type - dynamic "access_config" { - for_each = var.access_config - content { - nat_ip = access_config.value.nat_ip - network_tier = access_config.value.network_tier - } - } - dynamic "ipv6_access_config" { - for_each = var.ipv6_access_config - content { - network_tier = ipv6_access_config.value.network_tier - } - } - dynamic "alias_ip_range" { - for_each = local.alias_ip_range_enabled ? [var.alias_ip_range] : [] - content { - ip_cidr_range = alias_ip_range.value.ip_cidr_range - subnetwork_range_name = alias_ip_range.value.subnetwork_range_name - } - } - } - - dynamic "network_interface" { - for_each = var.additional_networks - content { - network = network_interface.value.network - subnetwork = network_interface.value.subnetwork - subnetwork_project = network_interface.value.subnetwork_project - network_ip = try(coalesce(network_interface.value.network_ip), null) - nic_type = try(coalesce(network_interface.value.nic_type), null) - dynamic "access_config" { - for_each = network_interface.value.access_config - content { - nat_ip = access_config.value.nat_ip - network_tier = access_config.value.network_tier - } - } - dynamic "ipv6_access_config" { - for_each = network_interface.value.ipv6_access_config - content { - network_tier = ipv6_access_config.value.network_tier - } - } - } - } - - network_performance_config { - total_egress_bandwidth_tier = coalesce(var.total_egress_bandwidth_tier, "DEFAULT") - } - - lifecycle { - create_before_destroy = "true" - } - - scheduling { - preemptible = local.preemptible - provisioning_model = local.provisioning_model - automatic_restart = local.automatic_restart - on_host_maintenance = local.on_host_maintenance - instance_termination_action = var.instance_termination_action - - dynamic "max_run_duration" { - for_each = var.max_run_duration != null ? [var.max_run_duration] : [] - content { - seconds = max_run_duration.value - } - } - } - - dynamic "reservation_affinity" { - for_each = var.reservation_affinity != null ? [var.reservation_affinity] : [] - content { - type = reservation_affinity.value.type - } - } - - advanced_machine_features { - enable_nested_virtualization = var.advanced_machine_features.enable_nested_virtualization - threads_per_core = var.advanced_machine_features.threads_per_core - turbo_mode = var.advanced_machine_features.turbo_mode - visible_core_count = var.advanced_machine_features.visible_core_count - performance_monitoring_unit = var.advanced_machine_features.performance_monitoring_unit - enable_uefi_networking = var.advanced_machine_features.enable_uefi_networking - } - - dynamic "shielded_instance_config" { - for_each = local.shielded_vm_configs - content { - enable_secure_boot = lookup(var.shielded_instance_config, "enable_secure_boot", shielded_instance_config.value) - enable_vtpm = lookup(var.shielded_instance_config, "enable_vtpm", shielded_instance_config.value) - enable_integrity_monitoring = lookup(var.shielded_instance_config, "enable_integrity_monitoring", shielded_instance_config.value) - } - } - - confidential_instance_config { - enable_confidential_compute = var.enable_confidential_vm - } - - dynamic "guest_accelerator" { - for_each = local.gpu_enabled ? [var.gpu] : [] - content { - type = guest_accelerator.value.type - count = guest_accelerator.value.count - } - } -} diff --git a/ibm-symphony-on-gcp/modules/instance_template/outputs.tf b/ibm-symphony-on-gcp/modules/instance_template/outputs.tf deleted file mode 100644 index 05018e0..0000000 --- a/ibm-symphony-on-gcp/modules/instance_template/outputs.tf +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -output "self_link" { - description = "Self-link of instance template" - value = google_compute_instance_template.tpl.self_link -} - -output "name" { - description = "Name of instance template" - value = google_compute_instance_template.tpl.name -} - -output "tags" { - description = "Tags that will be associated with instance(s)" - value = google_compute_instance_template.tpl.tags -} diff --git a/ibm-symphony-on-gcp/modules/instance_template/variables.tf b/ibm-symphony-on-gcp/modules/instance_template/variables.tf deleted file mode 100644 index 609518d..0000000 --- a/ibm-symphony-on-gcp/modules/instance_template/variables.tf +++ /dev/null @@ -1,393 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "project_id" { - type = string - description = "The GCP project ID" - default = null -} - -variable "name_prefix" { - description = "Name prefix for the instance template" - type = string -} - -variable "machine_type" { - description = "Machine type to create, e.g. n1-standard-1" - type = string - default = "n1-standard-1" -} - -variable "min_cpu_platform" { - description = "Specifies a minimum CPU platform. Applicable values are the friendly names of CPU platforms, such as Intel Haswell or Intel Skylake. See the complete list: https://cloud.google.com/compute/docs/instances/specify-min-cpu-platform" - type = string - default = null -} - -variable "can_ip_forward" { - description = "Enable IP forwarding, for NAT instances for example" - type = string - default = "false" -} - -variable "tags" { - type = list(string) - description = "Network tags, provided as a list" - default = [] -} - -variable "labels" { - type = map(string) - description = "Labels, provided as a map" - default = {} -} - -variable "preemptible" { - type = bool - description = "Allow the instance to be preempted" - default = false -} - -variable "spot" { - description = <<-EOD - Provision as a SPOT preemptible instance. - See https://cloud.google.com/compute/docs/instances/spot for more details. - EOD - type = bool - default = false -} - -variable "instance_termination_action" { - description = <<-EOD - Which action to take when Compute Engine preempts the VM. Value can be: 'STOP', 'DELETE'. The default value is 'STOP'. - See https://cloud.google.com/compute/docs/instances/spot for more details. - EOD - type = string - default = null -} - -variable "automatic_restart" { - type = bool - description = "(Optional) Specifies whether the instance should be automatically restarted if it is terminated by Compute Engine (not terminated by a user)." - default = true -} - -variable "on_host_maintenance" { - type = string - description = "Instance availability Policy" - default = "MIGRATE" -} - -variable "region" { - type = string - description = "Region where the instance template should be created." - nullable = false -} - -variable "advanced_machine_features" { - description = "See https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance_template#nested_advanced_machine_features" - type = object({ - enable_nested_virtualization = optional(bool) - threads_per_core = optional(number) - turbo_mode = optional(string) - visible_core_count = optional(number) - performance_monitoring_unit = optional(string) - enable_uefi_networking = optional(bool) - }) -} - -variable "resource_manager_tags" { - description = "(Optional) A set of key/value resource manager tag pairs to bind to the instances. Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/456." - type = map(string) - default = {} - validation { - condition = alltrue([for value in var.resource_manager_tags : can(regex("tagValues/[0-9]+", value))]) - error_message = "All Resource Manager tag values should be in the format 'tagValues/[0-9]+'" - } - validation { - condition = alltrue([for value in keys(var.resource_manager_tags) : can(regex("tagKeys/[0-9]+", value))]) - error_message = "All Resource Manager tag keys should be in the format 'tagKeys/[0-9]+'" - } -} - -####### -# disk -####### -variable "source_image" { - description = "Source disk image. If neither source_image nor source_image_family is specified, defaults to the latest public CentOS image." - type = string - default = "" -} - -variable "source_image_family" { - description = "Source image family. If neither source_image nor source_image_family is specified, defaults to the latest public CentOS image." - type = string - default = "centos-7" -} - -variable "source_image_project" { - description = "Project where the source image comes from. The default project contains CentOS images." - type = string - default = "centos-cloud" -} - -variable "disk_size_gb" { - description = "Boot disk size in GB" - type = string - default = "100" -} - -variable "disk_type" { - description = "Boot disk type, can be either pd-ssd, local-ssd, or pd-standard" - type = string - default = "pd-standard" -} - -variable "disk_labels" { - description = "Labels to be assigned to boot disk, provided as a map" - type = map(string) - default = {} -} - -variable "disk_encryption_key" { - description = "The id of the encryption key that is stored in Google Cloud KMS to use to encrypt all the disks on this instance" - type = string - default = null -} - -variable "auto_delete" { - description = "Whether or not the boot disk should be auto-deleted" - type = string - default = "true" -} - -variable "disk_resource_manager_tags" { - description = "(Optional) A set of key/value resource manager tag pairs to bind to the instance disks. Keys must be in the format tagKeys/{tag_key_id}, and values are in the format tagValues/456." - type = map(string) - default = {} - validation { - condition = alltrue([for value in var.disk_resource_manager_tags : can(regex("tagValues/[0-9]+", value))]) - error_message = "All Resource Manager tag values should be in the format 'tagValues/[0-9]+'" - } - validation { - condition = alltrue([for value in keys(var.disk_resource_manager_tags) : can(regex("tagKeys/[0-9]+", value))]) - error_message = "All Resource Manager tag keys should be in the format 'tagKeys/[0-9]+'" - } -} - -variable "additional_disks" { - description = "List of maps of additional disks. See https://www.terraform.io/docs/providers/google/r/compute_instance_template#disk_name" - type = list(object({ - source = optional(string) - disk_name = optional(string) - device_name = string - auto_delete = bool - boot = bool - disk_size_gb = optional(number) - disk_type = optional(string) - disk_labels = map(string) - disk_resource_manager_tags = map(string) - })) - default = [] -} - -#################### -# network_interface -#################### -variable "network" { - description = "The name or self_link of the network to attach this interface to. Use network attribute for Legacy or Auto subnetted networks and subnetwork for custom subnetted networks." - type = string - default = "" -} - -variable "nic_type" { - description = "The type of vNIC to be used on this interface. Possible values: GVNIC, VIRTIO_NET." - type = string - default = null -} - -variable "network_self_link" { - description = "The self link of the network to attach the NFS VM." - type = string - default = "default" -} - -variable "subnetwork_self_link" { - description = "The self link of the subnetwork to attach the NFS VM." - type = string - default = null -} - -variable "network_ip" { - description = "Private IP address to assign to the instance if desired." - type = string - default = "" -} - -variable "stack_type" { - description = "The stack type for this network interface to identify whether the IPv6 feature is enabled or not. Values are `IPV4_IPV6` or `IPV4_ONLY`. Default behavior is equivalent to IPV4_ONLY." - type = string - default = null -} - -variable "additional_networks" { - description = "Additional network interface details for GCE, if any." - default = [] - type = list(object({ - network = string - subnetwork = string - subnetwork_project = string - network_ip = string - nic_type = string - access_config = list(object({ - nat_ip = string - network_tier = string - })) - ipv6_access_config = list(object({ - network_tier = string - })) - })) -} - -variable "total_egress_bandwidth_tier" { - description = <= ERROR"` | no | - -## Outputs - -| Name | Description | -| ---------------------- | ------------------------------------------------------------------------------------------------------- | -| `sink_id` | The fully qualified ID of the logging sink. | -| `sink_writer_identity` | The service account identity created for this sink. This identity has been granted permission to write to the destination. | diff --git a/ibm-symphony-on-gcp/modules/logging_sink/main.tf b/ibm-symphony-on-gcp/modules/logging_sink/main.tf deleted file mode 100644 index 84900f7..0000000 --- a/ibm-symphony-on-gcp/modules/logging_sink/main.tf +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -resource "google_logging_project_sink" "main" { - name = var.sink_name - - # For GCS: storage.googleapis.com/[BUCKET_NAME] - # For Pub/Sub: pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_NAME] - # For BigQuery: bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET_ID] - destination = "pubsub.googleapis.com/${var.topic_id}" - - # A filter is critical for selecting which logs to export. - # This example exports all logs with a severity of ERROR or higher. - filter = var.log_filter - - # Using a unique writer identity is a security best practice. - # It creates a unique service account for this sink. - unique_writer_identity = true -} - -data "google_project" "project" {} - -resource "google_pubsub_topic_iam_member" "publisher_binding" { - project = var.project_id - topic = var.topic_name - - role = "roles/pubsub.publisher" - member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-logging.iam.gserviceaccount.com" -} - -resource "google_pubsub_subscription_iam_member" "subscriber_binding" { - project = var.project_id - subscription = var.subscription_name - - role = "roles/pubsub.subscriber" - member = "serviceAccount:${data.google_project.project.number}-compute@developer.gserviceaccount.com" -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/logging_sink/output.tf b/ibm-symphony-on-gcp/modules/logging_sink/output.tf deleted file mode 100644 index 7682972..0000000 --- a/ibm-symphony-on-gcp/modules/logging_sink/output.tf +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -output "sink_id" { - description = "The fully qualified ID of the logging sink." - value = google_logging_project_sink.main.id -} - -output "sink_writer_identity" { - description = "The service account identity created for this sink. This identity has been granted permission to write to the destination." - value = google_logging_project_sink.main.writer_identity -} diff --git a/ibm-symphony-on-gcp/modules/logging_sink/variables.tf b/ibm-symphony-on-gcp/modules/logging_sink/variables.tf deleted file mode 100644 index 98d1633..0000000 --- a/ibm-symphony-on-gcp/modules/logging_sink/variables.tf +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "project_id" { - description = "The GCP project ID where the logging sink will be created." - type = string - # No default value - this should be provided by the user. -} - -variable "topic_id" { - description = "The fully qualified pubsub topic topic id." - type = string - default = "" -} - -variable "topic_name" { - description = "The pubsub topic to bind to." - type = string - default = "" -} - -variable "subscription_name" { - description = "The pubsub subscription to bind to." - type = string - default = "" -} - -variable "sink_name" { - description = "The name of the logging sink." - type = string - default = "gcs-error-log-export-sink" -} - -variable "log_filter" { - description = "The filter for the logs to be exported by the sink." - type = string - # This default exports all logs at ERROR or higher severity, which is a common use case. - default = "severity >= ERROR" -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_subscription/README.md b/ibm-symphony-on-gcp/modules/pubsub_subscription/README.md deleted file mode 100644 index 6275dcc..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_subscription/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Terraform Google Cloud Pub/Sub Subscription Module - -This Terraform module creates a Google Cloud Pub/Sub subscription to a specified topic. - -## Usage - -```hcl -module "pubsub_subscription" { - source = "./modules/pubsub_subscription" - project_id = "your-gcp-project-id" - topic_name = "name-of-your-topic" - subscription_name = "my-new-subscription" - ack_deadline_seconds = 30 - subscription_filter = "attributes.status = \"processed\"" -} -``` - -## Inputs - -| Name | Description | Type | Default | Required | -| ---------------------------- | ------------------------------------------------------------------------ | ------------- | ------------------------ | :------: | -| `project_id` | The GCP project ID to deploy the resources to. | `string` | n/a | yes | -| `topic_name` | The name of the Pub/Sub topic. | `string` | `"example-topic"` | no | -| `subscription_name` | The name of the Pub/Sub subscription. | `string` | `"hf-gce-vm-events-sub"` | no | -| `ack_deadline_seconds` | The acknowledgment deadline for messages pulled from this subscription. | `number` | `20` | no | -| `message_retention_duration` | How long to retain unacknowledged messages in the subscription's backlog.| `string` | `"604800s"` | no | -| `subscription_filter` | A filter expression for the subscription. Leave empty for no filter. | `string` | `""` | no | -| `labels` | A map of labels to apply to the Pub/Sub resources. | `map(string)` | `{"environment" = "dev", "terraform" = "true"}` | no | - -## Outputs - -| Name | Description | -| ------------------- | ---------------------------------------------------- | -| `subscription_id` | The fully qualified ID of the Pub/Sub subscription. | -| `subscription_name` | The name of the Pub/Sub subscription. | - diff --git a/ibm-symphony-on-gcp/modules/pubsub_subscription/main.tf b/ibm-symphony-on-gcp/modules/pubsub_subscription/main.tf deleted file mode 100644 index 4016496..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_subscription/main.tf +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -resource "google_pubsub_subscription" "main" { - # Required arguments - name = var.subscription_name - topic = var.topic_name # Reference the topic created above - - # Optional but common arguments - project = var.project_id - ack_deadline_seconds = var.ack_deadline_seconds - message_retention_duration = var.message_retention_duration - labels = var.labels - - filter = var.subscription_filter != "" ? var.subscription_filter : null -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_subscription/output.tf b/ibm-symphony-on-gcp/modules/pubsub_subscription/output.tf deleted file mode 100644 index a27ea86..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_subscription/output.tf +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -output "subscription_id" { - description = "The fully qualified ID of the Pub/Sub subscription." - value = google_pubsub_subscription.main.id -} - -output "subscription_name" { - description = "The name of the Pub/Sub subscription." - value = google_pubsub_subscription.main.name -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_subscription/variables.tf b/ibm-symphony-on-gcp/modules/pubsub_subscription/variables.tf deleted file mode 100644 index 7f1428d..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_subscription/variables.tf +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "project_id" { - description = "The GCP project ID to deploy the resources to." - type = string - # No default value - this should be provided by the user. -} - -variable "topic_name" { - description = "The name of the Pub/Sub topic." - type = string - default = "example-topic" -} - -variable "subscription_name" { - description = "The name of the Pub/Sub subscription." - type = string - default = "hf-gce-vm-events-sub" -} - -variable "ack_deadline_seconds" { - description = "The acknowledgment deadline for messages pulled from this subscription." - type = number - default = 20 -} - -variable "message_retention_duration" { - description = "How long to retain unacknowledged messages in the subscription's backlog." - type = string - default = "604800s" # 7 days -} - -variable "subscription_filter" { - description = "A filter expression for the subscription (e.g., 'attributes.type = \"important\"'). Leave empty for no filter." - type = string - default = "" -} - -variable "labels" { - description = "A map of labels to apply to the Pub/Sub resources." - type = map(string) - default = { - "environment" = "dev" - "terraform" = "true" - } -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_topic/README.md b/ibm-symphony-on-gcp/modules/pubsub_topic/README.md deleted file mode 100644 index 973f3a3..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_topic/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Terraform Google Cloud Pub/Sub Topic Module - -This Terraform module creates a Google Cloud Pub/Sub topic. - -## Usage - -```hcl -module "pubsub_topic" { - source = "./modules/pubsub_topic" - project_id = "your-gcp-project-id" - topic_name = "my-new-topic" - labels = { - "environment" = "production" - } - allowed_persistence_regions = ["us-central1"] -} -``` - -## Inputs - -| Name | Description | Type | Default | Required | -| --------------------------- | ------------------------------------------------------------------------ | ------------- | ----------------------------------------------------- | :------: | -| `project_id` | The GCP project ID where the Pub/Sub topic will be created. | `string` | n/a | yes | -| `topic_name` | The name of the Pub/Sub topic. | `string` | `"my-example-topic"` | no | -| `labels` | A map of labels to apply to the Pub/Sub topic. | `map(string)` | `{"environment" = "development", "managed-by" = "terraform"}` | no | -| `allowed_persistence_regions` | A list of GCP regions where messages are allowed to be stored. | `list(string)`| `[]` | no | - -## Outputs - -| Name | Description | -| ------------ | ---------------------------------------------------------------------------------- | -| `topic_id` | The fully qualified ID of the Pub/Sub topic (projects/PROJECT_ID/topics/TOPIC_NAME). | -| `topic_name` | The short name of the Pub/Sub topic. | diff --git a/ibm-symphony-on-gcp/modules/pubsub_topic/main.tf b/ibm-symphony-on-gcp/modules/pubsub_topic/main.tf deleted file mode 100644 index be8bb29..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_topic/main.tf +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -resource "google_pubsub_topic" "main" { - # Required arguments - name = var.topic_name - project = var.project_id - - # Optional but common arguments - labels = var.labels - - # Optional: Define a message storage policy to constrain where messages - # are stored. For example, to keep data within the EU. - # The allowed_persistence_regions list should not be empty. - message_storage_policy { - allowed_persistence_regions = var.allowed_persistence_regions - } - - # Optional: Set up a schema for message validation. - # Requires a separate google_pubsub_schema resource. - # schema_settings { - # schema = "projects/my-project/schemas/my-schema" - # encoding = "JSON" - # } -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_topic/outputs.tf b/ibm-symphony-on-gcp/modules/pubsub_topic/outputs.tf deleted file mode 100644 index a00434e..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_topic/outputs.tf +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -output "topic_id" { - description = "The fully qualified ID of the Pub/Sub topic (projects/PROJECT_ID/topics/TOPIC_NAME)." - value = google_pubsub_topic.main.id -} - -output "topic_name" { - description = "The short name of the Pub/Sub topic." - value = google_pubsub_topic.main.name -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/modules/pubsub_topic/variables.tf b/ibm-symphony-on-gcp/modules/pubsub_topic/variables.tf deleted file mode 100644 index 4fc371c..0000000 --- a/ibm-symphony-on-gcp/modules/pubsub_topic/variables.tf +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "project_id" { - description = "The GCP project ID where the Pub/Sub topic will be created." - type = string - # No default value is set, ensuring this is provided by the user. -} - -variable "topic_name" { - description = "The name of the Pub/Sub topic." - type = string - # A default name is provided for ease of use in testing. - default = "my-example-topic" -} - -variable "labels" { - description = "A map of labels to apply to the Pub/Sub topic." - type = map(string) - default = { - "environment" = "development" - "managed-by" = "terraform" - } -} - -variable "allowed_persistence_regions" { - description = "A list of GCP regions where messages are allowed to be stored. e.g., ['europe-west1', 'europe-west4']." - type = list(string) - # Default is an empty list, which means the policy is not applied by default. - # Google's default behavior (global storage) will be used. - default = [] -} \ No newline at end of file diff --git a/ibm-symphony-on-gcp/scripts/hf-gce_symphony.sh b/ibm-symphony-on-gcp/scripts/hf-gce_symphony.sh index 31c4e4d..3cfd3c4 100644 --- a/ibm-symphony-on-gcp/scripts/hf-gce_symphony.sh +++ b/ibm-symphony-on-gcp/scripts/hf-gce_symphony.sh @@ -21,15 +21,19 @@ export PROJECT_ID=$2 git clone https://github.com/google/symphony-gcp.git cd symphony-gcp/hf-provider -curl -LsSf https://astral.sh/uv/install.sh | sh + +curl -LsSf https://astral.sh/uv/0.11.26/install.sh | sh + source /root/.local/bin/env uv venv source .venv/bin/activate uv pip install . uv pip install pyinstaller PYTHONPATH=src pyinstaller --onefile src/gce_provider/__main__.py --name hf-gce --paths .venv/lib/python3.9/site-packages +PYTHONPATH=src pyinstaller --onefile src/gce_provider/pubsub.py --name hf-monitor --paths .venv/lib/python3.9/site-packages cp dist/hf-gce resources/gce_cli/1.2/providerplugins/gcpgce/bin/ +cp dist/hf-monitor resources/gce_cli/1.2/providerplugins/gcpgce/bin/ cd resources/gce_cli # Create deployment tar @@ -41,6 +45,7 @@ source ${EGO_TOP}/profile.platform # Untar in Hostfactory tar -xzf hf-gce.tgz -C $HF_TOP + # Update Config cp /tmp/Symphony/hostProviderPlugins.json $HF_TOP/conf/providerplugins/hostProviderPlugins.json diff --git a/ibm-symphony-on-gcp/scripts/install_symphony.sh b/ibm-symphony-on-gcp/scripts/install_symphony.sh index 2e949ee..fca7c06 100644 --- a/ibm-symphony-on-gcp/scripts/install_symphony.sh +++ b/ibm-symphony-on-gcp/scripts/install_symphony.sh @@ -22,6 +22,14 @@ export sym_entitlement=$3 export symphony_install_dir=$4 export sym_source_bucket=$5 +# 1. Remove the stale Berkeley DB (BDB) environment files +rm -f /var/lib/rpm/__db* + +# 2. Rebuild the RPM database index +rpm --rebuilddb + +# 3. Clean package manager caches to ensure a fresh state +yum clean all ##### Update some packages yum install -y \ diff --git a/ibm-symphony-on-gcp/symphony.yaml b/ibm-symphony-on-gcp/symphony.yaml index bf0c74d..1d72984 100644 --- a/ibm-symphony-on-gcp/symphony.yaml +++ b/ibm-symphony-on-gcp/symphony.yaml @@ -36,7 +36,7 @@ vars: sym_entitlement: sym_adv_entitlement.dat symphony_install_dir: /opt/ibm/symphony admin_password: admin - service_account_email: 658302879205-compute@developer.gserviceaccount.com + service_account_email: $(vars.service_account_email) pubsub_subscription: hf-gce-vm-events-sub pubsub_topic: hf-gce-vm-events sink_name: hf-gce-vm-events-sink @@ -47,24 +47,30 @@ deployment_groups: - id: network source: modules/network/vpc - - id: topic - source: ./modules/pubsub_topic + - id: pubsub + source: git::https://github.com/terraform-google-modules/terraform-google-pubsub.git settings: - topic_name: $(vars.pubsub_topic) - - id: subscription - source: ./modules/pubsub_subscription - use: - - topic + project_id: $(vars.project_id) + topic: $(vars.pubsub_topic) + pull_subscriptions: + - name: $(vars.pubsub_subscription) + - id: pubsub_iam + source: git::https://github.com/terraform-google-modules/terraform-google-iam.git//modules/pubsub_subscriptions_iam settings: - subscription_name: $(vars.pubsub_subscription) + project: $(vars.project_id) + pubsub_subscriptions: $(pubsub.subscription_names) + bindings: + "roles/pubsub.subscriber": + - serviceAccount:$(vars.service_account_email) - id: sink - source: ./modules/logging_sink - use: - - topic - - subscription + source: git::https://github.com/terraform-google-modules/terraform-google-log-export.git settings: - sink_name: $(vars.sink_name) - log_filter: | + parent_resource_id: $(vars.project_id) + parent_resource_type: project + destination_uri: pubsub.googleapis.com/$(pubsub.id) + log_sink_name: $(vars.sink_name) + unique_writer_identity: true + filter: | logName="projects/$(vars.project_id)/logs/cloudaudit.googleapis.com%2Factivity" resource.type=("gce_instance_group_manager" OR "gce_instance" ) protoPayload.methodName=( @@ -132,47 +138,52 @@ deployment_groups: ## Create MIG instance templates - id: sym-mig-c2-30 use: - - network - sym-compute-script - source: ./modules/instance_template + source: git::https://github.com/terraform-google-modules/terraform-google-vm.git//modules/instance_template?ref=main settings: - service_account_email: $(vars.service_account_email) + subnetwork: $(network.subnetwork_name) source_image_family: $(vars.new_image.family) source_image_project: $(vars.new_image.project) name_prefix: $(vars.deployment_name) machine_type: c2-standard-30 - advanced_machine_features: - threads_per_core: null # Use platform default value + threads_per_core: null # Use platform default value + service_account: + email: $(vars.service_account_email) - id: sym-mig-c2-4 use: - - network - sym-compute-script - source: ./modules/instance_template + source: git::https://github.com/terraform-google-modules/terraform-google-vm.git//modules/instance_template?ref=main settings: + subnetwork: $(network.subnetwork_name) source_image_family: $(vars.new_image.family) source_image_project: $(vars.new_image.project) name_prefix: $(vars.deployment_name) machine_type: c2-standard-4 - advanced_machine_features: - threads_per_core: null # Use platform default value + threads_per_core: null # Use platform default value + service_account: + email: $(vars.service_account_email) ## Create MIGs - id: sym-mig-4 source: community/modules/compute/mig settings: name: sym-mig-c2-4 + base_instance_name: $(vars.deployment_name)-c2-4 versions: - name: sym-mig-c2-4 instance_template: $(sym-mig-c2-4.self_link) + target_size: 0 - id: sym-mig-30 source: community/modules/compute/mig settings: name: sym-mig-c2-30 + base_instance_name: $(vars.deployment_name)-c2-30 versions: - name: sym-mig-c2-30 instance_template: $(sym-mig-c2-30.self_link) + target_size: 0 - group: deploy-vms modules: diff --git a/ibm-symphony-on-gcp/symphony_deployment.yaml b/ibm-symphony-on-gcp/symphony_deployment.yaml index 5556009..472a2db 100644 --- a/ibm-symphony-on-gcp/symphony_deployment.yaml +++ b/ibm-symphony-on-gcp/symphony_deployment.yaml @@ -18,24 +18,24 @@ vars: # This should be unique across all of your Cluster # Toolkit Deployments. - deployment_name: DEPLOYMENT_NAME + deployment_name: sym-jrt-05 # Your GCP Project ID - project_id: PROJECT_ID + project_id: hpc-solutions-04 # The GCP Region used for this deployment. - region: COMPUTE_REGION + region: us-central1 # The GCP Zone used for this deployment. - zone: COMPUTE_ZONE + zone: us-central1-c sym_installer: sym-7.3.2.0_x86_64.bin - sym_source_bucket: mybucket + sym_source_bucket: symphony-jrt-04 sym_fixpack: sym-7.3.2.0_x86_64_build601711.tar.gz sym_entitlement: sym_adv_entitlement.dat - symphony_install_dir: /opt/ibm/symphony - admin_password: admin - service_account_email: MYPROJECT_NUMBER-compute@developer.gserviceaccount.com + symphony_install_dir: /opt/ibm/spectrumcomputing + admin_password: admin-04 + service_account_email: 771474336186-compute@developer.gserviceaccount.com pubsub_subscription: hf-gce-vm-events-sub pubsub_topic: hf-gce-vm-events sink_name: hf-gce-vm-events-sink \ No newline at end of file