feat: Add new gcloud commands, API clients, and third-party libraries across various services.

This commit is contained in:
2026-01-01 20:26:35 +01:00
parent 5e23cbece0
commit a19e592eb7
25221 changed files with 8324611 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""Commands for managing Compute Engine network endpoint groups."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
@base.UniverseCompatible
@base.ReleaseTracks(
base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA, base.ReleaseTrack.GA
)
class NetworkEndpointGroups(base.Group):
"""Read and manipulate Compute Engine network endpoint groups."""
category = base.NETWORKING_CATEGORY
NetworkEndpointGroups.detailed_help = {
'DESCRIPTION': """
Read and manipulate network endpoint groups.
For more information about network endpoint groups, see the
[network endpoint groups documentation](https://cloud.google.com/load-balancing/docs/negs/).
See also: [Network endpoint groups API](https://cloud.google.com/compute/docs/reference/rest/v1/networkEndpointGroups).
""",
}

View File

@@ -0,0 +1,268 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""Create network endpoint group command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
import collections
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.api_lib.compute import network_endpoint_groups
from googlecloudsdk.calliope import base
from googlecloudsdk.calliope import exceptions
from googlecloudsdk.command_lib.compute import flags as compute_flags
from googlecloudsdk.command_lib.compute import scope as compute_scope
from googlecloudsdk.command_lib.compute.network_endpoint_groups import flags
from googlecloudsdk.core import log
DETAILED_HELP = {
'EXAMPLES': """
To create a network endpoint group:
$ {command} my-neg --zone=us-central1-a --network=my-network --subnet=my-subnetwork
""",
}
def _GetValidScopesErrorMessage(network_endpoint_type, valid_scopes):
valid_scopes_error_message = ''
if network_endpoint_type in valid_scopes:
valid_scopes_error_message = (
' Type {0} must be specified in the {1} scope.'
).format(
network_endpoint_type, _JoinWithOr(valid_scopes[network_endpoint_type])
)
return valid_scopes_error_message
def _Invert(dic):
new_dic = collections.OrderedDict()
for key, values in dic.items():
for value in values:
new_dic.setdefault(value, list()).append(key)
return new_dic
def _JoinWithOr(strings):
"""Joins strings, for example, into a string like 'A or B' or 'A, B, or C'."""
if not strings:
return ''
elif len(strings) == 1:
return strings[0]
elif len(strings) == 2:
return strings[0] + ' or ' + strings[1]
else:
return ', '.join(strings[:-1]) + ', or ' + strings[-1]
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Create(base.CreateCommand):
"""Create a Compute Engine network endpoint group."""
detailed_help = DETAILED_HELP
support_neg_type = False
support_serverless_deployment = False
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
flags.AddCreateNegArgsToParser(
parser,
support_neg_type=cls.support_neg_type,
support_serverless_deployment=cls.support_serverless_deployment,
)
def Run(self, args):
"""Issues the request necessary for adding the network endpoint group."""
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
messages = holder.client.messages
resources = holder.resources
neg_client = network_endpoint_groups.NetworkEndpointGroupsClient(
client, messages, resources
)
neg_ref = flags.MakeNetworkEndpointGroupsArg().ResolveAsResource(
args,
holder.resources,
default_scope=compute_scope.ScopeEnum.ZONE,
scope_lister=compute_flags.GetDefaultScopeLister(holder.client),
)
self._ValidateNEG(args, neg_ref)
if args.producer_port:
result = neg_client.Create(
neg_ref,
args.network_endpoint_type,
default_port=args.default_port,
producer_port=args.producer_port,
network=args.network,
subnet=args.subnet,
psc_target_service=args.psc_target_service,
)
elif self.support_serverless_deployment:
result = neg_client.Create(
neg_ref,
args.network_endpoint_type,
default_port=args.default_port,
producer_port=args.producer_port,
network=args.network,
subnet=args.subnet,
cloud_run_service=args.cloud_run_service,
cloud_run_tag=args.cloud_run_tag,
cloud_run_url_mask=args.cloud_run_url_mask,
app_engine_app=args.app_engine_app,
app_engine_service=args.app_engine_service,
app_engine_version=args.app_engine_version,
app_engine_url_mask=args.app_engine_url_mask,
cloud_function_name=args.cloud_function_name,
cloud_function_url_mask=args.cloud_function_url_mask,
serverless_deployment_platform=args.serverless_deployment_platform,
serverless_deployment_resource=args.serverless_deployment_resource,
serverless_deployment_version=args.serverless_deployment_version,
serverless_deployment_url_mask=args.serverless_deployment_url_mask,
psc_target_service=args.psc_target_service,
)
else:
result = neg_client.Create(
neg_ref,
args.network_endpoint_type,
default_port=args.default_port,
producer_port=args.producer_port,
network=args.network,
subnet=args.subnet,
cloud_run_service=args.cloud_run_service,
cloud_run_tag=args.cloud_run_tag,
cloud_run_url_mask=args.cloud_run_url_mask,
app_engine_app=args.app_engine_app,
app_engine_service=args.app_engine_service,
app_engine_version=args.app_engine_version,
app_engine_url_mask=args.app_engine_url_mask,
cloud_function_name=args.cloud_function_name,
cloud_function_url_mask=args.cloud_function_url_mask,
psc_target_service=args.psc_target_service,
)
log.CreatedResource(neg_ref.Name(), 'network endpoint group')
return result
def _ValidateNEG(self, args, neg_ref):
"""Validate NEG input before making request."""
is_zonal = hasattr(neg_ref, 'zone')
is_regional = hasattr(neg_ref, 'region')
network_endpoint_type = args.network_endpoint_type
valid_scopes = collections.OrderedDict()
valid_scopes['gce-vm-ip-port'] = ['zonal']
valid_scopes['gce-vm-ip-portmap'] = ['regional']
valid_scopes['internet-ip-port'] = ['global', 'regional']
valid_scopes['internet-fqdn-port'] = ['global', 'regional']
valid_scopes['serverless'] = ['regional']
valid_scopes['private-service-connect'] = ['regional']
valid_scopes['non-gcp-private-ip-port'] = ['zonal']
valid_scopes['gce-vm-ip'] = ['zonal']
valid_scopes_inverted = _Invert(valid_scopes)
if is_zonal:
valid_zonal_types = valid_scopes_inverted['zonal']
if network_endpoint_type not in valid_zonal_types:
raise exceptions.InvalidArgumentException(
'--network-endpoint-type',
'Zonal NEGs only support network endpoints of type {0}.{1}'.format(
_JoinWithOr(valid_zonal_types),
_GetValidScopesErrorMessage(
network_endpoint_type, valid_scopes
),
),
)
elif is_regional:
valid_regional_types = valid_scopes_inverted['regional']
if network_endpoint_type not in valid_regional_types:
raise exceptions.InvalidArgumentException(
'--network-endpoint-type',
'Regional NEGs only support network endpoints of type {0}.{1}'
.format(
_JoinWithOr(valid_regional_types),
_GetValidScopesErrorMessage(
network_endpoint_type, valid_scopes
),
),
)
if (
network_endpoint_type == 'private-service-connect'
and not args.psc_target_service
):
raise exceptions.InvalidArgumentException(
'--private-service-connect',
(
'Network endpoint type private-service-connect must specify '
'--psc-target-service for private service NEG.'
),
)
else:
valid_global_types = valid_scopes_inverted['global']
if network_endpoint_type not in valid_global_types:
raise exceptions.InvalidArgumentException(
'--network-endpoint-type',
'Global NEGs only support network endpoints of type {0}.{1}'.format(
_JoinWithOr(valid_global_types),
_GetValidScopesErrorMessage(
network_endpoint_type, valid_scopes
),
),
)
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class CreateBeta(Create):
"""Create a Google Compute Engine network endpoint group."""
support_serverless_deployment = True
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
flags.AddCreateNegArgsToParser(
parser,
support_neg_type=cls.support_neg_type,
support_serverless_deployment=cls.support_serverless_deployment,
)
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class CreateAlpha(CreateBeta):
"""Create a Google Compute Engine network endpoint group."""
support_neg_type = True
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
flags.AddCreateNegArgsToParser(
parser,
support_neg_type=cls.support_neg_type,
support_serverless_deployment=cls.support_serverless_deployment,
)

View File

@@ -0,0 +1,92 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""Delete network endpoint groups command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute import flags as compute_flags
from googlecloudsdk.command_lib.compute import scope as compute_scope
from googlecloudsdk.command_lib.compute.network_endpoint_groups import flags
from googlecloudsdk.core import log
from googlecloudsdk.core.console import console_io
DETAILED_HELP = {
'EXAMPLES': """
To delete a network endpoint group named ``my-neg'':
$ {command} my-neg --zone=us-central1-a
""",
}
@base.ReleaseTracks(
base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA, base.ReleaseTrack.GA
)
class Delete(base.DeleteCommand):
"""Delete a Compute Engine network endpoint group."""
detailed_help = DETAILED_HELP
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
neg_ref = flags.MakeNetworkEndpointGroupsArg().ResolveAsResource(
args,
holder.resources,
default_scope=compute_scope.ScopeEnum.ZONE,
scope_lister=compute_flags.GetDefaultScopeLister(holder.client),
)
console_io.PromptContinue(
'You are about to delete network endpoint group: [{}]'.format(
neg_ref.Name()
),
throw_if_unattended=True,
cancel_on_no=True,
)
messages = holder.client.messages
if hasattr(neg_ref, 'zone'):
request = messages.ComputeNetworkEndpointGroupsDeleteRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
zone=neg_ref.zone,
)
service = holder.client.apitools_client.networkEndpointGroups
elif hasattr(neg_ref, 'region'):
request = messages.ComputeRegionNetworkEndpointGroupsDeleteRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
region=neg_ref.region,
)
service = holder.client.apitools_client.regionNetworkEndpointGroups
else:
request = messages.ComputeGlobalNetworkEndpointGroupsDeleteRequest(
networkEndpointGroup=neg_ref.Name(), project=neg_ref.project
)
service = holder.client.apitools_client.globalNetworkEndpointGroups
result = client.MakeRequests([(service, 'Delete', request)])
log.DeletedResource(neg_ref.Name(), 'network endpoint group')
return result

View File

@@ -0,0 +1,80 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""Describe network endpoint groups command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute import flags as compute_flags
from googlecloudsdk.command_lib.compute import scope as compute_scope
from googlecloudsdk.command_lib.compute.network_endpoint_groups import flags
DETAILED_HELP = {
'EXAMPLES': """
To describe a network endpoint group:
$ {command} my-neg --zone=us-central1-a
""",
}
@base.ReleaseTracks(
base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA, base.ReleaseTrack.GA
)
class Describe(base.DescribeCommand):
"""Describe a Compute Engine network endpoint group."""
detailed_help = DETAILED_HELP
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
neg_ref = flags.MakeNetworkEndpointGroupsArg().ResolveAsResource(
args,
holder.resources,
default_scope=compute_scope.ScopeEnum.ZONE,
scope_lister=compute_flags.GetDefaultScopeLister(holder.client),
)
messages = holder.client.messages
if hasattr(neg_ref, 'zone'):
request = messages.ComputeNetworkEndpointGroupsGetRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
zone=neg_ref.zone,
)
service = holder.client.apitools_client.networkEndpointGroups
elif hasattr(neg_ref, 'region'):
request = messages.ComputeRegionNetworkEndpointGroupsGetRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
region=neg_ref.region,
)
service = holder.client.apitools_client.regionNetworkEndpointGroups
else:
request = messages.ComputeGlobalNetworkEndpointGroupsGetRequest(
networkEndpointGroup=neg_ref.Name(), project=neg_ref.project
)
service = holder.client.apitools_client.globalNetworkEndpointGroups
return client.MakeRequests([(service, 'Get', request)])[0]

View File

@@ -0,0 +1,74 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""List network endpoint groups command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.api_lib.compute import lister
from googlecloudsdk.calliope import base
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA, base.ReleaseTrack.BETA)
class List(base.ListCommand):
"""Lists Compute Engine network endpoint groups."""
detailed_help = base_classes.GetMultiScopeListerHelp(
'network endpoint groups',
[
base_classes.ScopeType.zonal_scope,
base_classes.ScopeType.regional_scope,
base_classes.ScopeType.global_scope,
],
)
@classmethod
def Args(cls, parser):
table = """\
table(
name,
uri().scope().segment(-3).yesno(no="global"):label=LOCATION,
networkEndpointType:label=ENDPOINT_TYPE,
size
)
"""
parser.display_info.AddFormat(table)
lister.AddMultiScopeListerFlags(
parser, zonal=True, regional=True, global_=True
)
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
request_data = lister.ParseMultiScopeFlags(args, holder.resources)
list_implementation = lister.MultiScopeLister(
client,
zonal_service=client.apitools_client.networkEndpointGroups,
regional_service=client.apitools_client.regionNetworkEndpointGroups,
global_service=client.apitools_client.globalNetworkEndpointGroups,
aggregation_service=client.apitools_client.networkEndpointGroups,
)
return lister.Invoke(request_data, list_implementation)
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class ListAlpha(List):
"""List a Google Compute Engine network endpoint group."""

View File

@@ -0,0 +1,143 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""list network endpoints command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from apitools.base.py import list_pager
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.api_lib.compute import filter_rewrite
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute import flags as compute_flags
from googlecloudsdk.command_lib.compute.network_endpoint_groups import flags
from googlecloudsdk.core.resource import resource_projection_spec
DETAILED_HELP = {
'EXAMPLES': """
To list network endpoints of a network endpoint group named ``my-neg''
in zone ``us-central1-a'':
$ {command} my-neg --zone=us-central1-a
""",
}
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA)
class ListNetworkEndpoints(base.ListCommand):
"""List network endpoints in a network endpoint group."""
detailed_help = DETAILED_HELP
display_info_format = """\
table(
networkEndpoint.instance,
networkEndpoint.ipAddress,
networkEndpoint.ipv6Address,
networkEndpoint.port,
networkEndpoint.fqdn,
networkEndpoint.clientDestinationPort
)"""
@classmethod
def Args(cls, parser):
parser.display_info.AddFormat(cls.display_info_format)
base.URI_FLAG.RemoveFromParser(parser)
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
messages = client.messages
neg_ref = flags.MakeNetworkEndpointGroupsArg().ResolveAsResource(
args,
holder.resources,
scope_lister=compute_flags.GetDefaultScopeLister(client),
)
display_info = args.GetDisplayInfo()
defaults = resource_projection_spec.ProjectionSpec(
symbols=display_info.transforms, aliases=display_info.aliases
)
args.filter, filter_expr = filter_rewrite.Rewriter().Rewrite(
args.filter, defaults=defaults
)
if hasattr(neg_ref, 'zone'):
request = (
messages.ComputeNetworkEndpointGroupsListNetworkEndpointsRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
zone=neg_ref.zone,
filter=filter_expr,
)
)
service = client.apitools_client.networkEndpointGroups
elif hasattr(neg_ref, 'region'):
request = messages.ComputeRegionNetworkEndpointGroupsListNetworkEndpointsRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
region=neg_ref.region,
filter=filter_expr,
)
service = client.apitools_client.regionNetworkEndpointGroups
else:
request = messages.ComputeGlobalNetworkEndpointGroupsListNetworkEndpointsRequest(
networkEndpointGroup=neg_ref.Name(),
project=neg_ref.project,
filter=filter_expr,
)
service = client.apitools_client.globalNetworkEndpointGroups
return list_pager.YieldFromList(
service,
request,
method='ListNetworkEndpoints',
field='items',
limit=args.limit,
batch_size=None,
)
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class BetaListNetworkEndpoints(ListNetworkEndpoints):
"""List network endpoints in a network endpoint group."""
display_info_format = """\
table(
networkEndpoint.instance,
networkEndpoint.ipAddress,
networkEndpoint.ipv6Address,
networkEndpoint.port,
networkEndpoint.fqdn,
networkEndpoint.clientDestinationPort
)"""
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class AlphaListNetworkEndpoints(ListNetworkEndpoints):
"""List network endpoints in a network endpoint group."""
display_info_format = """\
table(
networkEndpoint.instance,
networkEndpoint.ipAddress,
networkEndpoint.ipv6Address,
networkEndpoint.port,
networkEndpoint.fqdn,
networkEndpoint.clientDestinationPort
)"""

View File

@@ -0,0 +1,84 @@
# -*- coding: utf-8 -*- #
# Copyright 2018 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.
"""Update network endpoint group command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.compute import base_classes
from googlecloudsdk.api_lib.compute import network_endpoint_groups
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute import flags as compute_flags
from googlecloudsdk.command_lib.compute.network_endpoint_groups import flags
DETAILED_HELP = {'EXAMPLES': """
To add two endpoints to a network endpoint group:
$ {command} my-neg --zone=us-central1-a --add-endpoint=instance=my-instance1,ip=127.0.0.1,port=1234 --add-endpoint=instance=my-instance2
To remove two endpoints from a network endpoint group:
$ {command} my-neg --zone=us-central1-a --remove-endpoint=instance=my-instance1,ip=127.0.0.1,port=1234 --remove-endpoint=instance=my-instance2
"""}
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.GA)
class Update(base.UpdateCommand):
"""Update a Compute Engine network endpoint group."""
detailed_help = DETAILED_HELP
@classmethod
def Args(cls, parser):
flags.MakeNetworkEndpointGroupsArg().AddArgument(parser)
flags.AddUpdateNegArgsToParser(parser)
def Run(self, args):
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
messages = holder.client.messages
resources = holder.resources
neg_ref = flags.MakeNetworkEndpointGroupsArg().ResolveAsResource(
args,
resources,
scope_lister=compute_flags.GetDefaultScopeLister(holder.client),
)
client = network_endpoint_groups.NetworkEndpointGroupsClient(
client, messages, resources
)
add_endpoints = (
args.add_endpoint if args.IsSpecified('add_endpoint') else None
)
remove_endpoints = (
args.remove_endpoint if args.IsSpecified('remove_endpoint') else None
)
return client.Update(
neg_ref, add_endpoints=add_endpoints, remove_endpoints=remove_endpoints
)
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class BetaUpdate(Update):
"""Update a Compute Engine network endpoint group."""
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class AlphaUpdate(Update):
"""Update a Compute Engine network endpoint group."""