File: //snap/google-cloud-cli/current/lib/surface/compute/instances/add_access_config.py
# -*- coding: utf-8 -*- #
# Copyright 2014 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.
"""Command for adding access configs to virtual machine instances."""
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 constants
from googlecloudsdk.calliope import arg_parsers
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.compute.instances import flags
DETAILED_HELP = {
'DESCRIPTION': """
*{command}* is used to create access configurations for network
interfaces of Compute Engine virtual machines. This allows you
to assign a public, external IP to a virtual machine.
""",
'EXAMPLES': """
To assign an public, externally accessible IP to a virtual machine named
``example-instance'' in zone ``us-central1-a'', run:
$ {command} example-instance --zone=us-central1-a
To assign the specific, reserved public IP address ``123.456.789.123''
to the virtual machine, run:
$ {command} example-instance --zone=us-central1-a --address=123.456.789.123
""",
}
def _Args(parser, support_public_dns):
"""Register parser args common to all tracks."""
parser.add_argument(
'--access-config-name',
default=constants.DEFAULT_ACCESS_CONFIG_NAME,
help="""\
Specifies the name of the new access configuration. ``{0}''
is used as the default if this flag is not provided. Since ONE_TO_ONE_NAT
is currently the only access-config type, it is not recommended that you
change this value.
""".format(constants.DEFAULT_ACCESS_CONFIG_NAME))
parser.add_argument(
'--address',
action=arg_parsers.StoreOnceAction,
help="""\
Specifies the external IP address of the new access
configuration. If this is not specified, then the service will
choose an available ephemeral IP address. If an explicit IP
address is given, then that IP address must be reserved by the
project and not be in use by another resource.
""")
flags.AddNetworkInterfaceArgs(parser)
flags.AddPublicPtrArgs(parser, instance=False)
if support_public_dns:
flags.AddPublicDnsArgs(parser, instance=False)
flags.AddNetworkTierArgs(parser, instance=False)
flags.INSTANCE_ARG.AddArgument(parser)
@base.ReleaseTracks(base.ReleaseTrack.GA)
class AddAccessConfigInstances(base.SilentCommand):
"""Create a Compute Engine virtual machine access configuration."""
_support_public_dns = False
@classmethod
def Args(cls, parser):
_Args(parser, support_public_dns=cls._support_public_dns)
def Run(self, args):
"""Invokes request necessary for adding an access config."""
flags.ValidateNetworkTierArgs(args)
holder = base_classes.ComputeApiHolder(self.ReleaseTrack())
client = holder.client
instance_ref = flags.INSTANCE_ARG.ResolveAsResource(
args,
holder.resources,
scope_lister=flags.GetInstanceZoneScopeLister(client))
access_config = client.messages.AccessConfig(
name=args.access_config_name,
natIP=args.address,
type=client.messages.AccessConfig.TypeValueValuesEnum.ONE_TO_ONE_NAT)
if self._support_public_dns:
flags.ValidatePublicDnsFlags(args)
if args.no_public_dns is True:
access_config.setPublicDns = False
elif args.public_dns is True:
access_config.setPublicDns = True
flags.ValidatePublicPtrFlags(args)
if args.no_public_ptr is True:
access_config.setPublicPtr = False
elif args.public_ptr is True:
access_config.setPublicPtr = True
if (args.no_public_ptr_domain is not True and
args.public_ptr_domain is not None):
access_config.publicPtrDomainName = args.public_ptr_domain
network_tier = getattr(args, 'network_tier', None)
if network_tier is not None:
access_config.networkTier = (client.messages.AccessConfig.
NetworkTierValueValuesEnum(network_tier))
request = client.messages.ComputeInstancesAddAccessConfigRequest(
accessConfig=access_config,
instance=instance_ref.Name(),
networkInterface=args.network_interface,
project=instance_ref.project,
zone=instance_ref.zone)
return client.MakeRequests([(client.apitools_client.instances,
'AddAccessConfig', request)])
@base.ReleaseTracks(base.ReleaseTrack.BETA)
class AddAccessConfigInstancesBeta(AddAccessConfigInstances):
"""Create a Compute Engine virtual machine access configuration."""
_support_public_dns = False
@base.ReleaseTracks(base.ReleaseTrack.ALPHA)
class AddAccessConfigInstancesAlpha(AddAccessConfigInstances):
"""Create a Compute Engine virtual machine access configuration."""
_support_public_dns = True
AddAccessConfigInstances.detailed_help = DETAILED_HELP