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 2022 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 gcloud run executions group."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import platforms
from googlecloudsdk.core import properties
@base.UniverseCompatible
class Executions(base.Group):
"""View and manage your Cloud Run jobs executions.
This set of commands can be used to view and manage your Cloud Run jobs
executions.
"""
detailed_help = {
'EXAMPLES':
"""
To list your executions for a job, run:
$ {command} list --job=my-job
""",
}

View File

@@ -0,0 +1,90 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 canceling executions."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import cancellation
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import pretty_print
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
from googlecloudsdk.core.console import console_io
@base.UniverseCompatible
class Cancel(base.Command):
"""Cancel an execution."""
detailed_help = {
'DESCRIPTION': """
{description}
""",
'EXAMPLES': """
To cancel an execution:
$ {command} my-execution
""",
}
@staticmethod
def CommonArgs(parser):
execution_presentation = presentation_specs.ResourcePresentationSpec(
'EXECUTION',
resource_args.GetExecutionResourceSpec(),
'Execution to cancel.',
required=True,
prefixes=False,
)
flags.AddAsyncFlag(
parser, default_async_for_cluster=True
)
concept_parsers.ConceptParser([execution_presentation]).AddToParser(parser)
@staticmethod
def Args(parser):
Cancel.CommonArgs(parser)
def Run(self, args):
"""Cancel an execution."""
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack()
)
ex_ref = args.CONCEPTS.execution.Parse()
console_io.PromptContinue(
message='Execution [{}] will be cancelled.'.format(ex_ref.executionsId),
throw_if_unattended=True,
cancel_on_no=True,
)
with serverless_operations.Connect(conn_context) as client:
cancellation.Cancel(
ex_ref, client.GetExecution, client.CancelExecution, args.async_
)
if args.async_:
pretty_print.Success(
'Execution [{}] is being cancelled.'.format(ex_ref.executionsId)
)
else:
pretty_print.Success(
'Cancelled execution [{}].'.format(ex_ref.executionsId)
)

View File

@@ -0,0 +1,89 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 deleting executions."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import deletion
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import pretty_print
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
from googlecloudsdk.core import log
from googlecloudsdk.core.console import console_io
@base.UniverseCompatible
class Delete(base.Command):
"""Delete an execution."""
detailed_help = {
'DESCRIPTION': """
{description}
""",
'EXAMPLES': """
To delete an execution:
$ {command} my-execution
""",
}
@staticmethod
def CommonArgs(parser):
execution_presentation = presentation_specs.ResourcePresentationSpec(
'EXECUTION',
resource_args.GetExecutionResourceSpec(),
'Execution to delete.',
required=True,
prefixes=False,
)
flags.AddAsyncFlag(
parser, default_async_for_cluster=True
)
concept_parsers.ConceptParser([execution_presentation]).AddToParser(parser)
@staticmethod
def Args(parser):
Delete.CommonArgs(parser)
def Run(self, args):
"""Delete an execution."""
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack()
)
ex_ref = args.CONCEPTS.execution.Parse()
console_io.PromptContinue(
message='Execution [{}] will be deleted.'.format(ex_ref.executionsId),
throw_if_unattended=True,
cancel_on_no=True,
)
with serverless_operations.Connect(conn_context) as client:
deletion.Delete(
ex_ref, client.GetExecution, client.DeleteExecution, args.async_
)
if args.async_:
pretty_print.Success(
'Execution [{}] is being deleted.'.format(ex_ref.executionsId)
)
else:
log.DeletedResource(ex_ref.executionsId, 'execution')

View File

@@ -0,0 +1,86 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 obtaining details about executions."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.run.printers import export_printer
from googlecloudsdk.command_lib.run.printers import job_printer
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
from googlecloudsdk.core.resource import resource_printer
class Describe(base.DescribeCommand):
"""Obtain details about executions."""
detailed_help = {
'DESCRIPTION':
"""
{description}
""",
'EXAMPLES':
"""
To describe an execution:
$ {command} my-execution
""",
}
@staticmethod
def CommonArgs(parser):
execution_presentation = presentation_specs.ResourcePresentationSpec(
'EXECUTION',
resource_args.GetExecutionResourceSpec(),
'Execution to describe.',
required=True,
prefixes=False)
concept_parsers.ConceptParser([execution_presentation]).AddToParser(parser)
resource_printer.RegisterFormatter(
job_printer.EXECUTION_PRINTER_FORMAT,
job_printer.ExecutionPrinter,
)
parser.display_info.AddFormat(job_printer.EXECUTION_PRINTER_FORMAT)
resource_printer.RegisterFormatter(
export_printer.EXPORT_PRINTER_FORMAT,
export_printer.ExportPrinter,
)
@staticmethod
def Args(parser):
Describe.CommonArgs(parser)
def Run(self, args):
"""Show details about a job execution."""
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack(), version_override='v1')
execution_ref = args.CONCEPTS.execution.Parse()
with serverless_operations.Connect(conn_context) as client:
execution = client.GetExecution(execution_ref)
if not execution:
raise exceptions.ArgumentError('Cannot find execution [{}].'.format(
execution_ref.Name()))
return execution

View File

@@ -0,0 +1,134 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 listing job executions."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.api_lib.run import execution
from googlecloudsdk.command_lib.run import commands
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import pretty_print
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
def _SucceededStatus(ex):
return '{} / {}'.format(
ex.get('status', {}).get('succeededCount', 0),
ex.get('spec', {}).get('taskCount', 0),
)
def _ByStartAndCreationTime(ex):
"""Sort key that sorts executions by start time, newest and unstarted first.
All unstarted executions will be first and sorted by their creation timestamp,
all started executions will be second and sorted by their start time.
Args:
ex: googlecloudsdk.api_lib.run.execution.Execution
Returns:
The lastTransitionTime of the Started condition or the creation timestamp of
the execution if the execution is unstarted.
"""
return (
False
if ex.started_condition and ex.started_condition['status'] is not None
else True,
ex.started_condition['lastTransitionTime']
if ex.started_condition and ex.started_condition['lastTransitionTime']
else ex.creation_timestamp,
)
class List(commands.List):
"""List executions."""
detailed_help = {
'DESCRIPTION':
"""
{description}
""",
'EXAMPLES':
"""
To list all executions in all regions:
$ {command}
""",
}
@classmethod
def CommonArgs(cls, parser):
namespace_presentation = presentation_specs.ResourcePresentationSpec(
'--namespace',
resource_args.GetNamespaceResourceSpec(),
'Namespace to list executions in.',
required=True,
prefixes=False,
hidden=True,
)
flags.AddJobFlag(parser)
concept_parsers.ConceptParser([namespace_presentation]).AddToParser(parser)
parser.display_info.AddFormat(
'table('
'{ready_column},'
'job_name:label=JOB,'
'name:label=EXECUTION,'
'region:label=REGION,'
'status.runningCount.yesno(no="0"):label=RUNNING,'
'succeeded_status():label=COMPLETE,'
'creation_timestamp.date("%Y-%m-%d %H:%M:%S %Z"):label=CREATED,'
'author:label="RUN BY"):({alias})'.format(
ready_column=pretty_print.READY_COLUMN,
alias=commands.SATISFIES_PZS_ALIAS,
)
)
parser.display_info.AddUriFunc(cls._GetResourceUri)
parser.display_info.AddTransforms({
'succeeded_status': _SucceededStatus,
})
@classmethod
def Args(cls, parser):
cls.CommonArgs(parser)
def _SortExecutions(self, executions):
return sorted(
commands.SortByName(executions),
key=_ByStartAndCreationTime,
reverse=True)
def Run(self, args):
"""List executions of a job."""
job_name = args.job
namespace_ref = args.CONCEPTS.namespace.Parse()
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack())
with serverless_operations.Connect(conn_context) as client:
self.SetCompleteApiEndpoint(conn_context.endpoint)
label_selector = None
if job_name:
label_selector = '{label} = {name}'.format(
label=execution.JOB_LABEL, name=job_name
)
return self._SortExecutions(
client.ListExecutions(namespace_ref, label_selector)
)

View File

@@ -0,0 +1,44 @@
# -*- 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.
"""Group definition for logs."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import platforms
from googlecloudsdk.core import properties
@base.UniverseCompatible
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA)
class Logs(base.Group):
"""Read logs for Cloud Run jobs executions."""
detailed_help = {
'EXAMPLES':
"""
To tail logs for a job execution, run:
$ {command} tail my-job-execution
To read logs for a job execution, run:
$ {command} read my-job-execution
""",
}

View File

@@ -0,0 +1,97 @@
# -*- 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.
"""Command to read logs for a job execution."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from googlecloudsdk.api_lib.logging import common
from googlecloudsdk.api_lib.logging.formatter import FormatLog
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.logs import read as read_logs_lib
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.core import log
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA)
class Read(base.Command):
"""Read logs for Cloud Run job executions."""
detailed_help = {
'DESCRIPTION': """\
{command} reads log entries. Log entries matching *--log-filter* are
returned according to the specified --order.
If the log entries come from multiple logs, then entries from
different logs might be intermingled in the results.
""",
'EXAMPLES': """\
To read log entries from for a Cloud Run job execution, run:
$ {command} my-job-execution
To read log entries with severity ERROR or higher, run:
$ {command} my-job-execution --log-filter="severity>=ERROR"
To read log entries written in a specific time window, run:
$ {command} my-job-execution --log-filter='timestamp<="2015-05-31T23:59:59Z" AND timestamp>="2015-05-31T00:00:00Z"'
To read up to 10 log entries in your job payloads that include the
word `SearchText` and format the output in `JSON` format, run:
$ {command} my-job-execution --log-filter="textPayload:SearchText" --limit=10 --format=json
Detailed information about filters can be found at:
[](https://cloud.google.com/logging/docs/view/advanced_filters)
""",
}
@staticmethod
def Args(parser):
parser.add_argument('execution', help='Name for a Cloud Run job execution.')
read_logs_lib.LogFilterArgs(parser)
read_logs_lib.LoggingReadArgs(parser)
def Run(self, args):
filters = [args.log_filter] if args.IsSpecified('log_filter') else []
filters.append('resource.type = %s \n' % 'cloud_run_job')
filters.append(
'labels."run.googleapis.com/execution_name" = %s \n'
% args.execution
)
filters.append(
'resource.labels.location = %s \n' % flags.GetRegion(args, prompt=True)
)
filters.append('severity >= DEFAULT \n')
filters += read_logs_lib.MakeTimestampFilters(args)
lines = []
logs = common.FetchLogs(
read_logs_lib.JoinFilters(filters),
order_by=args.order,
limit=args.limit,
)
for log_line in logs:
output_log = FormatLog(log_line)
if output_log:
lines.append(output_log)
for line in reversed(lines):
log.out.Print(line)

View File

@@ -0,0 +1,75 @@
# -*- 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.
"""Command to tail logs for a job execution."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.logs import read as read_logs_lib
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import streaming
from googlecloudsdk.core import properties
@base.ReleaseTracks(base.ReleaseTrack.ALPHA, base.ReleaseTrack.BETA)
class Tail(base.BinaryBackedCommand):
"""Tail logs for Cloud Run job executions."""
detailed_help = {
'DESCRIPTION': """\
{command} tails log-entries for a particular
Cloud Run job exeuction in real time. The log entries are formatted for
consumption in a terminal.
""",
'EXAMPLES': """\
To tail log entries for a Cloud Run job exeuction, run:
$ {command} my-job-execution
To tail log entries with severity ERROR or higher, run:
$ {command} my-job-execution --log-filter="severity>=ERROR"
Detailed information about filters can be found at:
[](https://cloud.google.com/logging/docs/view/advanced_filters)
""",
}
@staticmethod
def Args(parser):
parser.add_argument('execution', help='Name for a Cloud Run job.')
read_logs_lib.LogFilterArgs(parser)
def Run(self, args):
filters = []
if args.IsSpecified('log_filter'):
filters.append(args.log_filter)
filters.append('resource.type=%s' % 'cloud_run_job')
filters.append(
'labels."run.googleapis.com/execution_name"=%s' % args.execution
)
filters.append(
'resource.labels.location=%s' % flags.GetRegion(args, prompt=True)
)
filters.append('severity>=DEFAULT')
project_id = properties.VALUES.core.project.Get(required=True)
filter_str = ' '.join(filters)
command_executor = streaming.LogStreamingWrapper()
response = command_executor(
project_id=project_id, log_format='run', log_filter=filter_str
)
return self._DefaultOperationResponseHandler(response)

View File

@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 gcloud run tasks group."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import platforms
from googlecloudsdk.core import properties
@base.UniverseCompatible
class Tasks(base.Group):
"""View and manage your Cloud Run jobs tasks.
This set of commands can be used to view and manage your Cloud Run jobs
tasks.
"""
detailed_help = {
'EXAMPLES':
"""
To list your existing tasks for an execution, run:
$ {command} list --execution my_execution
""",
}

View File

@@ -0,0 +1,81 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 obtaining details about tasks."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.calliope import base
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import exceptions
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.run.printers import export_printer
from googlecloudsdk.command_lib.run.printers import job_printer
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
from googlecloudsdk.core.resource import resource_printer
class Describe(base.DescribeCommand):
"""Obtain details about tasks."""
detailed_help = {
'DESCRIPTION':
"""
{description}
""",
'EXAMPLES':
"""
To describe a task:
$ {command} my-task
""",
}
@staticmethod
def CommonArgs(parser):
task_presentation = presentation_specs.ResourcePresentationSpec(
'TASK',
resource_args.GetTaskResourceSpec(),
'Task to describe.',
required=True,
prefixes=False)
concept_parsers.ConceptParser([task_presentation]).AddToParser(parser)
resource_printer.RegisterFormatter(
job_printer.TASK_PRINTER_FORMAT,
job_printer.TaskPrinter)
parser.display_info.AddFormat(job_printer.TASK_PRINTER_FORMAT)
@staticmethod
def Args(parser):
Describe.CommonArgs(parser)
def Run(self, args):
"""Show details about a job task."""
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack(), version_override='v1')
task_ref = args.CONCEPTS.task.Parse()
with serverless_operations.Connect(conn_context) as client:
task = client.GetTask(task_ref)
if not task:
raise exceptions.ArgumentError('Cannot find task [{}].'.format(
task_ref.Name()))
return task

View File

@@ -0,0 +1,85 @@
# -*- coding: utf-8 -*- #
# Copyright 2022 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 listing job tasks."""
from __future__ import absolute_import
from __future__ import division
from __future__ import unicode_literals
from googlecloudsdk.command_lib.run import commands
from googlecloudsdk.command_lib.run import connection_context
from googlecloudsdk.command_lib.run import flags
from googlecloudsdk.command_lib.run import pretty_print
from googlecloudsdk.command_lib.run import resource_args
from googlecloudsdk.command_lib.run import serverless_operations
from googlecloudsdk.command_lib.util.concepts import concept_parsers
from googlecloudsdk.command_lib.util.concepts import presentation_specs
class List(commands.List):
"""List tasks."""
detailed_help = {
'DESCRIPTION':
"""
{description}
""",
'EXAMPLES':
"""
To list all tasks for an execution:
$ {command} --execution=my-execution
""",
}
@classmethod
def CommonArgs(cls, parser):
execution_presentation = presentation_specs.ResourcePresentationSpec(
'--execution',
resource_args.GetExecutionResourceSpec(),
'Execution for which to list tasks.',
required=True,
prefixes=False)
concept_parsers.ConceptParser([execution_presentation]).AddToParser(parser)
flags.AddTaskFilterFlags(parser)
parser.display_info.AddFormat(
'table('
'{ready_column},'
'index,'
'running_state:label=STATE,'
'name:label=TASK,'
'start_time.date("%Y-%m-%d %H:%M:%S %Z"):label=STARTED,'
'completion_time.date("%Y-%m-%d %H:%M:%S %Z"):label=COMPLETED,'
'retries):({alias})'.format(
ready_column=pretty_print.READY_COLUMN,
alias=commands.SATISFIES_PZS_ALIAS,
)
)
@classmethod
def Args(cls, parser):
cls.CommonArgs(parser)
def Run(self, args):
"""List tasks of a job execution."""
execution_ref = args.CONCEPTS.execution.Parse()
conn_context = connection_context.GetConnectionContext(
args, flags.Product.RUN, self.ReleaseTrack())
with serverless_operations.Connect(conn_context) as client:
self.SetCompleteApiEndpoint(conn_context.endpoint)
ret = client.ListTasks(execution_ref.Parent(), execution_ref.Name(),
args.filter_flags or None)
return sorted(ret, key=lambda x: x.index)