Skip to content

Commit

Permalink
docs: add samples from python-docs-samples/tasks (#36)
Browse files Browse the repository at this point in the history
* Add samples for Cloud Tasks [(#1068)](#1068)

* Add samples for Cloud Tasks

* Respond to tasks sample review

* Update app engine queues samples

* Address review feedback

* Address review issues and convert pull queue sample to not use API key auth

* Reform pull queues to match appengine queues changes to auth, command line input, readme

* flake8 and fix comment

* Fix Tasks sample test issues.

* Remove queue.yaml, now unused

* Add required flag on certain arguments to command-line tools

* Auto-update dependencies. [(#1116)](#1116)

* Auto-update dependencies. [(#1133)](#1133)

* Auto-update dependencies.

* Fix missing http library

Change-Id: I99faa600f2f3f1f50f57694fc9835d7f35bda250

* Update Task Queue samples for beta

* Use full import to get client

* Auto-update dependencies. [(#1186)](#1186)

* Auto-update dependencies. [(#1217)](#1217)

* Added "Open in Cloud Shell" buttons to README files [(#1254)](#1254)

* Add comments and region tags to Cloud Tasks samples [(#1271)](#1271)

* Standardize on CamelCase, reword confusing endpoint name [(#1288)](#1288)

* Auto-update dependencies. [(#1309)](#1309)

* Rename pull to lease and fix name/parent confusion [(#1311)](#1311)

* Updated region tags for pull queue samples [(#1329)](#1329)

* Auto-update dependencies. [(#1320)](#1320)

* Auto-update dependencies. [(#1355)](#1355)

* Auto-update dependencies. [(#1359)](#1359)

* Auto-update dependencies.

* Update Cloud Tasks Samples [(#1529)](#1529)

* passing create task

* Passing tests

* updates to region tags

* update region tags [(#1532)](#1532)

* update Tasks Sample for App Engine [(#1541)](#1541)

* update gcloud command for creating queues

* deploys and runs

* update license

* passing tests

* Fix run command [(#1563)](#1563)

* Updated library for TTS GA [(#1552)](#1552)

* update gcloud command for Cloud Tasks [(#1566)](#1566)

* update gcloud command

* update pull queue command

* update pull queue command

* Update Cloud Tasks Push Queue Sample [(#1698)](#1698)

* deleted pull queues

* updated samples

* fix dependency versions

* [Cloud Tasks] Move samples to new folder [(#2114)](#2114)

* Move samples to keep consistent with other langauges

* Ad system tests as well

* [Cloud Tasks] Add task with authentication sample [(#2113)](#2113)

* Add task with authentication sample

* Fix linting

* Fix linting

* Fix spacing

* Update tests with service account

* Move samples and update READMEs

* Update version and linting

* Update task sample comments [(#2156)](#2156)

* Update task comments

* Update readme

* Update queue name

* update gcloud [(#2208)](#2208)

* Add protobuf dep and install instructions [(#2250)](#2250)

* Add Migration Guide Snippets for Cloud Tasks [(#2316)](#2316)

* Migration guide

* remove app and update migraitonn

* snippets for migration guide - tests added

* lint

* remove print statements

* Styling changes

* Travis trigger

* Update create_http_task.py [(#2187)](#2187)

Updates `create_http_task.py` to have missing `in_seconds` variable

* Adds updates for samples profiler ... vision [(#2439)](#2439)

* Update Cloud Tasks library version [(#2516)](#2516)

* Update to new library

* update library version

* Adds Task name while creating Task [(#2543)](#2543)

* Task Name in Creating HTTP Task with Token [(#2700)](#2700)

* chore(deps): update dependency google-cloud-tasks to v1.5.0 [(#3168)](#3168)

* chore(deps): update dependency googleapis-common-protos to v1.51.0 [(#3171)](#3171)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [googleapis-common-protos](https://togithub.com/googleapis/googleapis) | minor | `==1.6.0` -> `==1.51.0` |

---

### Renovate configuration

:date: **Schedule**: At any time (no schedule defined).

:vertical_traffic_light: **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

:recycle: **Rebasing**: Never, or you tick the rebase/retry checkbox.

:no_bell: **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#GoogleCloudPlatform/python-docs-samples).

* Simplify noxfile setup. [(#2806)](#2806)

* chore(deps): update dependency requests to v2.23.0

* Simplify noxfile and add version control.

* Configure appengine/standard to only test Python 2.7.

* Update Kokokro configs to match noxfile.

* Add requirements-test to each folder.

* Remove Py2 versions from everything execept appengine/standard.

* Remove conftest.py.

* Remove appengine/standard/conftest.py

* Remove 'no-sucess-flaky-report' from pytest.ini.

* Add GAE SDK back to appengine/standard tests.

* Fix typo.

* Roll pytest to python 2 version.

* Add a bunch of testing requirements.

* Remove typo.

* Add appengine lib directory back in.

* Add some additional requirements.

* Fix issue with flake8 args.

* Even more requirements.

* Readd appengine conftest.py.

* Add a few more requirements.

* Even more Appengine requirements.

* Add webtest for appengine/standard/mailgun.

* Add some additional requirements.

* Add workaround for issue with mailjet-rest.

* Add responses for appengine/standard/mailjet.

Co-authored-by: Renovate Bot <bot@renovateapp.com>

* Remove dependency googleapis-common-protos [(#3955)](#3955)

* Update dependency googleapis-common-protos to v1.52.0

* Update requirements.txt

* Update requirements.txt

* Update requirements.txt

Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com>

* Replace GCLOUD_PROJECT with GOOGLE_CLOUD_PROJECT. [(#4022)](#4022)

* [tasks] testing: use fixtures for the queue [(#4049)](#4049)

fixes #4045
fixes #4044

I don't know why these tests started to fail, but anyways we'd better
use fixtures and temporary queues.

* add python snippets and tests for creating, listing, and deleting queues [(#4012)](#4012)

* add python snippets and tests for creating, listing, and deleting queues

* fix grammar

* update licenses

* apply suggested fixes and format with black

* refine delete_queue_test with fixture for setup

* utilize fixtures and match format of create_http_task_test

* utilize fixtures in list_queues_test and create_queue_test

* make create_queue_test call the right function

* still attempt to delete queue after test runs in case of failure

* attempt to delete queue in case of failure, using try/except approach

* add print when NotFound is caught

* fix import

Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: Takashi Matsuo <tmatsuo@google.com>

* docs(tasks): service_account_email parameter example [(#4183)](#4183)

* docs(tasks): serviceAccountEmail parameter example

* docs(tasks): parameter name camel => snake case

* docs(tasks): comment order = function param order

* chore(deps): update dependency pytest to v5.4.3 [(#4279)](#4279)

* chore(deps): update dependency pytest to v5.4.3

* specify pytest for python 2 in appengine

Co-authored-by: Leah Cole <coleleah@google.com>

* Update dependency pytest to v6 [(#4390)](#4390)

* tasks: added json content-type request [(#4473)](#4473)

- added json payload compatibility
- fix imports and code block used on https://cloud.google.com/tasks/docs/creating-http-target-tasks#python

## Description

Fixes #<ISSUE-NUMBER>

Note: It's a good idea to open an issue first for discussion.

## Checklist
- [ ] I have followed [Sample Guidelines from AUTHORING_GUIDE.MD](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/AUTHORING_GUIDE.md)
- [ ] README is updated to include [all relevant information](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/AUTHORING_GUIDE.md#readme-file)
- [ ] **Tests** pass:   `nox -s py-3.6` (see [Test Environment Setup](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/AUTHORING_GUIDE.md#test-environment-setup))
- [ ] **Lint** pass:   `nox -s lint` (see [Test Environment Setup](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/AUTHORING_GUIDE.md#test-environment-setup))
- [ ] These samples need a new **API enabled** in testing projects to pass (let us know which ones)
- [ ] These samples need a new/updated **env vars** in testing projects set to pass (let us know which ones)
- [ ] Please **merge** this PR for me once it is approved.
- [ ] This sample adds a new sample directory, and I updated the [CODEOWNERS file](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/.github/CODEOWNERS) with the codeowners for this sample

* docs: add samples from python-docs-samples/tasks

* chore: update templates

Co-authored-by: Andrew Gorcester <andrew.gorcester@gmail.com>
Co-authored-by: Andrew Gorcester <gorcester@google.com>
Co-authored-by: DPE bot <dpebot@google.com>
Co-authored-by: michaelawyu <chenyumic@google.com>
Co-authored-by: ellenevans <35748459+ellenevans@users.noreply.github.com>
Co-authored-by: Averi Kitsch <akitsch@google.com>
Co-authored-by: michaelawyu <michael.a.w.yu@hotmail.com>
Co-authored-by: Noah Negrey <nnegrey@users.noreply.github.com>
Co-authored-by: Alex Voorhees <alex@cloudbakers.com>
Co-authored-by: Gus Class <gguuss@gmail.com>
Co-authored-by: Sarath Kaul <kaul.sarath@gmail.com>
Co-authored-by: Sarath Kaul <sarath.kaul@searce.com>
Co-authored-by: WhiteSource Renovate <bot@renovateapp.com>
Co-authored-by: Kurtis Van Gent <31518063+kurtisvg@users.noreply.github.com>
Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com>
Co-authored-by: Takashi Matsuo <tmatsuo@google.com>
Co-authored-by: Aaron Johnson <aaronmjohnson29@gmail.com>
Co-authored-by: Adam Ross <adamross@google.com>
Co-authored-by: Leah Cole <coleleah@google.com>
Co-authored-by: Joab Leite S. Neto <leitejoab@gmail.com>
  • Loading branch information
21 people committed Aug 31, 2020
0 parents commit d5407e2
Show file tree
Hide file tree
Showing 14 changed files with 890 additions and 0 deletions.
87 changes: 87 additions & 0 deletions cloud_tasks/snippets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Google Cloud Tasks Samples

[![Open in Cloud Shell][shell_img]][shell_link]

[shell_img]: http://gstatic.com/cloudssh/images/open-btn.png
[shell_link]: https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/GoogleCloudPlatform/python-docs-samples&page=editor&open_in_editor=tasks/README.md

This sample demonstrates how to use the
[Cloud Tasks](https://cloud.google.com/tasks/docs/) client library.

`create_http_task.py` is a simple command-line program to create
tasks to be pushed to an URL endpoint.

`create_http_task_with_token.py` is a simple command-line program to create
tasks to be pushed to an URL endpoint with authorization header.

## Prerequisites to run locally:

Please refer to [Setting Up a Python Development Environment](https://cloud.google.com/python/setup).

## Authentication

To set up authentication, please refer to our
[authentication getting started guide](https://cloud.google.com/docs/authentication/getting-started).

## Install Dependencies

To install the dependencies for this sample, use the following command:

```
pip install -r requirements.txt
```

This sample uses the common protos in the [googleapis](https://github.com/googleapis/googleapis)
repository. For more info, see
[Protocol Buffer Basics](https://developers.google.com/protocol-buffers/docs/pythontutorial).

## Creating a queue

To create a queue (named `my-queue`) using the Cloud SDK, use the following
gcloud command:

```
gcloud tasks queues create my-queue
```

## Run the Sample Using the Command Line

Set environment variables:

First, your project ID:

```
export PROJECT_ID=my-project-id
```

Then the queue ID, as specified at queue creation time. Queue IDs already
created can be listed with `gcloud tasks queues list`.

```
export QUEUE_ID=my-queue
```

And finally the location ID, which can be discovered with
`gcloud tasks queues describe my-queue`, with the location embedded in
the "name" value (for instance, if the name is
"projects/my-project/locations/us-central1/queues/my-queue", then the
location is "us-central1").

```
export LOCATION_ID=us-central1
```

### Creating Tasks with HTTP Targets

Set an environment variable for the endpoint to your task handler. This is an
example url:
```
export URL=https://example.com/task_handler
```

Running the sample will create a task and send the task to the specific URL
endpoint, with a payload specified:

```
python create_http_task.py --project=$PROJECT_ID --queue=$QUEUE_ID --location=$LOCATION_ID --url=$URL --payload=hello
```
138 changes: 138 additions & 0 deletions cloud_tasks/snippets/create_http_task.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# Copyright 2019 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.

from __future__ import print_function

import argparse


def create_http_task(project,
queue,
location,
url,
payload=None,
in_seconds=None,
task_name=None):
# [START cloud_tasks_create_http_task]
"""Create a task for a given queue with an arbitrary payload."""

from google.cloud import tasks_v2
from google.protobuf import timestamp_pb2
import datetime
import json

# Create a client.
client = tasks_v2.CloudTasksClient()

# TODO(developer): Uncomment these lines and replace with your values.
# project = 'my-project-id'
# queue = 'my-queue'
# location = 'us-central1'
# url = 'https://example.com/task_handler'
# payload = 'hello' or {'param': 'value'} for application/json

# Construct the fully qualified queue name.
parent = client.queue_path(project, location, queue)

# Construct the request body.
task = {
'http_request': { # Specify the type of request.
'http_method': 'POST',
'url': url # The full url path that the task will be sent to.
}
}
if payload is not None:
if isinstance(payload, dict):
# Convert dict to JSON string
payload = json.dumps(payload)
# specify http content-type to application/json
task['http_request']['headers'] = {'Content-type': 'application/json'}

# The API expects a payload of type bytes.
converted_payload = payload.encode()

# Add the payload to the request.
task['http_request']['body'] = converted_payload

if in_seconds is not None:
# Convert "seconds from now" into an rfc3339 datetime string.
d = datetime.datetime.utcnow() + datetime.timedelta(seconds=in_seconds)

# Create Timestamp protobuf.
timestamp = timestamp_pb2.Timestamp()
timestamp.FromDatetime(d)

# Add the timestamp to the tasks.
task['schedule_time'] = timestamp

if task_name is not None:
# Add the name to tasks.
task['name'] = task_name

# Use the client to build and send the task.
response = client.create_task(parent, task)

print('Created task {}'.format(response.name))
# [END cloud_tasks_create_http_task]
return response


if __name__ == '__main__':
parser = argparse.ArgumentParser(
description=create_http_task.__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)

parser.add_argument(
'--project',
help='Project of the queue to add the task to.',
required=True,
)

parser.add_argument(
'--queue',
help='ID (short name) of the queue to add the task to.',
required=True,
)

parser.add_argument(
'--location',
help='Location of the queue to add the task to.',
required=True,
)

parser.add_argument(
'--url',
help='The full url path that the request will be sent to.',
required=True,
)

parser.add_argument(
'--payload',
help='Optional payload to attach to the push queue.'
)

parser.add_argument(
'--in_seconds', type=int,
help='The number of seconds from now to schedule task attempt.'
)

parser.add_argument(
'--task_name',
help='Task name of the task to create'
)
args = parser.parse_args()

create_http_task(
args.project, args.queue, args.location, args.url,
args.payload, args.in_seconds, args.task_name)
48 changes: 48 additions & 0 deletions cloud_tasks/snippets/create_http_task_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Copyright 2019 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.

import os
import uuid

from google.cloud import tasks_v2
import pytest

import create_http_task

TEST_PROJECT_ID = os.getenv('GOOGLE_CLOUD_PROJECT')
TEST_LOCATION = os.getenv('TEST_QUEUE_LOCATION', 'us-central1')
TEST_QUEUE_NAME = f'my-queue-{uuid.uuid4().hex}'


@pytest.fixture()
def test_queue():
client = tasks_v2.CloudTasksClient()
parent = client.location_path(TEST_PROJECT_ID, TEST_LOCATION)
queue = {
# The fully qualified path to the queue
'name': client.queue_path(
TEST_PROJECT_ID, TEST_LOCATION, TEST_QUEUE_NAME),
}
q = client.create_queue(parent, queue)

yield q

client.delete_queue(q.name)


def test_create_http_task(test_queue):
url = 'https://example.com/task_handler'
result = create_http_task.create_http_task(
TEST_PROJECT_ID, TEST_QUEUE_NAME, TEST_LOCATION, url)
assert TEST_QUEUE_NAME in result.name
86 changes: 86 additions & 0 deletions cloud_tasks/snippets/create_http_task_with_token.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# Copyright 2019 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.

from __future__ import print_function

import datetime


def create_http_task(project,
queue,
location,
url,
service_account_email,
payload=None,
in_seconds=None,
task_name=None):
# [START cloud_tasks_create_http_task_with_token]
"""Create a task for a given queue with an arbitrary payload."""

from google.cloud import tasks_v2
from google.protobuf import timestamp_pb2

# Create a client.
client = tasks_v2.CloudTasksClient()

# TODO(developer): Uncomment these lines and replace with your values.
# project = 'my-project-id'
# queue = 'my-queue'
# location = 'us-central1'
# url = 'https://example.com/task_handler'
# service_account_email = 'service-account@my-project-id.iam.gserviceaccount.com';
# payload = 'hello'

# Construct the fully qualified queue name.
parent = client.queue_path(project, location, queue)

# Construct the request body.
task = {
'http_request': { # Specify the type of request.
'http_method': 'POST',
'url': url, # The full url path that the task will be sent to.
'oidc_token': {
'service_account_email': service_account_email
}
}
}

if payload is not None:
# The API expects a payload of type bytes.
converted_payload = payload.encode()

# Add the payload to the request.
task['http_request']['body'] = converted_payload

if in_seconds is not None:
# Convert "seconds from now" into an rfc3339 datetime string.
d = datetime.datetime.utcnow() + datetime.timedelta(seconds=in_seconds)

# Create Timestamp protobuf.
timestamp = timestamp_pb2.Timestamp()
timestamp.FromDatetime(d)

# Add the timestamp to the tasks.
task['schedule_time'] = timestamp

if task_name is not None:
# Add the name to tasks.
task['name'] = task_name

# Use the client to build and send the task.
response = client.create_task(parent, task)

print('Created task {}'.format(response.name))
return response
# [END cloud_tasks_create_http_task_with_token]
Loading

0 comments on commit d5407e2

Please sign in to comment.