File: //snap/google-cloud-cli/current/lib/surface/runtime_config/configs/waiters/create.py
# -*- coding: utf-8 -*- #
# Copyright 2016 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.
"""The configs waiters create command."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.runtime_config import util
from googlecloudsdk.calliope import arg_parsers
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.runtime_config import flags
from googlecloudsdk.core import log
class Create(base.CreateCommand):
"""Create waiter resources.
This command creates a new waiter resource with the specified name and
parameters.
"""
detailed_help = {
'EXAMPLES': """
To create a waiter in "my-config" with success and failure paths
nested under "/status", run:
$ {command} my-waiter --config-name=my-config --timeout=15m --success-cardinality-path=/status/success --success-cardinality-number=5 --failure-cardinality-path=/status/failure --failure-cardinality-number=1
This waiter will wait for at most 15 minutes for the first of two
possible scenarios: 1) five or more variables are written to the
/status/success/ path; or 2) one or more variables are written to the
/status/failure/ path.
To create a waiter without a failure path, run:
$ {command} my-waiter --config-name=my-config --timeout=15m --success-cardinality-path=/status/success --success-cardinality-number=5
This waiter will wait until 5 or more success variables are written,
or the 15 minute timeout elapses.
""",
}
@staticmethod
def Args(parser):
"""Args is called by calliope to gather arguments for this command.
Args:
parser: An argparse parser that you can use to add arguments that go
on the command line after this command. Positional arguments are
allowed.
"""
flags.AddRequiredConfigFlag(parser)
base.ASYNC_FLAG.AddToParser(parser)
parser.add_argument(
'--timeout',
type=arg_parsers.Duration(lower_bound='1s',
upper_bound='{0}s'.format(
util.MAX_WAITER_TIMEOUT)),
required=True,
help="""\
The amount of time to wait before failing with DEADLINE_EXCEEDED.
See $ gcloud topic datetimes for information on duration formats.
""")
parser.add_argument(
'--success-cardinality-path',
help='The path where success variables are written.',
required=True)
parser.add_argument(
'--success-cardinality-number',
help='The minimum required number of success variables.',
type=arg_parsers.BoundedInt(lower_bound=1),
default=1)
parser.add_argument(
'--failure-cardinality-path',
help='The path where failure variables are written.')
parser.add_argument(
'--failure-cardinality-number',
help='The minimum required number of failure variables.',
type=arg_parsers.BoundedInt(lower_bound=1),
default=1)
parser.add_argument('name', help='The waiter name.')
def Run(self, args):
"""Run 'runtime-configs waiters create'.
Args:
args: argparse.Namespace, The arguments that this command was invoked
with.
Returns:
The associated waiter operation.
Raises:
HttpException: An http error response was received while executing api
request.
"""
waiter_client = util.WaiterClient()
messages = util.Messages()
waiter_resource = util.ParseWaiterName(args.name, args)
project = waiter_resource.projectsId
config = waiter_resource.configsId
success = messages.EndCondition(
cardinality=messages.Cardinality(
path=args.success_cardinality_path,
number=args.success_cardinality_number,
)
)
if args.failure_cardinality_path:
failure = messages.EndCondition(
cardinality=messages.Cardinality(
path=args.failure_cardinality_path,
number=args.failure_cardinality_number,
)
)
else:
failure = None
result = waiter_client.Create(
messages.RuntimeconfigProjectsConfigsWaitersCreateRequest(
parent=util.ConfigPath(project, config),
waiter=messages.Waiter(
name=waiter_resource.RelativeName(),
timeout='{0}s'.format(args.timeout),
success=success,
failure=failure,
)
)
)
log.CreatedResource(waiter_resource)
if args.async_:
# In async mode, we return the current waiter representation.
# The waiter resource exists immediately after creation; the
# operation resource returned from CreateWaiter only tracks the
# waiting process.
self._async_resource = waiter_resource
request = (waiter_client.client.MESSAGES_MODULE
.RuntimeconfigProjectsConfigsWaitersGetRequest(
name=waiter_resource.RelativeName()))
result = waiter_client.Get(request)
else:
self._async_resource = None
result = util.WaitForWaiter(waiter_resource)
if util.IsFailedWaiter(result):
self.exit_code = 2 # exit with code 2 if the result waiter failed.
return util.FormatWaiter(result)
def Epilog(self, unused_resources_were_displayed):
"""Called after resources are displayed if the default format was used.
Args:
unused_resources_were_displayed: Unused.
"""
if self._async_resource:
log.status.Print()
log.status.Print(
('The wait command can be used to monitor the progress '
'of waiter [{0}].').format(self._async_resource.Name()))