flytekit.clients.friendly.SynchronousFlyteClient

class flytekit.clients.friendly.SynchronousFlyteClient(cfg, **kwargs)[source]

This is a low-level client that users can use to make direct gRPC service calls to the control plane. See the service spec. This is more user-friendly interface than the raw client so users should try to use this class first. Create a client by

SynchronousFlyteClient("your.domain:port", insecure=True)
# insecure should be True if your flyteadmin deployment doesn't have SSL enabled

Methods

Parameters:

cfg (PlatformConfig)

Parameters:

create_download_link_request (CreateDownloadLinkRequest)

Return type:

CreateDownloadLinkResponse

create_download_location(create_download_location_request)
Parameters:

create_download_location_request (CreateDownloadLocationRequest)

Return type:

CreateDownloadLocationResponse

create_execution(project, domain, name, execution_spec, inputs)[source]

This will create an execution for the given execution spec. :param Text project: :param Text domain: :param Text name: :param flytekit.models.execution.ExecutionSpec execution_spec: This is the specification for the execution. :param flytekit.models.literals.LiteralMap inputs: The inputs for the execution :returns: The unique identifier for the execution. :rtype: flytekit.models.core.identifier.WorkflowExecutionIdentifier

create_launch_plan(launch_plan_identifer, launch_plan_spec)[source]

This will create a launch plan definition in the Admin database. Once successful, the launch plan object can be retrieved via the client or viewed via the UI or command-line interfaces.

Note

Overwrites are not supported so any request for a given project, domain, name, and version that exists in the database must match the existing definition exactly. This also means that as long as the request remains identical, calling this method multiple times will result in success.

Param:

flytekit.models.core.identifier.Identifier launch_plan_identifer: The identifier for this launch plan.

Param:

flytekit.models.launch_plan.LaunchPlanSpec launch_plan_spec: This is the actual definition of the launch plan that should be created.

Raises:
  • flytekit.common.exceptions.user.FlyteEntityAlreadyExistsException – If an identical version of the launch plan is found, this exception is raised. The client might choose to ignore this exception because the identical launch plan is already registered.

  • grpc.RpcError

create_task(task_identifer, task_spec)[source]

This will create a task definition in the Admin database. Once successful, the task object can be retrieved via the client or viewed via the UI or command-line interfaces.

Note

Overwrites are not supported so any request for a given project, domain, name, and version that exists in the database must match the existing definition exactly. Furthermore, as long as the request remains identical, calling this method multiple times will result in success.

Parameters:
  • task_identifer (flytekit.models.core.identifier.Identifier) – The identifier for this task.

  • task_spec (flytekit.models.task.TaskSpec) – This is the actual definition of the task that should be created.

Raises:
  • flytekit.common.exceptions.user.FlyteEntityAlreadyExistsException – If an identical version of the task is found, this exception is raised. The client might choose to ignore this exception because the identical task is already registered.

  • grpc.RpcError

create_upload_location(create_upload_location_request)

Get a signed url to be used during fast registration :param flyteidl.service.dataproxy_pb2.CreateUploadLocationRequest create_upload_location_request: :rtype: flyteidl.service.dataproxy_pb2.CreateUploadLocationResponse

Parameters:

create_upload_location_request (CreateUploadLocationRequest)

Return type:

CreateUploadLocationResponse

create_workflow(workflow_identifier, workflow_spec)[source]

This will create a workflow definition in the Admin database. Once successful, the workflow object can be retrieved via the client or viewed via the UI or command-line interfaces.

Note

Overwrites are not supported so any request for a given project, domain, name, and version that exists in the database must match the existing definition exactly. Furthermore, as long as the request remains identical, calling this method multiple times will result in success.

Param:

flytekit.models.core.identifier.Identifier workflow_identifier: The identifier for this workflow.

Param:

flytekit.models.admin.workflow.WorkflowSpec workflow_spec: This is the actual definition of the workflow that should be created.

Raises:
  • flytekit.common.exceptions.user.FlyteEntityAlreadyExistsException – If an identical version of the workflow is found, this exception is raised. The client might choose to ignore this exception because the identical workflow is already registered.

  • grpc.RpcError

get_active_launch_plan(identifier)[source]

Retrieves the active launch plan entity given a named entity identifier (project, domain, name). Raises an error if no active launch plan exists.

Parameters:

identifier (flytekit.models.common.NamedEntityIdentifier) – NamedEntityIdentifier to list.

Return type:

flytekit.models.launch_plan.LaunchPlan

get_data(flyte_uri)[source]
Parameters:

flyte_uri (str)

Return type:

GetDataResponse

get_download_signed_url(native_url, expires_in=None)[source]
Parameters:
Return type:

CreateDownloadLocationResponse

get_execution(id)[source]
Parameters:

id (flytekit.models.core.identifier.WorkflowExecutionIdentifier)

Return type:

flytekit.models.execution.Execution

get_execution_data(id)[source]

Returns signed URLs to LiteralMap blobs for an execution’s inputs and outputs (when available).

Parameters:

id (flytekit.models.core.identifier.WorkflowExecutionIdentifier)

Return type:

flytekit.models.execution.WorkflowExecutionGetDataResponse

get_execution_metrics(get_execution_metrics_request)

Returns metrics partitioning and categorizing the workflow execution time-series.

Parameters:

get_execution_metrics_request (flyteidl.admin.execution_pb2.WorkflowExecutionGetMetricsRequest)

Return type:

flyteidl.admin.execution_pb2.WorkflowExecutionGetMetricsResponse

get_launch_plan(id)[source]

Retrieves a launch plan entity.

Parameters:

id (flytekit.models.core.identifier.Identifier) – unique identifier for launch plan to retrieve

Return type:

flytekit.models.launch_plan.LaunchPlan

get_node_execution(node_execution_identifier)[source]
Parameters:

node_execution_identifier (flytekit.models.core.identifier.NodeExecutionIdentifier)

Return type:

flytekit.models.node_execution.NodeExecution

get_node_execution_data(node_execution_identifier)[source]

Returns signed URLs to LiteralMap blobs for a node execution’s inputs and outputs (when available).

Parameters:

node_execution_identifier (flytekit.models.core.identifier.NodeExecutionIdentifier)

Return type:

NodeExecutionGetDataResponse

get_project_domain_attributes(project, domain, resource_type)[source]

Fetches the custom attributes set for a project and domain combination. :param Text project: :param Text domain: :param flytekit.models.MatchableResource resource_type: :return:

get_task(id)[source]

This returns a single task for a given identifier.

Parameters:

id (flytekit.models.core.identifier.Identifier) – The ID representing a given task.

Raises:

TODO

Return type:

flytekit.models.task.Task

get_task_execution(id)[source]
Parameters:

id (flytekit.models.core.identifier.TaskExecutionIdentifier)

Return type:

flytekit.models.admin.task_execution.TaskExecution

get_task_execution_data(task_execution_identifier)[source]

Returns signed URLs to LiteralMap blobs for a node execution’s inputs and outputs (when available).

Parameters:

task_execution_identifier (flytekit.models.core.identifier.TaskExecutionIdentifier)

Return type:

flytekit.models.execution.NodeExecutionGetDataResponse

get_upload_signed_url(project, domain, content_md5=None, filename=None, expires_in=None, filename_root=None, add_content_md5_metadata=True)[source]

Get a signed url to be used during fast registration

Parameters:
  • project (str) – Project to create the upload location for

  • domain (str) – Domain to create the upload location for

  • content_md5 (bytes | None) – ContentMD5 restricts the upload location to the specific MD5 provided. The content_md5 will also appear in the generated path.

  • filename (str | None) – If provided this specifies a desired suffix for the generated location

  • expires_in (timedelta | None) – If provided this defines a requested expiration duration for the generated url

  • filename_root (str | None) – If provided will be used as the root of the filename. If not, Admin will use a hash This option is useful when uploading a series of files that you want to be grouped together.

  • add_content_md5_metadata (bool) – If true, the content md5 will be added to the metadata in signed URL

Return type:

flyteidl.service.dataproxy_pb2.CreateUploadLocationResponse

get_workflow(id)[source]

This returns a single workflow for a given ID.

Parameters:

id (flytekit.models.core.identifier.Identifier) – The ID representing a given task.

Raises:

TODO

Return type:

flytekit.models.admin.workflow.Workflow

get_workflow_attributes(project, domain, workflow, resource_type)[source]

Fetches the custom attributes set for a project, domain, and workflow combination. :param Text project: :param Text domain: :param Text workflow: :param flytekit.models.MatchableResource resource_type: :return:

list_active_launch_plans_paginated(project, domain, limit=100, token=None, sort_by=None)[source]

This returns a page of currently active launch plan meta-information for launch plans in a given project and domain.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • project (Text)

  • domain (Text)

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (int) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.launch_plan.LaunchPlan], str

list_executions_paginated(project, domain, limit=100, token=None, filters=None, sort_by=None)[source]

This returns a page of executions in a given project and domain.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • project (Text) – Project in which to list executions.

  • domain (Text) – Project in which to list executions.

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (Text) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • filters (list[flytekit.models.filters.Filter]) – [Optional] If specified, the filters will be applied to the query. If the filter is not supported, an exception will be raised.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

(list[flytekit.models.execution.Execution], Text)

list_launch_plan_ids_paginated(project, domain, limit=100, token=None, sort_by=None)[source]

This returns a page of identifiers for the launch plans for a given project and domain. Filters can also be specified.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Param:

Text project: The namespace of the project to list.

Param:

Text domain: The domain space of the project to list.

Param:

int limit: [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

Param:

int token: [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

Parameters:

sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.common.NamedEntityIdentifier], Text

list_launch_plans_paginated(identifier, limit=100, token=None, filters=None, sort_by=None)[source]

This returns a page of launch plan meta-information for launch plans in a given project and domain. Optionally, specifying a name will limit the results to only workflows with that name in the given project and domain.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • identifier (flytekit.models.common.NamedEntityIdentifier) – NamedEntityIdentifier to list.

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (int) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • filters (list[flytekit.models.filters.Filter]) – [Optional] If specified, the filters will be applied to the query. If the filter is not supported, an exception will be raised.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.launch_plan.LaunchPlan], str

list_matchable_attributes(resource_type)[source]

Fetches all custom attributes for a resource type. :param flytekit.models.MatchableResource resource_type: :return:

list_node_executions(workflow_execution_identifier, limit=100, token=None, filters=None, sort_by=None, unique_parent_id=None)[source]

Get node executions associated with a given workflow execution.

Parameters:
  • workflow_execution_identifier (flytekit.models.core.identifier.WorkflowExecutionIdentifier)

  • limit (int) – Limit the number of items returned in the response.

  • token (str | None) – If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token="foo".

  • filters (list[flytekit.models.filters.Filter])

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

  • unique_parent_id (str | None) – If specified, returns the node executions for the unique_parent_id node id.

Return type:

list[flytekit.models.node_execution.NodeExecution], Text

list_node_executions_for_task_paginated(task_execution_identifier, limit=100, token=None, filters=None, sort_by=None)[source]

This returns nodes spawned by a specific task execution. This is generally from things like dynamic tasks. :param flytekit.models.core.identifier.TaskExecutionIdentifier task_execution_identifier: :param int limit: Number to return per page :param Text token: [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. :param list[flytekit.models.filters.Filter] filters: :param flytekit.models.admin.common.Sort sort_by: [Optional] If provided, the results will be sorted. :rtype: list[flytekit.models.node_execution.NodeExecution], Text

list_node_executions_paginated(node_execution_list_request)
Parameters:

node_execution_list_request (flyteidl.admin.node_execution_pb2.NodeExecutionListRequest)

Return type:

flyteidl.admin.node_execution_pb2.NodeExecutionList

list_projects(project_list_request=None)

This will return a list of the projects registered with the Flyte Admin Service :param flyteidl.admin.project_pb2.ProjectListRequest project_list_request: :rtype: flyteidl.admin.project_pb2.Projects

Parameters:

project_list_request (ProjectListRequest | None)

list_projects_paginated(limit=100, token=None, filters=None, sort_by=None)[source]

This returns a page of projects.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (Text) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • filters (list[flytekit.models.filters.Filter]) – [Optional] If specified, the filters will be applied to the query. If the filter is not supported, an exception will be raised.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

grpc.RpcError

Return type:

(list[flytekit.models.Project], Text)

list_signals(signal_list_request)

This lists signals

Parameters:

signal_list_request (SignalListRequest)

Return type:

SignalList

list_task_executions_paginated(node_execution_identifier, limit=100, token=None, filters=None, sort_by=None)[source]
Parameters:
  • node_execution_identifier (flytekit.models.core.identifier.NodeExecutionIdentifier)

  • limit (int)

  • token (Text) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”.

  • filters (list[flytekit.models.filters.Filter])

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Return type:

(list[flytekit.models.admin.task_execution.TaskExecution], Text)

list_task_ids_paginated(project, domain, limit=100, token=None, sort_by=None)[source]

This returns a page of identifiers for the tasks for a given project and domain. Filters can also be specified.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • project (Text) – The namespace of the project to list.

  • domain (Text) – The domain space of the project to list.

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (Text) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.common.NamedEntityIdentifier], Text

list_tasks_paginated(identifier, limit=100, token=None, filters=None, sort_by=None)[source]

This returns a page of task metadata for tasks in a given project and domain. Optionally, specifying a name will limit the results to only tasks with that name in the given project and domain.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • identifier (flytekit.models.common.NamedEntityIdentifier) – NamedEntityIdentifier to list.

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (int) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • filters (list[flytekit.models.filters.Filter]) – [Optional] If specified, the filters will be applied to the query. If the filter is not supported, an exception will be raised.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.task.Task], Text

list_workflow_ids_paginated(project, domain, limit=100, token=None, sort_by=None)[source]

This returns a page of identifiers for the workflows for a given project and domain. Filters can also be specified.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Param:

Text project: The namespace of the project to list.

Param:

Text domain: The domain space of the project to list.

Param:

int limit: [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

Param:

int token: [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

Parameters:

sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.common.NamedEntityIdentifier], Text

list_workflows_paginated(identifier, limit=100, token=None, filters=None, sort_by=None)[source]

This returns a page of workflow meta-information for workflows in a given project and domain. Optionally, specifying a name will limit the results to only workflows with that name in the given project and domain.

Note

This is a paginated API. Use the token field in the request to specify a page offset token. The user of the API is responsible for providing this token.

Note

If entries are added to the database between requests for different pages, it is possible to receive entries on the second page that also appeared on the first.

Parameters:
  • identifier (flytekit.models.common.NamedEntityIdentifier) – NamedEntityIdentifier to list.

  • limit (int) – [Optional] The maximum number of entries to return. Must be greater than 0. The maximum page size is determined by the Flyte Admin Service configuration. If limit is greater than the maximum page size, an exception will be raised.

  • token (int) – [Optional] If specified, this specifies where in the rows of results to skip before reading. If you previously retrieved a page response with token=”foo” and you want the next page, specify token=”foo”. Please see the notes for this function about the caveats of the paginated API.

  • filters (list[flytekit.models.filters.Filter]) – [Optional] If specified, the filters will be applied to the query. If the filter is not supported, an exception will be raised.

  • sort_by (flytekit.models.admin.common.Sort) – [Optional] If provided, the results will be sorted.

Raises:

TODO

Return type:

list[flytekit.models.admin.workflow.Workflow], Text

recover_execution(id, name=None)[source]

Recreates a previously-run workflow execution that will only start executing from the last known failure point. :param flytekit.models.core.identifier.WorkflowExecutionIdentifier id: :param name str: Optional name to assign to the newly created execution. :rtype: flytekit.models.core.identifier.WorkflowExecutionIdentifier

Parameters:

name (str | None)

register_project(project)[source]

Registers a project. :param flytekit.models.project.Project project: :rtype: flyteidl.admin.project_pb2.ProjectRegisterResponse

relaunch_execution(id, name=None)[source]
Parameters:
  • id (flytekit.models.core.identifier.WorkflowExecutionIdentifier)

  • name (Text) – [Optional] name for the new execution. If not specified, a randomly generated name will be used

Returns:

The unique identifier for the new execution.

Return type:

flytekit.models.core.identifier.WorkflowExecutionIdentifier

set_signal(signal_set_request)

This sets a signal

Parameters:

signal_set_request (SignalSetRequest)

Return type:

SignalSetResponse

terminate_execution(id, cause)[source]
Parameters:
  • id (flytekit.models.core.identifier.WorkflowExecutionIdentifier)

  • cause (Text)

update_launch_plan(id, state)[source]

Updates a launch plan. Currently, this can only be used to update a given launch plan’s state (ACTIVE v. INACTIVE) for schedules. If a launch plan with a given project, domain, and name is set to ACTIVE, then any other launch plan with the same project, domain, and name that was set to ACTIVE will be switched to INACTIVE in one transaction.

Parameters:
  • id (flytekit.models.core.identifier.Identifier) – identifier for launch plan to update

  • state (int) – Enum value from flytekit.models.launch_plan.LaunchPlanState

update_named_entity(resource_type, id, metadata)[source]

Updates the metadata associated with a named entity. A named entity is designated a resource, e.g. a workflow, task or launch plan specified by {project, domain, name} across all versions of the resource.

Parameters:
  • resource_type (int) – Enum value from flytekit.models.identifier.ResourceType

  • id (flytekit.models.admin.named_entity.NamedEntityIdentifier) – identifier for named entity to update

  • metadata (flytekit.models.admin.named_entity.NamedEntityIdentifierMetadata)

update_project(project)[source]

Update an existing project specified by id. :param flytekit.models.project.Project project: :rtype: flyteidl.admin.project_pb2.ProjectUpdateResponse

update_project_domain_attributes(project, domain, matching_attributes)[source]

Sets custom attributes for a project and domain combination. :param Text project: :param Text domain: :param flytekit.models.MatchingAttributes matching_attributes: :return:

update_workflow_attributes(project, domain, workflow, matching_attributes)[source]

Sets custom attributes for a project, domain, and workflow combination. :param Text project: :param Text domain: :param Text workflow: :param flytekit.models.MatchingAttributes matching_attributes: :return:

classmethod with_root_certificate(cfg, root_cert_file)
Parameters:
Return type:

RawSynchronousFlyteClient

Attributes

raw

Gives access to the raw client :rtype: flytekit.clients.raw.RawSynchronousFlyteClient

url