File: //snap/google-cloud-cli/394/lib/googlecloudsdk/command_lib/transfer/appliances/flags.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.
"""Utils for transfer appliances commands."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.util import apis
from googlecloudsdk.calliope import arg_parsers
from googlecloudsdk.command_lib.transfer.appliances import regions
_MESSAGES = apis.GetMessagesModule('transferappliance', 'v1alpha1')
APPLIANCE_MODEL_ENUM = _MESSAGES.Appliance.ModelValueValuesEnum
_APPLIANCE_STATE_ENUM = _MESSAGES.Appliance.StateValueValuesEnum
_ORDER_STATE_ENUM = _MESSAGES.Order.StateValueValuesEnum
# We skip the first enum value, TYPE_UNSPECIFIED, in each case.
_APPLIANCE_MODELS = [e.name for e in APPLIANCE_MODEL_ENUM][1:]
_APPLIANCE_STATES = [e.name for e in _APPLIANCE_STATE_ENUM][1:]
_ORDER_STATES = [e.name for e in _ORDER_STATE_ENUM][1:]
_ADDRESS_HELP = """\
Address where the appliance will be shipped. All fields (or list items)
have a maximum of 80 characters. For more information see
https://support.google.com/business/answer/6397478.
*lines*::: Line of the postal address that doesn't fit in the other
fields. For most countries/regions, the first line will include a street
number and street name. You can have up to 5 address lines.
*locality*::: Generally refers to the city/town portion of the address.
*administrative_area*::: The state or province where the business is
located. Enter the full name (e.g. "California"), common postal
abbreviation (e.g. "CA"), or subdivision (ISO 3166-2) code
(e.g. "US-CA").
*postal_code*::: The postal code of the address.
"""
_CONTACT_HELP = """\
*business*::: Name of the business, if applicable.
*name*::: Name of the primary contact.
*phone*::: The phone number of the primary contact. Should be given in E.164
format consisting of the country calling code (1 to 3 digits) and the
subscriber number, with no additional spaces or formatting, e.g.
`15552220123`.
*emails*::: The email of the primary contact along with any additional email
addresses to include with all correspondence.
"""
_OFFLINE_EXPORT_HELP = """\
Configuration for an offline export transfer, where data is downloaded onto
the appliance at Google and copied from the appliance at the customer site.
*source*::: The Cloud Storage bucket or folder where the data is located,
in the form of `gs://my-bucket/path/to/folder/`.
*manifest*::: Specifies the path to the manifest in Cloud Storage.
An example path is `gs://bucket_name/path/manifest.csv`. The paths in
the manifest file are relative to bucketname. For example, to export
`SOURCE_PATH/object1.pdf`, manifest will have `object1.pdf` in the first
column, followed by object version (optional). For more information see
https://cloud.google.com/storage-transfer/docs/manifest#object_storage_transfers.
"""
def add_appliance_settings(parser, for_create_command=True):
"""Adds appliance flags for appliances orders create."""
appliance_settings = parser.add_group(category='APPLIANCE')
appliance_settings.add_argument(
'--model',
choices=_APPLIANCE_MODELS,
required=for_create_command,
type=str.upper,
help='Model of the appliance to order.',
)
appliance_settings.add_argument(
'--display-name',
help='A mutable, user-settable name for both the appliance and the order.'
)
if for_create_command:
appliance_settings.add_argument(
'--internet-enabled',
action='store_true',
help=(
'Gives the option to put the appliance into online mode,'
' allowing it to transfer data and/or remotely report progress to'
' the cloud over the network. When disabled only offline'
' transfers are possible.'
),
)
appliance_settings.add_argument(
'--cmek',
help=(
'Customer-managed key which will add additional layer of security.'
' By default data is encrypted with a Google-managed key.'
),
)
appliance_settings.add_argument(
'--online-import',
help=(
'Destination for a online import, where data is loaded onto the'
' appliance and automatically transferred to Cloud Storage whenever'
' it has an internet connection. Should be in the form of'
' `gs://my-bucket/path/to/folder/`.'
),
)
appliance_settings.add_argument(
'--offline-import',
help=(
'Destination for a offline import, where data is loaded onto the'
' appliance at the customer site and ingested at Google. Should be in'
' the form of `gs://my-bucket/path/to/folder/`.'
),
)
appliance_settings.add_argument(
'--offline-export',
type=arg_parsers.ArgDict(spec={'source': str, 'manifest': str}),
help=_OFFLINE_EXPORT_HELP,
)
def add_delivery_information(parser, for_create_command=True):
"""Adds delivery flags for appliances orders create."""
if for_create_command:
parser.add_argument(
'--country',
choices=regions.APPROVED_COUNTRIES,
required=True,
help=(
'Country where the appliance will be shipped. Note that this cannot'
' be changed. To ship the appliance to a different country, clone'
' the order instead and set a different country and delivery '
' address. To view a complete list of country codes and names see'
' https://support.google.com/business/answer/6270107.'
),
)
delivery_information = parser.add_group(category='DELIVERY')
delivery_information.add_argument(
'--address',
type=arg_parsers.ArgDict(
spec={
'lines': arg_parsers.ArgList(max_length=5),
'locality': str,
'administrative-area': str,
'postal-code': str,
},
allow_key_only=True,
required_keys=['lines'],
),
help=_ADDRESS_HELP,
)
delivery_information.add_argument(
'--delivery-notes',
help=(
'Add any additional details about your order, such as site details'
' and a preference date when the appliance should be delivered.'
),
)
contact_arg_type = arg_parsers.ArgDict(
spec={
'business': str,
'name': str,
'phone': str,
'emails': arg_parsers.ArgList(),
},
allow_key_only=True,
required_keys=['name', 'phone', 'emails'],
)
delivery_information.add_argument(
'--order-contact',
type=contact_arg_type,
help=_CONTACT_HELP,
)
delivery_information.add_argument(
'--shipping-contact',
type=contact_arg_type,
help=_CONTACT_HELP,
)