Make all GCP clusters support the instance types 4, 16, and 64 CPU highmem nodes

Follow-up to https://github.com/2i2c-org/infrastructure/pull/3304
Fixes https://github.com/2i2c-org/infrastructure/issues/3256
TODO
Run terraform plan & apply for:

[x] 2i2c-uk.tfvars

terraform plan -var-file=projects/callysto.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "two-eye-two-see-uk-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "europe-west2"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "two-eye-two-see-uk"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "two-eye-two-see-uk-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "europe-west2"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "two-eye-two-see-uk"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["user"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/two-eye-two-see-uk/locations/europe-west2/clusters/two-eye-two-see-uk-cluster/nodePools/nb-user"
        name                        = "nb-user"
        # (9 unchanged attributes hidden)

      ~ autoscaling {
          ~ max_node_count       = 20 -> 100
            # (4 unchanged attributes hidden)
        }

        # (3 unchanged blocks hidden)
    }

Plan: 2 to add, 1 to change, 0 to destroy.

[x] callysto.tfvars

terraform plan -var-file=projects/callysto.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "callysto-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "northamerica-northeast1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "callysto-202316"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "callysto-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "northamerica-northeast1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "callysto-202316"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["user"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/callysto-202316/locations/northamerica-northeast1/clusters/callysto-cluster/nodePools/nb-user"
        name                        = "nb-user"
        # (9 unchanged attributes hidden)

      ~ autoscaling {
          ~ max_node_count       = 20 -> 100
            # (4 unchanged attributes hidden)
        }

        # (3 unchanged blocks hidden)
    }

Plan: 2 to add, 1 to change, 0 to destroy.

[x] cloudbank.tfvars

terraform plan -var-file=projects/cloudbank.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "cb-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "cb-1003-1696"
      + version                     = "1.26.4-gke.1400"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "cb-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "cb-1003-1696"
      + version                     = "1.26.4-gke.1400"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["user"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/cb-1003-1696/locations/us-central1-b/clusters/cb-cluster/nodePools/nb-user"
        name                        = "nb-user"
        # (9 unchanged attributes hidden)

      ~ autoscaling {
          ~ max_node_count       = 20 -> 100
            # (4 unchanged attributes hidden)
        }

        # (3 unchanged blocks hidden)
    }

Plan: 2 to add, 1 to change, 0 to destroy.

[x] hhmi.tfvars

terraform plan -var-file=projects/hhmi.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-4"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "hhmi-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-west2"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-4"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "hhmi-398911"
      + version                     = (known after apply)

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-4"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "hhmi-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-west2"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "hhmi-398911"
      + version                     = (known after apply)

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 2 to add, 0 to change, 0 to destroy.

[x] linked-earth.tfvars

terraform plan -var-file=projects/linked-earth.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "linked-earth-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "linked-earth-hubs"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

[x] m2lines.tfvars

terraform plan -var-file=projects/m2lines.tfvars
  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "m2lines-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "m2lines-hub"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-4"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "m2lines-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-4"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "m2lines-hub"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-4"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "m2lines-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "m2lines-hub"
      + version                     = "1.27.4-gke.900"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 3 to add, 0 to change, 0 to destroy.

[x] pilot-hubs.tfvars

terraform plan -var-file=projects/pilot-hubs.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "pilot-hubs-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "two-eye-two-see"
      + version                     = "1.26.4-gke.1400"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "pilot-hubs-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "two-eye-two-see"
      + version                     = "1.26.4-gke.1400"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["user"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/two-eye-two-see/locations/us-central1-b/clusters/pilot-hubs-cluster/nodePools/nb-user"
        name                        = "nb-user"
        # (9 unchanged attributes hidden)

      ~ autoscaling {
          ~ max_node_count       = 20 -> 100
            # (4 unchanged attributes hidden)
        }

        # (3 unchanged blocks hidden)
    }

Plan: 2 to add, 1 to change, 0 to destroy.

[ ] leap.tfvars !!!

terraform plan -var-file=projects/leap.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_cluster.cluster will be updated in-place
  ~ resource "google_container_cluster" "cluster" {
        id                          = "projects/leap-pangeo/locations/us-central1/clusters/leap-cluster"
        name                        = "leap-cluster"
        # (27 unchanged attributes hidden)

      ~ cluster_autoscaling {
          ~ enabled             = true -> false
            # (1 unchanged attribute hidden)

          - resource_limits {
              - maximum       = 26112 -> null
              - minimum       = 1 -> null
              - resource_type = "memory" -> null
            }
          - resource_limits {
              - maximum       = 3264 -> null
              - minimum       = 1 -> null
              - resource_type = "cpu" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-a100" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-k80" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-p100" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-p4" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-t4" -> null
            }
          - resource_limits {
              - maximum       = 1024 -> null
              - minimum       = 1 -> null
              - resource_type = "nvidia-tesla-v100" -> null
            }

            # (1 unchanged block hidden)
        }

        # (23 unchanged blocks hidden)
    }

  # google_container_node_pool.notebook["n2-highmem-4"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "leap-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-4"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "leap-pangeo"
      + version                     = "1.25.6-gke.1000"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-4"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "leap-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "leap-pangeo"
      + version                     = "1.25.6-gke.1000"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 2 to add, 1 to change, 0 to destroy.

[ ] qcl.tfvars !!!!

terraform plan -var-file=projects/qcl.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform will perform the following actions:

  # google_container_cluster.cluster will be updated in-place
  ~ resource "google_container_cluster" "cluster" {
        id                          = "projects/qcl-hub/locations/europe-west1/clusters/qcl-cluster"
      + min_master_version          = "1.25.10-gke.2700"
        name                        = "qcl-cluster"
        # (26 unchanged attributes hidden)

        # (26 unchanged blocks hidden)
    }

  # google_container_node_pool.notebook["huge"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/qcl-hub/locations/europe-west1/clusters/qcl-cluster/nodePools/nb-huge"
        name                        = "nb-huge"
      ~ version                     = "1.24.11-gke.1000" -> "1.24.9-gke.3200"
        # (8 unchanged attributes hidden)

        # (5 unchanged blocks hidden)
    }

  # google_container_node_pool.notebook["large"] will be updated in-place
  ~ resource "google_container_node_pool" "notebook" {
        id                          = "projects/qcl-hub/locations/europe-west1/clusters/qcl-cluster/nodePools/nb-large"
        name                        = "nb-large"
      ~ version                     = "1.24.11-gke.1000" -> "1.24.9-gke.3200"
        # (8 unchanged attributes hidden)

        # (5 unchanged blocks hidden)
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "qcl-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "europe-west1"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "qcl-hub"
      + version                     = "1.24.9-gke.3200"

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 1 to add, 3 to change, 0 to destroy.

Changes to Outputs:
  ~ regular_channel_latest_k8s_versions = {
      ~ "1."    = "1.27.3-gke.1700" -> "1.27.4-gke.900"
      ~ "1.24." = "1.24.15-gke.1700" -> "1.24.16-gke.500"
      ~ "1.25." = "1.25.11-gke.1700" -> "1.25.12-gke.500"
      ~ "1.26." = "1.26.6-gke.1700" -> "1.26.7-gke.500"
      ~ "1.27." = "1.27.3-gke.1700" -> "1.27.4-gke.900"
    }

[ ] pangeo-hubs.tfvars

terraform plan -var-file=projects/pangeo-hubs.tfvars
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform planned the following actions, but then encountered a problem:

  # google_container_node_pool.notebook["n2-highmem-16"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "pangeo-hubs-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-16"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "pangeo-integration-te-3eea"
      + version                     = (known after apply)

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-16"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-4"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "pangeo-hubs-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-4"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "pangeo-integration-te-3eea"
      + version                     = (known after apply)

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-4"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

  # google_container_node_pool.notebook["n2-highmem-64"] will be created
  + resource "google_container_node_pool" "notebook" {
      + cluster                     = "pangeo-hubs-cluster"
      + id                          = (known after apply)
      + initial_node_count          = 0
      + instance_group_urls         = (known after apply)
      + location                    = "us-central1-b"
      + managed_instance_group_urls = (known after apply)
      + max_pods_per_node           = (known after apply)
      + name                        = "nb-n2-highmem-64"
      + name_prefix                 = (known after apply)
      + node_count                  = (known after apply)
      + node_locations              = (known after apply)
      + operation                   = (known after apply)
      + project                     = "pangeo-integration-te-3eea"
      + version                     = (known after apply)

      + autoscaling {
          + location_policy = (known after apply)
          + max_node_count  = 100
          + min_node_count  = 0
        }

      + management {
          + auto_repair  = true
          + auto_upgrade = false
        }

      + node_config {
          + disk_size_gb      = (known after apply)
          + disk_type         = "pd-balanced"
          + guest_accelerator = (known after apply)
          + image_type        = (known after apply)
          + labels            = {
              + "hub.jupyter.org/node-purpose" = "user"
              + "k8s.dask.org/node-purpose"    = "scheduler"
            }
          + local_ssd_count   = (known after apply)
          + logging_variant   = "DEFAULT"
          + machine_type      = "n2-highmem-64"
          + metadata          = (known after apply)
          + min_cpu_platform  = (known after apply)
          + oauth_scopes      = [
              + "https://www.googleapis.com/auth/cloud-platform",
            ]
          + preemptible       = false
          + service_account   =<EMAIL_ADDRESS>          + spot              = false
          + tags              = []
          + taint             = [
              + {
                  + effect = "NO_SCHEDULE"
                  + key    = "hub.jupyter.org_dedicated"
                  + value  = "user"
                },
            ]

          + workload_metadata_config {
              + mode = "GKE_METADATA"
            }
        }
    }

Plan: 3 to add, 0 to change, 0 to destroy.
╷
│ Warning: Failed to decode resource from state
│
│ Error decoding "google_monitoring_alert_policy.disk_space_full_alert" from prior state: unsupported attribute "condition_prometheus_query_language"
╵
╷
│ Error: Failed to get the data key required to decrypt the SOPS file.
│
│ Group 0: FAILED
│   projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs: FAILED
│     - | Error decrypting key: googleapi: Error 403: Permission
│       | 'cloudkms.cryptoKeyVersions.useToDecrypt' denied on resource
│       | 'projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs'
│       | (or it may not exist)., forbidden
│
│ Recovery failed because no master key was able to decrypt the file. In
│ order for SOPS to recover the file, at least one key has to be successful,
│ but none were.
│
│   with data.sops_file.pagerduty_service_integration_keys,
│   on pagerduty.tf line 13, in data "sops_file" "pagerduty_service_integration_keys":
│   13: data "sops_file" "pagerduty_service_integration_keys" {
│

@consideRatio, you're totally right. I did went with using more generic names like: n2-highmem-4", but then I saw that we call them "small", "medium" and "large" in the template file, so I figured that going with these names will minimize the number of disrupting renaming we will do in the future (assuming we might want to make sure all these machines are available under these names).
Happy to change them back to generic names, including the template. It did feel awkward to call that one larger 😅

Notes form sync chat.

Update template files to use absolute naming
Update some but not all to use absolute naming side by side with previous naming
(future, doesn't have to be by @GeorgianaElena in this PR) Create a followup issue to help us progressively work towards absolute naming of user nodes in GKE and AKS

I got an idea on how we can help nudge a transition of things over time btw - next to each thing we want to change in each terraform/eksctl file - we comment a "FIXME: Update this to ... when given the chance" or a similar comment.
Then, the decision on what to do when given the opportunity is taken already, and its just a matter of getting it done. This is something anyone may end up helping with when for example doing k8s upgrades.

Thank you @consideRatio! I've just added a commit to add the suggested fixme comments and the trailing commas and will now start terraform plan + apply the chnages.

Update
I have ran terraform plan & apply for all but three clusters.
In the top comment I pasted the terraform plan output of all of them.
The ones without a check I did not ran terraform apply for because of the changes it wished to make to the current infra. Summary:
1. leap
Leap appears to have cluster_autoscaling enabled, which is not reflected in its terraform config
2. qcl
It seems it wishes to make some updates to the existing nodepools. Don't undestand why?
3. pangeo-hubs
At the end of the plan output, it says:
│ Warning: Failed to decode resource from state
│
│ Error decoding "google_monitoring_alert_policy.disk_space_full_alert" from prior state: unsupported attribute "condition_prometheus_query_language"
╵
╷
│ Error: Failed to get the data key required to decrypt the SOPS file.
│
│ Group 0: FAILED
│   projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs: FAILED
│     - | Error decrypting key: googleapi: Error 403: Permission
│       | 'cloudkms.cryptoKeyVersions.useToDecrypt' denied on resource
│       | 'projects/two-eye-two-see/locations/global/keyRings/sops-keys/cryptoKeys/similar-hubs'
│       | (or it may not exist)., forbidden
│
│ Recovery failed because no master key was able to decrypt the file. In
│ order for SOPS to recover the file, at least one key has to be successful,
│ but none were.
│
│   with data.sops_file.pagerduty_service_integration_keys,
│   on pagerduty.tf line 13, in data "sops_file" "pagerduty_service_integration_keys":
│   13: data "sops_file" "pagerduty_service_integration_keys" {
│

@GeorgianaElena for pangeo hubs, you'll have to log into the gcloud cli using your Columbia email I think

@GeorgianaElena for pangeo hubs, you'll have to log into the gcloud cli using your Columbia email I think

Thanks @sgibson91. I did that, but I think the issuse is that my columbia account doesn't have permissions to access the sops decryption key which is stored in the two-eye-two-see gcloud project. Will manually add myself there and make a note in the terraform file.

LEAP:

Leap appears to have cluster_autoscaling enabled, which is not reflected in its terraform config

I think node auto-provisioning has been enabled as part of Yuvi trialing things in https://github.com/2i2c-org/infrastructure/issues/3287, and that relies on adjusting the GKE managed cluster autoscaler which isn't running inside the k8s cluster as it does on EKS.
QCL:

It seems it wishes to make some updates to the existing nodepools. Don't undestand why?

What kind of updates? Are they related to k8s node versions? I then suspect its a remnant of a k8s cluster upgrade, where node pools wasn't updated as part of the k8s api-server being upgraded.

OMG amazing summary of your actions in the PR description @GeorgianaElena, looking now!

@GeorgianaElena I think its fine that we update large and huge in place because they are not used currently. So they can be re-created / updated without issues to get the same k8s version pinned. Apparently they have a more modern k8s version than most other nodes.
This cluster was created without pinned k8s versions for the nodes and hasn't been upgraded to align all nodes version since the pinning was introduced in the terraform config.

@GeorgianaElena I went for the QCL node pools changes while they remained inactive

@GeorgianaElena I'm quite confident that #3287 was causing the LEAP issues. I suggest we simply merge this as it is for now though as I don't think its in scope for this PR to resolve it.

@GeorgianaElena I went for the QCL node pools changes while they remained inactive - QCL complete!

Amazing! Thank you @consideRatio  <3

@GeorgianaElena I'm quite confident that https://github.com/2i2c-org/infrastructure/issues/3287 was causing the LEAP issues. I suggest we simply merge this as it is for now though as I don't think its in scope for this PR to resolve it.

Thanks @consideRatio! Then I will merge this now since almost everything was terraform applied.


Gradlify?

Are you interested in a contribution which converts this to a gradle project and allows for publishing (exclusively) as an aar?

+1
In the meantime I discovered https://jitpack.io/#jberkel/pay-me/0.0.4


Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: unknown object type "nil" in Deployment.spec.template.metadata.annotations.iam.amazonaws.com/role

I just updated helm 2 to 3. Ever since I updated the helm version I keep getting this validation error. I read somewhere that the previous helm was not validating the schema but now it does and that is why people are facing the issue.
But This error is not at all help full. I have so many deployment yaml file in the chart. How would I check which deployment file is having the issue?
Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: unknown object type "nil" in Deployment.spec.template.metadata.annotations.iam.amazonaws.com/role
Output of helm version: version.BuildInfo{Version:"v3.5.2", GitCommit:"167aac70832d3a384f65f9745335e9fb40169dc2", GitTreeState:"dirty", GoVersion:"go1.15.7"}
Output of kubectl version:
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.15", GitCommit:"2adc8d7091e89b6e3ca8d048140618ec89b39369", GitTreeState:"clean", BuildDate:"2020-09-02T11:40:00Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18+", GitVersion:"v1.18.9-eks-d1db3c", GitCommit:"d1db3c46e55f95d6a7d3e5578689371318f95ff9", GitTreeState:"clean", BuildDate:"2020-10-20T22:18:07Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

Cloud Provider/Platform (AKS, GKE, Minikube etc.): EKS
P.S I am running below helm command
helm upgrade --install test ./app/ -f "client-values.yaml"

Hi, @vrathore18 - does helm lint show you any errors? That may help you find where you need to set default values. You may find --strict useful. And there are more debugging tips on https://helm.sh/docs/chart_template_guide/debugging/.


Currency fields cause redundant line in /dev/build output

When running dev/build, any model with a unchanged field of type Currency will produce the following output:
Field Purchase.Amount: changed to decimal(9,2) not null  default 0.00 (from decimal(9,2) not null default '0.00')

I've also seen that build error, and when no Currency types are used.

Fixed with https://github.com/silverstripe/silverstripe-framework/pull/4731


[Feature Request] Add export to CSV for tables

Existing Component
Yes
Component Name
el-table
Description
Add export to CSV for tables.
This feature will be really useful. Thanks!

It won't be very useful IMO because most of tables are paged on backend.

I think it is because people need to export data, paged or not paged. It’s a feature that’s almost ubiquitous.

Export only one page of data? Is it truly useful?
In addition, exporting CSV requires additional library. It's not as simple as join(',')

I chose element because it’s clean, elegant and simple. I also don’t believe in bloated features.
But with this, I don’t think it’s a matter of whether tables are paginated or not, but rather when displaying tables, it means that one is dealing with data.
In dealing with data, I don’t think it’s unnecessary to need to export data for further manipulation or data analysis.
Without which use case for element is curtailed. Like accounting pages, to export for finance reporting? Like inventory system, to export for sales analysis?
Moreover, people are certain to filter what they need before exporting - paginated or not.


Feature/encoding

fixtures in extra class for reusability + proper front-spaces stripping
cleaned up requires a bit
encoding issues for utf8 ledger files for learning fixed + everything is in utf8 by default (charlock_holmes)
version in extra file
sh/c to quickly bootup a console with reckon loaded

Additional file encoding suggestions added in #80 .  I'm closing this since it doesn't appear to be active anymore.


Node v14 not supported

Hi,
I've upgraded to Node v14 and I now can't install this library because there are no prebuilt binaries.
Here's the error that I'm getting
error /Users/k/code/svelte/alfred/node_modules/sharp: Command failed.
Exit code: 1
Command: (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
Arguments:
Directory: /Users/k/code/svelte/alfred/node_modules/sharp
Output:
info sharp Downloading https://github.com/lovell/sharp-libvips/releases/download/v8.9.0/libvips-8.9.0-darwin-x64.tar.gz
prebuild-install WARN install No prebuilt binaries found (target=14.0.0 runtime=node arch=x64 libc= platform=darwin)

Hope, it will resolve soon

Please upgrade sharp, the latest version is v0.25.2.

Thanks ! Fixed that with a resolution in package.json


auto create default resource CRUD

For a resource that is just inheriting default behavior from vase router, controller and model, I should not have to make three router, controller and model files.
I should just be able to declaire my resource and endpoints should take care of construction of the entity's model route and controller.

this sort of high level abstraction is on the horizon but will not be landing in this form.


Data Analysis: Core Questions to Answer

Every time I write OONI research reports, I always have a set of basic questions that I ask. These are not sophisticated/complicated research questions, but rather basic questions that can help derive basic meaning from the network measurement data.
I think these questions should be considered as part of the engineering of OONI's data processing pipeline. These questions include:

Which is the testing period? When did the network measurement collection start for country X and when did it end?

Which is the data analysis period? The network measurements are analysed from which date until which date? (it might not take into account all of the network measurement data that has ever been collected from country X)

From which ASNs have network measurements been collected in country X? A list of all ASNs per country, as well as the data collected from each ASN, would be useful.

Which OONI tests were run in country X? (e.g. Web Connectivity, HTTP Invalid Request Line, HTTP Header Field Manipulation, Vanilla Tor, etc.) And in which ASN was each OONI test run in, and during which time period?

The measurements of which OONI tests are considered as part of this data analysis?

As part of data analysis, did you detect the presence of any middle boxes? If so, when and in which networks? Can we fingerprint these middle boxes?

As part of data analysis, did you find Tor, WhatsApp, Facebook Messenger, or Telegram to be blocked? If so, when and in which networks?

Analyzing Web Connectivity measurements for country X:

Which sites served block pages (and in which ASNs)? (if any)

Which sites presented anomalies? A list, categorizing the anomalous sites from the most anomalous to the least anomalous, would be useful.

How many anomalies did each site present?

What types of anomalies did each site present? (e.g. TCP/IP, DNS, HTTP-diff, HTTP-failure)

How frequently did these sites present network anomalies across the testing period? A timeline of anomalies per site would be useful.

How many times was an anomalous site tested overall? A site presented X anomalies out of Y times it was tested.

When did these sites start (and stop) presenting network anomalies?

Where (in which ASN) did these sites present network anomalies? A comparison of anomalous sites across ASNs would be useful.

Can the accessibility of anomalous sites be compared with access to them from a control vantage point? A site, for example, may present a high amount of anomalies, but that may not be due to censorship. Instead, that might be because the site is down or because the site's server is generally quite flakey.

By integrating the above as part of the engineering of OONI's data processing pipeline, I think we will be able to derive more meaning from the network measurement data.

This may be useful to inform your development priorities cc @FedericoCeratto


Expose the instance number as env-var

(Haven't tried this out yet).
It would be convenient to make the instance number available as an environment variable, since then I can export it to centralised logging as a field in its own right without needing to parse the BUILDKITE_AGENT_NAME one, which tacks it onto the end of the hostname.
I think this might also end up helping with autoscaling, since it could be exposed via buildkite-metrics and allow me to choose an un-busy node to terminate when scaling down?

🤔Does systemd interpolate the %i before passing it in?

I hope so, will try it tomorrow.

Looks like it does, but is off-by-one?!

![systemdunit-proof](https://user-images.githubusercontent.com/69720/39709258-54aace8a-5211-11e8-9329-ab5c80d9a6d9.png)

If this is something specific to systemd, would it make more sense to call it something like: SYSTEMD_INSTANCE_NUMBER? I wouldn't want to confuse people with "why is there an instance number when I run it through latest ubuntu vs. an old version of ubuntu"

The %n is resolved server side on Buildkite.com to the first value which creates a unique agent name, so it may not always correspond to your systemd %i. But you could specify an agent name when starting the agent overriding the config file name format, if you can generate something known to be unique. I think in systemd this should turn into the hostname plus the systemd template instance name, which should be unique?
Environment=BUILDKITE_AGENT_NAME=“%H-%I”

Also, %I isn’t always a number ;-)

It would be convenient to make the instance number available as an environment variable, since then I can export it to centralised logging as a field in its own right without needing to parse the BUILDKITE_AGENT_NAME one, which tacks it onto the end of the hostname.

I reckon setting this at a systemd level is the wrong way to solve these problems. For your logging, I'd suggest using a bootstrap script and parsing BUILDKITE_AGENT_NAME and then setting a specific env for your jobs like BUILDKITE_AGENT_LOG_PREFIX.

I think this might also end up helping with autoscaling, since it could be exposed via buildkite-metrics and allow me to choose an un-busy node to terminate when scaling down?

If you wanted to accomplish this (I still think random with graceful shutdown is a is a better approach), I'd suggest setting host=<unique hostname> as an agent tag for each agent, that way you can aggregate by that tag in metrics and do your autoscaling based on that. Another alternative might be adding a --add-host-tag or similar flag to the agent so that it automatically does that. Happy to help with the latter.

I reckon setting this at a systemd level is the wrong way to solve these problems. For your logging, I'd suggest using a bootstrap script and parsing BUILDKITE_AGENT_NAME and then setting a specific env for your jobs like BUILDKITE_AGENT_LOG_PREFIX.

If I went with parsing, that would break by surprise if the buildkite agent name format changed. I'd prefer to not parse the name at my end when it's available in isolation, therefore.
I'll go with the systemd approach and modify the unit file in preference, I think.

(I still think random with graceful shutdown is a is a better approach)

This is sufficient for auto-scaling brutally, but I'd like to achieve something more graceful.
The reasons for that

some of our compile/test/package type builds are on the order of 45 minutes for our pre-merge pipeline, so interrupting one is a high cost.

We expect that bazel's remote caching will reduce this loss, but we're not online with that quite yet.

some of our soak testing is long running  (literally "start a world, wait for things to happen, make some assertions over the course of days", where "world" might mean tens of cloud VMs), those are even higher cost to interruption.

We're again, working to make that style of test more of a managed service, but not there yet.

re: metrics on tags - I hadn't clocked that the metrics binary would label according to tags as well - thanks, I'll look into that.

Thoughts on whether the recent addition of the machine-id tag changes this @petemounce? Could we look at getting per-machine metrics based on that tag?

I don't think so - the machine-id does not vary with the build-agent process-number.
However, I think I can derive the agent process instance number via removing hostname from agent-name (the heading of each table cell) and trimming the remaining - prefix.

@petemounce I've reread the thread, and I must admit I'm kind of lost as to what you are trying to accomplish here. Reckon you could talk me through the problem you are trying to solve here again?

Let me know if you want to talk this one through any more @petemounce!

Closing this one for now, feel free to raise in discourse or post here if this is still a pressing need.


Integrate with Snowflake's new ACCESS_HISTORY

Snowflake is about to release a new feature that will enable parsing the query and extracting tables and columns set (probably still need to parse the query to learn the relation between the columns for column level lineage).
Main benefits -

Make the tool faster (no need to extract tables lineage using our python parser)
We might be able to simplify the setup (we will consider removing some python dependencies as they won't be needed anymore)

Downsides -

Requires permissions to account_usage
For column level lineage parsing the relation between columns is still needed

Open questions / how does this work with the following -

Views
Copy into commands
Subqueries

Open questions for columns -

Operators / Select * / Cases
Subqueries
Relations

See more details about this upcoming release here -

https://community.snowflake.com/s/article/Pending-Behavior-Change-Log (2021_10)

Done, closing this issue.


Add tests for minContains = 0 but with maxContains

See https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.4.5

Thanks!


test: remove v1beta1 CRD/RBAC e2e tests

These tests all require k8s versions less than 1.22, which is no longer included in our testing matrix. As these tests are no longer exercised, they can be removed.

/retest

/retest


Egress masquerade multiple interfaces fix

This PR introduces fix for egressMasqueradeInterfaces multiple interfaces support.
Multi-interface support can be helpful when cluster contains nodes with different operation systems and network interfaces might have different names
E.g.: EKS cluster upgrade to Amazon Linux 2023 that uses ens instead of eth.
Usage example via Cilium CLI:
cilium install --helm-set=egressMasqueradeInterfaces=eth+\,ens+ ...

Please see per commit for full details.

/test

@viktor-kurchenko , what is the difference between the previous ruleset and the current ones?
IIUC, an example of a previous post rule with multiple interfaces is:
-t nat -A CILIUM_POST_nat -o eth+,ens+ -m set --match-set <IP_ADDRESS> dst -m comment --comment "xxxxx" -j ACCEPT
while now, it seems like we get 2 post rules with a single interface each one of them:
-t nat -A CILIUM_POST_nat -o eth+ -m set --match-set <IP_ADDRESS> dst -m comment --comment "xxxxx" -j ACCEPT
-t nat -A CILIUM_POST_nat -o eth+ -m set --match-set <IP_ADDRESS> dst -m comment --comment "xxxxx" -j ACCEPT

If the above correct?
And same for the AllEgressMasqueradeCmds, having a single rule with comma-separated values or having multiple rules with a single interface value per rule.
If it is the case, what is the difference betwen both approaches?

@viktor-kurchenko , what is the difference between the previous ruleset and the current ones?

Yes, you are right.
I don't think that -o supports more than one interface. So, the PR adds one rule per interface.
Quote from man iptables:
       [!] -o, --out-interface name
              Name of an interface via which a packet is going to be sent (for packets entering the FORWARD, OUTPUT and POSTROUTING chains).  When the "!" argument is  used  be‐
              fore the interface name, the sense is inverted.  If the interface name ends in a "+", then any interface which begins with this name will match.  If this option is
              omitted, any interface name will match.

I've successfully tested the fix with EKS AL2023.

LGTM - thank you for the clarification and for the fix!

Oh that's a neat solution. I wonder if we should make something like this the default so we can support a wide range of Linux distributions out-of-the-box.

Oh that's a neat solution. I wonder if we should make something like this the default so we can support a wide range of Linux distributions out-of-the-box.

If you can give me more context around this, I would be happy to contribute )

cc @cilium/sig-datapath could we change the default value for this flag (in agent and in helm charts) to apply rules for ens+,eth+? Any thoughts/concerns about that idea?

fyi @liyihuang @viktor-kurchenko I renamed the PR for a more accurate release note following the investigation in https://github.com/cilium/cilium/pull/36267#discussion_r1870331079 .
Technically we could consider this a bugfix for v1.16 and backport, however I would want to see a revert of the type change for the flag first because I wouldn't want to break existing users in a patch release because the agent starts interpreting the flag differently--particularly since this interfaces flag is treated differently depending on other flags like enable-masquerade-to-route-source.


Why not_covariant instead of contravariant and invariant?

What does not_covariant actually mean in this API? Does it mean contravariant or invariant? Why not just support both, with those (established) names?

2 main reasons:
A) It doesn't matter if it's invariant or contravariant, as soon as it's not covariant generating borrow_dependent would be unsound, see https://github.com/Voultapher/self_cell/issues/5. Plus the only thing in the language that's actually neither covariant or invariant are function parameters.
B) This crate aims to be a replacement for ouroboros in many situations. They also use this exact same binary pair of names, so migration is less confusing for users.
I'm open to improving the documentation https://docs.rs/self_cell/0.8.0/self_cell/macro.self_cell.html imo makes clear what and why these 2 options do.

Okay, I see. I guess contravariance doesn't really make sense here. I still think invariant would be a better name than not_covariant though. I'll open an issue for ouroboros.

Given I don't plan on changing the name here I'll close this issue. In addition to the above reasons invariant is imo more confusing than helping, as really the question being asked is 'Is this type covariant?' and not 'What sort of variance does this type have?'. Plus the current two options are also easier to distinguish when visually inspecting code.


It does not work with android.support.v7.preference.Preference

android.view.InflateException: Binary XML file line #0: Error inflating class com.jaredrummler.android.colorpicker.ColorPreference
    at android.support.v7.preference.PreferenceInflater.createItem(PreferenceInflater.java:258)
    at android.support.v7.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:287)
    at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:354)
    at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:356)
    at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:162)
    at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:112)
    at android.support.v7.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:138)
    at android.support.v7.preference.PreferenceManagerFix.inflateFromResource(PreferenceManagerFix.java:59)
    at android.support.v7.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:432)
    at com.frogsparks.mytrails.Preferences$MyPreferenceFragment.onCreatePreferencesFix(Preferences.java:759)
    at com.takisoft.fix.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:53)
    at android.support.v4.app.Fragment.performCreate(Fragment.java:2329)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1377)
    at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1109)
    at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:996)
    at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:99)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2364)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)

09-23 10:41:31.807 12310-12310/com.frogsparks.mytrails.debug21 W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.ClassCastException: com.jaredrummler.android.colorpicker.ColorPreference cannot be cast to android.support.v7.preference.Preference
    at android.support.v7.preference.PreferenceInflater.createItem(PreferenceInflater.java:251)

Creating DialogPreferences with the support preferences library is a lot of work. It can be done, but still requires some plumbing in the app to map the DialogPreference to a PreferenceDialogFragmentCompat. This is made slightly easier by the support preference fix library (PreferenceFragmentCompat.addDialogPreference).
Still, it's easier to just handle the onPreferenceTreeClick(Preference preference) and show the dialog in your PreferenceFragmentCompat.
I've made a small modification to ColorPreference which can be included in this project for users of the preference compat library.

@jaredrummler if you're interested, I can create a PR to document how to use the library with the support preference library, and implement the changes in ColorPreference I was referring to.

@jaredrummler do you plan to add support for compat library? @paour any update with PR?
Thanks.

@pawelantczak I try not to waste my time tidying up PRs that end up being ignored by unmaintained projets, but I can send you the relevant files if you wish.

@paour you are right. I ended up using this lib as color picker and https://github.com/kizitonwose/colorpreference as preference view.
Thanks.

there is a only question,How should I get the ColorPreference's color when user changed the default value,
for example,the native EditTextPreference may use like this:
EditTextPreference edit_ref1 = (EditTextPreference) findPreference("edit_ref1");
String txt = edit_ref1.getText();
but in our ColorPreference the color of the member is private ,May I need to add a public method like
int getColor()
{
return color;
}
in the ColorPreference class?
thanks a lot.

@835700012
mColorPreferenceCompat.setValue(color);
as per https://github.com/kizitonwose/colorpreference#custom-picker-sample

@pawelantczak
thanks for your reply,
but I need not to build a custom dialog and override the method onColorSelected(the 1st param is the dialog id.)
the link u show me is the same function onColorSelected(the 2nd param isString tag to indicate the source 'control')
so, I can not find the right way to get the color in the PreferenceCategory....

I mean I use the default color picker dialog,my code is the same as the demo,so simply but I can not get the way to get the ColorPreference item color,thanks a lot again .

@835700012
Why not simply get/set it via preference key?

@pawelantczak
my code
ColorPreference cp1 = (ColorPreference) findPreference("my key");
ColorPreference do not have any method to access the color,what a pity.....

@835700012 How will you use the color user picked?
Via shared preferences. You defined "key" in your xml and you are able to use same key to receive what users picked.
Take a look here: https://stackoverflow.com/questions/2614719/how-do-i-get-the-sharedpreferences-from-a-preferenceactivity-in-android

@pawelantczak
I mean in ColorPreference class do not have any method to access the color,should I add a new funtion to return the color ?
thanks for ur reply.

@835700012 I know.
You don't need to have direct access to selected color.
Every preference works the same way.
In XML definition you have something like this:
 android:key="color_picked"
Android will automatically store value of each preference into shared preferences.
When you want to read what user has picked, you need to use shared preferences.
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getInt("color_picked", 0);

@pawelantczak
thanks a lot, I get the color with ur great help finally !

@pawelantczak
hi, I am coming again,could u please be so kind to tell me how to set the color to the item ColorPreference?
I can not find any way to set the color as opposite prefs.setInt("my Id", value)....
thanks again!

@835700012 ColorPreference has getValue() and setValue(int) methods which you can use to get and set the color value respectively. This also updates the preference view with the new color.

I've created a fork that uses even the newer API, of PreferenceFragmentCompat :
https://github.com/AndroidDeveloperLB/ColorPicker

As briefly mentioned once a color chosen it s automatically saved to sharedpreferences . So to get the color your just need to do
int color = android.preference.PreferenceManager.getDefaultSharedPreferences(getActivity()).getInt("your_key_name_in_preferencesxml", Color.YELLOW);
if you want you can use that color fırther
getColorHex(color)
to get the hex code to be able to use according to your needs

But now I have a question:)
In preferencefragment    setOnPreferenceClickListener onClick method when we use
int color = android.preference.PreferenceManager.getDefaultSharedPreferences(getActivity()).getInt("color_preference", Color.YELLOW);
we get the previous color from the last color choose. How can we get the current chosen color in the sharedpreferences? Thank you

@kilicpl Isn't it the same as all Preference classes, meaning this:
https://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener
There you can check the previous and the new value, at least for other types of preferences.

Yes  you are extremely right AndroidDeveloperLB, my confusion. The working code in YourPreferenceHoldingFragment would be like:
public boolean onPreferenceChange(Preference preference, Object newValue) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
int color=
android.preference.PreferenceManager.getDefaultSharedPreferences(getActivity()).getInt("your_key_name_in_preferencesxml", Color.YELLOW);
     SharedPreferences.Editor preferencesEditor = mPreferences.edit();
     preferencesEditor.putInt("color_preference", (Integer)newValue);
    preferencesEditor.apply();
    return true;
 }

});
Still i m curious how to use with getValue().. Many thanks to creator of this awesome library btw 👍

I may be a year late, but support for has been added.
Simply use:
implementation 'com.jaredrummler:colorpicker-compat:1.0.3'

See the demo for example usage.


Update sql-connection-libraries.md

Make .NET related links match the column heading and section

#sign-off


reduced mol storage 2

Description
Continuation of #190 with all fields targeted. This is strictly test driven dev on existing test suite. All pass but 3 and those are ok if turn off default filtering. The 3 that don't pass I don't understand b/c masses are perfectly accessible (https://github.com/MolSSI/QCElemental/compare/master...loriab:smollmol2?expand=1#diff-c1df0b88317a0c0331bea59a1793059cR769) but not getting stashed for hashing.
[ 1.00782503223 15.99491461957 15.99491461957  1.00782503223]
superdict
schema_name qcschema_molecule
schema_version 2
validated True
symbols ['H' 'O' 'O' 'H']
geometry [[ 1.7317  1.2909  1.0371]
 [ 1.3156 -0.0074 -0.2807]
 [-1.3143  0.0084 -0.2741]
 [-1.7241 -1.3079  1.0277]]
name H2O2
identifiers None
comment None
molecular_charge 0.0
molecular_multiplicity 1
masses None
real None
atom_labels None
atomic_numbers None
mass_numbers None
connectivity None
fragments None
fragment_charges None
fragment_multiplicities None
fix_com False
fix_orientation False
fix_symmetry None
provenance {'creator': 'QCElemental', 'version': 'v0.12.0+59.gce318ac', 'routine': 'qcelemental.molparse.from_schema'}
id None
extras None
symbols ['H' 'O' 'O' 'H']
masses None

Changelog description

Status

[ ] Code base linted
[ ] Ready to go

now working test-wise. glad you're finding it simpler than expected. I'm finding it more involved. But then you've been thinking about this end, whereas I was worried about the backend, which I ended up punting on. I expect some more testing is in order.
It's a little out-of-pattern that the connectivity property returns None for the default. But I guess I'm coming around to that.

I view it as None mean no connectivity supplied while [] means that there are no connected atoms (e.g., helium complexes).


doc/md: sqlc guide (versioned)

Hi, I have added a few more "parts" to it, overall I re-structured to ensure that the concepts are presented first and focus that in this guide, while is called "Versioned migrations", we are using Versioned Migrations + Migration Authoring.
I added a little more of "code" to it as well, showing the generated code, sqlc commands and files, but I feel like the middle of the guide is almost codeblocks only, so feel free to propose changes to remove redundant parts or that makes no sense.
I tried to show more about sqlc, but it is really simple to use and even sqlc getting started is quite lean.


script-src 'strict-dynamic'

I'm trying to migrate an app over from webpack, and we have a CSP policy of strict-dynamic on local scripts. Is there a way to set that in this plugin?

Oh that was easy enough. This worked.
import { defineConfig } from "vite";
import csp from "vite-plugin-csp";

export default defineConfig({
  plugins: [
    csp({
      enabled: true,
      policy: {
        "script-src": "'strict-dynamic'",
      },
    }),
  ],
});


Create snake-water-gun.py

Description 📜

Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context.
Fixes # <issue_number_here>

Domain of Contribution 📊

[ ] Web Development
[ ] App Development
[ ] Flutter Projects
[ ] Python Projects
[ ] C++ Projects
[ ] Clone Projects
[ ] HTML Projects
[ ] Javascript Projects
[ ] Machine Learning Projects
[ ] Others

Checklist ✅

[ ] I follow Contributing Guidelines & Code of conduct of this project.
[ ] I have performed a self-review of my own code or work.
[ ] I have commented my code, particularly in hard-to-understand areas.
[ ] My changes generates no new warnings.

Screenshots / Gif (Optional) 📸

you have not added the description of the project


Prepare 1.0 stable release

The current source is feature complete (and seems to be stable) but needs some testing to be released as 1.0. More testcases for es2015-i18n-tag and tooling are required.

#5

released as v1.0.0


Refactor multiple if case using loop

related issue is  #8783
removed 4 times if logic, and refactor it using for loop
thank you for your review!

Can one of the admins verify this patch?

@KimKiHyuk thank you so much for your contribution!
Sadly, all the code from the TextAnalyticsServiceSerializer.cs class is going to be replaced by issue https://github.com/Azure/azure-sdk-for-net/issues/12951 (see an example), so better not to take this change now.

@KimKiHyuk sure :)
You ok if we close this PR then?

@KimKiHyuk sure :)
You ok if we close this PR then?

sure!  👍
thank you


Update locks on upgrade

Does what it says on the tin.

TIL https://en.wikipedia.org/wiki/Does_exactly_what_it_says_on_the_tin 💡


PP-7719 Update 3DS page with fact check amends

Context
A fact check on the 3DS page have highlighted some things that need fixing.
Changes proposed in this pull request
Factual amends.
Guidance to review
Please check if factually correct
@alexbishop1 - adding you as just wanted to check if we have the steps right under '### Set up 3DS2 (3DS Flex)'?

 If so it's all good to go.

@stevenjmesser Are you happy to green tick this one? If so it's all good to go.

So sorry, @m-green, I saw that Alex had approved it but didn't think to check if one had been requested from me!
This looks good, thanks so much!


Make default target result size configurable in ExecutingStatementResource

https://github.com/prestodb/presto/issues/11908 mentions targetresultsize, is anyone open to a pr to make it configurable in server side properties? ie so folks can try 4mb instead of 1mb. returning 1gb data into reporting tool with odbc/jdbc is really slow. dumping to file on presto server is fast but not an option because the reporting tool cant access files on presto server

Let's add a query.target-result-size.default config option

what classes should be modified for this? especially about where the @Config gets read in. i thought
SqlEnvironmentConfig,     QuerySessionSupplier ,   ExecutingStatementResource would be involved but Session does not accept argument for targetResultSize

https://github.com/prestosql/presto/pull/2347

would be good to log the final targetResultSize value in v1/query json

@electrum Would the approach in https://github.com/prestodb/presto/pull/14641 of adding a session property/config and additionally having Presto itself add the targetResultSize parameter to nextUri be welcome change?
This will make this property transparent to all clients and will be helpful in deployments where we don't control all clients or the clients don't make it easy to pass custom properties or the change required forking the client.
What does everybody think?
To summarize:

A config query.target-result-size.default with a matching session property.
Presto uses the config/session property to adjust the nextUri returned via https://github.com/prestosql/presto/blob/62cf1510d7cec2cd762711b6b3358d7e3259ac65/presto-main/src/main/java/io/prestosql/server/protocol/Query.java#L582.
Both JDBC and HTTP clients enjoy :confetti_ball:

@hashhar - I like the idea of using the session variable to control the behavior.
I had implemented the changes for CLI and JDBC driver. But, now that I think about it, setting the session variable might be easier with existing clients.
I will update my PR #4347 to include this change.


Download location

I didn't see this option with man youtube-dl.
How can I specify the download location for say https://www.youtube.com/watch?v=wvV37--h2-k on my computer?

See our FAQ - use the -o option.

Thank you.