HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/394/lib/googlecloudsdk/api_lib/edge_cloud/container/nodepool.py
# -*- coding: utf-8 -*- #
# Copyright 2023 Google LLC. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Helpers for the container node pool related commands."""

from googlecloudsdk.api_lib.edge_cloud.container import util
from googlecloudsdk.calliope import base
from googlecloudsdk.calliope import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.util.args import labels_util
from googlecloudsdk.core import resources


def GetNodePoolReference(args):
  """Get edgecontainer node pool resources.

  Args:
    args: command line arguments.

  Returns:
    edgecontainer node pool resources.
  """
  return resources.REGISTRY.ParseRelativeName(
      args.CONCEPTS.node_pool.Parse().RelativeName(),
      collection='edgecontainer.projects.locations.clusters.nodePools',
  )


def GetNodePoolGetRequest(args, release_track):
  """Get node pool get request message.

  Args:
    args: comand line arguments.
    release_track: release track of the command.

  Returns:
    message obj, node pool get request message.
  """
  messages = util.GetMessagesModule(release_track)
  req = messages.EdgecontainerProjectsLocationsClustersNodePoolsGetRequest(
      name=args.CONCEPTS.node_pool.Parse().RelativeName(),
  )
  return req


def GetNodePoolCreateRequest(args, release_track):
  """Get node pool create request message.

  Args:
    args: comand line arguments.
    release_track: release track of the command.

  Returns:
    message obj, node pool create request message.
  """
  messages = util.GetMessagesModule(release_track)
  node_pool_ref = GetNodePoolReference(args)
  req = messages.EdgecontainerProjectsLocationsClustersNodePoolsCreateRequest(
      nodePool=messages.NodePool(),
      nodePoolId=node_pool_ref.nodePoolsId,
      parent=node_pool_ref.Parent().RelativeName(),
  )
  PopulateNodePoolCreateMessage(req, messages, args)
  if release_track == base.ReleaseTrack.ALPHA:
    PopulateNodePoolAlphaCreateMessage(req, args)
  return req


def GetNodePoolUpdateRequest(args, release_track, existing_node_pool):
  """Get node pool update request message.

  Args:
    args: comand line arguments.
    release_track: release track of the command.
    existing_node_pool: existing node pool.

  Returns:
    message obj, node pool update request message.
  """
  messages = util.GetMessagesModule(release_track)
  req = messages.EdgecontainerProjectsLocationsClustersNodePoolsPatchRequest(
      name=args.CONCEPTS.node_pool.Parse().RelativeName(),
      nodePool=messages.NodePool(),
  )
  update_mask_pieces = []
  PopulateNodePoolUpdateMessage(
      req, messages, args, update_mask_pieces, existing_node_pool
  )
  req.updateMask = ','.join(update_mask_pieces)
  return req


def PopulateNodePoolCreateMessage(req, messages, args):
  """Fill the node pool message from command arguments.

  Args:
    req: create node pool request message.
    messages: message module of edgecontainer node pool.
    args: command line arguments.
  """
  req.nodePool.nodeCount = int(args.node_count)
  req.nodePool.nodeLocation = args.node_location
  if flags.FlagIsExplicitlySet(args, 'machine_filter'):
    req.nodePool.machineFilter = args.machine_filter
  if flags.FlagIsExplicitlySet(args, 'local_disk_kms_key'):
    req.nodePool.localDiskEncryption = messages.LocalDiskEncryption()
    req.nodePool.localDiskEncryption.kmsKey = args.local_disk_kms_key
  if flags.FlagIsExplicitlySet(args, 'labels'):
    req.nodePool.labels = messages.NodePool.LabelsValue()
    req.nodePool.labels.additionalProperties = []
    for key, value in args.labels.items():
      v = messages.NodePool.LabelsValue.AdditionalProperty()
      v.key = key
      v.value = value
      req.nodePool.labels.additionalProperties.append(v)
  if flags.FlagIsExplicitlySet(args, 'node_labels'):
    req.nodePool.nodeConfig = messages.NodeConfig()
    req.nodePool.nodeConfig.labels = messages.NodeConfig.LabelsValue()
    req.nodePool.nodeConfig.labels.additionalProperties = []
    for key, value in args.node_labels.items():
      v = messages.NodeConfig.LabelsValue.AdditionalProperty()
      v.key = key
      v.value = value
      req.nodePool.nodeConfig.labels.additionalProperties.append(v)
  if flags.FlagIsExplicitlySet(args, 'node_storage_schema'):
    if not req.nodePool.nodeConfig:
      req.nodePool.nodeConfig = messages.NodeConfig()
    req.nodePool.nodeConfig.nodeStorageSchema = args.node_storage_schema


def PopulateNodePoolAlphaCreateMessage(req, args):
  """Fill the Alpha create node pool message from command arguments.

  Args:
    req: create node pool request message.
    args: command line arguments.
  """
  if flags.FlagIsExplicitlySet(args, 'node_system_partition_size_gib'):
    messages = util.GetMessagesModule(base.ReleaseTrack.ALPHA)
    if not req.nodePool.nodeConfig:
      req.nodePool.nodeConfig = messages.NodeConfig()
    SetNodeSystemPartitionSize(req, args, messages)


def PopulateNodePoolUpdateAlphaMessage(req, messages, update_mask_pieces, args):
  """Filled the Alpha node pool message from command arguments.

  Args:
    req: create node pool request message.
    messages: message module of edgecontainer node pool.
    update_mask_pieces: update masks.
    args: command line arguments.
  """
  if flags.FlagIsExplicitlySet(
      args, 'use_google_managed_key'
  ) and flags.FlagIsExplicitlySet(args, 'local_disk_kms_key'):
    raise exceptions.InvalidArgumentException(
        '--use-google-managed-key, --local-disk-kms-key',
        'cannot be specified at the same time',
    )
  if flags.FlagIsExplicitlySet(args, 'use_google_managed_key'):
    update_mask_pieces.append('localDiskEncryption')
    req.nodePool.localDiskEncryption = messages.LocalDiskEncryption()
    req.nodePool.localDiskEncryption.kmsKey = ''
    return
  if flags.FlagIsExplicitlySet(args, 'local_disk_kms_key'):
    update_mask_pieces.append('localDiskEncryption')
    req.nodePool.localDiskEncryption = messages.LocalDiskEncryption()
    req.nodePool.localDiskEncryption.kmsKey = args.local_disk_kms_key
    return


def PopulateNodePoolUpdateMessage(
    req, messages, args, update_mask_pieces, existing_node_pool
):
  """Fill the node pool message from command arguments.

  Args:
    req: update node pool request message.
    messages: message module of edgecontainer node pool.
    args: command line arguments.
    update_mask_pieces: update mask pieces.
    existing_node_pool: existing node pool.
  """
  if flags.FlagIsExplicitlySet(args, 'machine_filter'):
    update_mask_pieces.append('machineFilter')
    req.nodePool.machineFilter = args.machine_filter
  if flags.FlagIsExplicitlySet(args, 'node_count'):
    update_mask_pieces.append('nodeCount')
    req.nodePool.nodeCount = int(args.node_count)
  add_labels = labels_util.GetUpdateLabelsDictFromArgs(args)
  remove_labels = labels_util.GetRemoveLabelsListFromArgs(args)
  value_type = messages.NodePool.LabelsValue
  label_update_result = labels_util.Diff(
      additions=add_labels, subtractions=remove_labels, clear=args.clear_labels
  ).Apply(value_type, existing_node_pool.labels)
  if label_update_result.needs_update:
    update_mask_pieces.append('labels')
    req.nodePool.labels = label_update_result.labels
  if flags.FlagIsExplicitlySet(args, 'node_labels'):
    update_mask_pieces.append('nodeConfig.labels')
    req.nodePool.nodeConfig = messages.NodeConfig()
    req.nodePool.nodeConfig.labels = messages.NodeConfig.LabelsValue()
    req.nodePool.nodeConfig.labels.additionalProperties = []
    for key, value in args.node_labels.items():
      v = messages.NodeConfig.LabelsValue.AdditionalProperty()
      v.key = key
      v.value = value
      req.nodePool.nodeConfig.labels.additionalProperties.append(v)
  if flags.FlagIsExplicitlySet(
      args, 'use_google_managed_key'
  ) and flags.FlagIsExplicitlySet(args, 'local_disk_kms_key'):
    raise exceptions.InvalidArgumentException(
        '--use-google-managed-key, --local-disk-kms-key',
        'cannot be specified at the same time',
    )
  if flags.FlagIsExplicitlySet(args, 'use_google_managed_key'):
    update_mask_pieces.append('localDiskEncryption')
    req.nodePool.localDiskEncryption = messages.LocalDiskEncryption()
    req.nodePool.localDiskEncryption.kmsKey = ''
  if flags.FlagIsExplicitlySet(args, 'local_disk_kms_key'):
    update_mask_pieces.append('localDiskEncryption')
    req.nodePool.localDiskEncryption = messages.LocalDiskEncryption()
    req.nodePool.localDiskEncryption.kmsKey = args.local_disk_kms_key


def SetNodeSystemPartitionSize(req, args, messages):
  """Set node system partition size in the node pool request message.

  Args:
   req: Create node pool request message.
   args: Command line arguments.
   messages: Message module of edgecontainer node pool.
  """
  if args.node_system_partition_size_gib == 100:
    req.nodePool.nodeConfig.nodeSystemPartitionSize = (
        messages.NodeConfig.NodeSystemPartitionSizeValueValuesEnum.SYSTEM_PARTITION_GIB_SIZE100
    )
  elif args.node_system_partition_size_gib == 300:
    req.nodePool.nodeConfig.nodeSystemPartitionSize = (
        messages.NodeConfig.NodeSystemPartitionSizeValueValuesEnum.SYSTEM_PARTITION_GIB_SIZE300
    )
  else:
    raise ValueError(
        'Unsupported --node_system_partition_size_gib value: '
        + args.node_system_partition_size_gib
        + '; valid values are 100 and 300.'
    )