module GClouder::Resources::Container::NodePools::NodePool

Public Class Methods

autoscale(cluster, pool) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 175
def self.autoscale(cluster, pool)
  return if !pool["enable_autoscaling"]

  if !check_exists?(cluster["name"], pool["name"], pool["zone"])
    info "skipping autoscale for non-existant cluster/nodepool: #{cluster["name"]}/#{pool["name"]}", indent: 5
    return
  end

  autoscaling = gcloud("container node-pools list --cluster #{cluster["name"]} --zone #{cluster["zone"]} | jq '.[] | select(.name == \"#{pool["name"]}\") | .autoscaling'", force: true)

  if !autoscaling.key?("minNodeCount")
    autoscaling["minNodeCount"] = 0
  end

  if pool["min_nodes"] != autoscaling["minNodeCount"] or pool["max_nodes"] != autoscaling["maxNodeCount"]
    config = pool.context(:autoscale_cluster)
    parameters = hash_to_args(config)

    add "Updating autoscale constraints: Min: #{autoscaling["minNodeCount"]} -> #{pool["min_nodes"]} : Max: #{autoscaling["maxNodeCount"]} -> #{pool["max_nodes"]}", indent: 5
    gcloud("container clusters update #{cluster["name"]} --node-pool #{pool["name"]} #{parameters} --zone #{cluster["zone"]}")
  else
    true
  end
end
calculate_number_of_zones(pool) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 200
def self.calculate_number_of_zones(pool)
  pool.key?("additional_zones") ? (pool["additional_zones"].count + 1) : 1
end
check_exists?(cluster_name, nodepool, zone) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 213
def self.check_exists?(cluster_name, nodepool, zone)
  gcloud("--format json container node-pools list --zone #{zone} --cluster #{cluster_name} | jq 'select(.[].name == \"#{nodepool}\") | length'", force: true).to_i.nonzero?
end
create(cluster, pool) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 129
def self.create(cluster, pool)
  parameters = hash_to_args(pool.context(:create_nodepool))
  zone = pool["zone"]

  if !check_exists?(cluster["name"], pool["name"], zone)
    gcloud("container node-pools create --cluster #{cluster["name"]} #{parameters} #{pool["name"]}")
    if cli_args[:dry_run]
      add pool["name"], indent: 4
    else
      sleep 1 until check_exists?(cluster["name"], pool["name"], zone)
    end
  else
    good "#{pool["name"]}", indent: 4
  end
end
remote_size(cluster_name, pool_name, zone) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 204
def self.remote_size(cluster_name, pool_name, zone)
  remote_pool_config = gcloud("--format json container clusters describe #{cluster_name} --zone #{zone} | jq --join-output -c '.nodePools[] | select(.name == \"#{pool_name}\")'", force: true)
  instance_group_ids = remote_pool_config["instanceGroupUrls"].map { |url| data = url.split("/"); [ data[-1], data[-3] ] }.to_h
  nodes = instance_group_ids.map do |instance_group_id, zone|
    gcloud("--format json compute instance-groups describe --zone #{zone} #{instance_group_id} | jq '.size'", force: true).to_i
  end
  nodes.inject(0) { |sum, i| sum + i }
end
resize(cluster, pool) click to toggle source
# File lib/gclouder/resources/container/node_pools.rb, line 145
def self.resize(cluster, pool)
  return if !pool["num_nodes"] or pool["enable_autoscaling"]
  config = pool.context(:resize_cluster)
  zone = pool["zone"]

  if !check_exists?(cluster["name"], pool["name"], zone)
    info "skipping resize for non-existant cluster/nodepool: #{cluster["name"]}/#{pool["name"]}", indent: 5
    return
  end

  number_of_zones = calculate_number_of_zones(pool)

  parameters = hash_to_args(config)

  current_size = remote_size(cluster["name"], pool["name"], pool["zone"])

  desired_size = if pool.key?("additional_zones")
    config["size"] * number_of_zones
  else
    config["size"]
  end

  if desired_size != current_size
    add "resizing pool (zones: #{number_of_zones}): #{current_size} -> #{desired_size}", indent: 5
    gcloud("container clusters resize #{cluster["name"]} --node-pool #{pool["name"]} #{parameters}")
  else
    true
  end
end