From a16733026d1343ac819f982931d87e3ce9d3861d Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Thu, 17 Jun 2021 10:54:11 +0000
Subject: [PATCH 1/8] chore: new owl bot post processor docker image (#3)
Post-Processor: gcr.io/repo-automation-bots/owlbot-python:latest@sha256:58c7342b0bccf85028100adaa3d856cb4a871c22ca9c01960d996e66c40548ce
---
.github/.OwlBot.lock.yaml | 16 +---------------
docs/conf.py | 18 ++++++------------
2 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 8d122f6..ea06d39 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -1,17 +1,3 @@
-# Copyright 2021 Google LLC
-#
-# 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.
-
docker:
image: gcr.io/repo-automation-bots/owlbot-python:latest
- digest: sha256:c66ba3c8d7bc8566f47df841f98cd0097b28fff0b1864c86f5817f4c8c3e8600
+ digest: sha256:58c7342b0bccf85028100adaa3d856cb4a871c22ca9c01960d996e66c40548ce
diff --git a/docs/conf.py b/docs/conf.py
index b7377c8..6be9931 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -80,9 +80,9 @@
master_doc = "index"
# General information about the project.
-project = u"google-cloud-shell"
-copyright = u"2019, Google"
-author = u"Google APIs"
+project = "google-cloud-shell"
+copyright = "2019, Google"
+author = "Google APIs"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -281,7 +281,7 @@
(
master_doc,
"google-cloud-shell.tex",
- u"google-cloud-shell Documentation",
+ "google-cloud-shell Documentation",
author,
"manual",
)
@@ -313,13 +313,7 @@
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- (
- master_doc,
- "google-cloud-shell",
- u"google-cloud-shell Documentation",
- [author],
- 1,
- )
+ (master_doc, "google-cloud-shell", "google-cloud-shell Documentation", [author], 1,)
]
# If true, show URL addresses after external links.
@@ -335,7 +329,7 @@
(
master_doc,
"google-cloud-shell",
- u"google-cloud-shell Documentation",
+ "google-cloud-shell Documentation",
author,
"google-cloud-shell",
"google-cloud-shell Library",
From 0150a5d71e22b6aeb194cd2992d58ed03683d1ca Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Sat, 19 Jun 2021 01:38:30 +0000
Subject: [PATCH 2/8] docs: omit mention of Python 2.7 in 'CONTRIBUTING.rst'
(#1127) (#4)
Closes #1126
Source-Link: https://github.com/googleapis/synthtool/commit/b91f129527853d5b756146a0b5044481fb4e09a8
Post-Processor: gcr.io/repo-automation-bots/owlbot-python:latest@sha256:b6169fc6a5207b11800a7c002d0c5c2bc6d82697185ca12e666f44031468cfcd
---
.github/.OwlBot.lock.yaml | 2 +-
CONTRIBUTING.rst | 7 ++-----
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index ea06d39..cc49c6a 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -1,3 +1,3 @@
docker:
image: gcr.io/repo-automation-bots/owlbot-python:latest
- digest: sha256:58c7342b0bccf85028100adaa3d856cb4a871c22ca9c01960d996e66c40548ce
+ digest: sha256:b6169fc6a5207b11800a7c002d0c5c2bc6d82697185ca12e666f44031468cfcd
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 89acfae..6e29e96 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -69,7 +69,6 @@ We use `nox `__ to instrument our tests.
- To test your changes, run unit tests with ``nox``::
- $ nox -s unit-2.7
$ nox -s unit-3.8
$ ...
@@ -144,7 +143,6 @@ Running System Tests
# Run all system tests
$ nox -s system-3.8
- $ nox -s system-2.7
# Run a single system test
$ nox -s system-3.8 -- -k
@@ -152,9 +150,8 @@ Running System Tests
.. note::
- System tests are only configured to run under Python 2.7 and
- Python 3.8. For expediency, we do not run them in older versions
- of Python 3.
+ System tests are only configured to run under Python 3.8.
+ For expediency, we do not run them in older versions of Python 3.
This alone will not run the tests. You'll need to change some local
auth settings and change some configuration in your project to
From 9c079adce5f46b591ed927755d77362c8e04dc32 Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Sun, 20 Jun 2021 01:06:23 +0000
Subject: [PATCH 3/8] chore: update precommit hook pre-commit/pre-commit-hooks
to v4 (#1083) (#6)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
[](https://renovatebot.com)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [pre-commit/pre-commit-hooks](https://togithub.com/pre-commit/pre-commit-hooks) | repository | major | `v3.4.0` -> `v4.0.1` |
---
### Release Notes
pre-commit/pre-commit-hooks
### [`v4.0.1`](https://togithub.com/pre-commit/pre-commit-hooks/releases/v4.0.1)
[Compare Source](https://togithub.com/pre-commit/pre-commit-hooks/compare/v4.0.0...v4.0.1)
##### Fixes
- `check-shebang-scripts-are-executable` fix entry point.
- [#602](https://togithub.com/pre-commit/pre-commit-hooks/issues/602) issue by [@Person-93](https://togithub.com/Person-93).
- [#603](https://togithub.com/pre-commit/pre-commit-hooks/issues/603) PR by [@scop](https://togithub.com/scop).
### [`v4.0.0`](https://togithub.com/pre-commit/pre-commit-hooks/releases/v4.0.0)
[Compare Source](https://togithub.com/pre-commit/pre-commit-hooks/compare/v3.4.0...v4.0.0)
##### Features
- `check-json`: report duplicate keys.
- [#558](https://togithub.com/pre-commit/pre-commit-hooks/issues/558) PR by [@AdityaKhursale](https://togithub.com/AdityaKhursale).
- [#554](https://togithub.com/pre-commit/pre-commit-hooks/issues/554) issue by [@adamchainz](https://togithub.com/adamchainz).
- `no-commit-to-branch`: add `main` to default blocked branches.
- [#565](https://togithub.com/pre-commit/pre-commit-hooks/issues/565) PR by [@ndevenish](https://togithub.com/ndevenish).
- `check-case-conflict`: check conflicts in directory names as well.
- [#575](https://togithub.com/pre-commit/pre-commit-hooks/issues/575) PR by [@slsyy](https://togithub.com/slsyy).
- [#70](https://togithub.com/pre-commit/pre-commit-hooks/issues/70) issue by [@andyjack](https://togithub.com/andyjack).
- `check-vcs-permalinks`: forbid other branch names.
- [#582](https://togithub.com/pre-commit/pre-commit-hooks/issues/582) PR by [@jack1142](https://togithub.com/jack1142).
- [#581](https://togithub.com/pre-commit/pre-commit-hooks/issues/581) issue by [@jack1142](https://togithub.com/jack1142).
- `check-shebang-scripts-are-executable`: new hook which ensures shebang'd scripts are executable.
- [#545](https://togithub.com/pre-commit/pre-commit-hooks/issues/545) PR by [@scop](https://togithub.com/scop).
##### Fixes
- `check-executables-have-shebangs`: Short circuit shebang lookup on windows.
- [#544](https://togithub.com/pre-commit/pre-commit-hooks/issues/544) PR by [@scop](https://togithub.com/scop).
- `requirements-txt-fixer`: Fix comments which have indentation
- [#549](https://togithub.com/pre-commit/pre-commit-hooks/issues/549) PR by [@greshilov](https://togithub.com/greshilov).
- [#548](https://togithub.com/pre-commit/pre-commit-hooks/issues/548) issue by [@greshilov](https://togithub.com/greshilov).
- `pretty-format-json`: write to stdout using UTF-8 encoding.
- [#571](https://togithub.com/pre-commit/pre-commit-hooks/issues/571) PR by [@jack1142](https://togithub.com/jack1142).
- [#570](https://togithub.com/pre-commit/pre-commit-hooks/issues/570) issue by [@jack1142](https://togithub.com/jack1142).
- Use more inclusive language.
- [#599](https://togithub.com/pre-commit/pre-commit-hooks/issues/599) PR by [@asottile](https://togithub.com/asottile).
##### Breaking changes
- Remove deprecated hooks: `flake8`, `pyflakes`, `autopep8-wrapper`.
- [#597](https://togithub.com/pre-commit/pre-commit-hooks/issues/597) PR by [@asottile](https://togithub.com/asottile).
---
### Configuration
📅 **Schedule**: At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻️ **Rebasing**: Renovate will not automatically rebase this PR, because other commits have been found.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] 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#github/googleapis/synthtool).
Source-Link: https://github.com/googleapis/synthtool/commit/333fd90856f1454380514bc59fc0936cdaf1c202
Post-Processor: gcr.io/repo-automation-bots/owlbot-python:latest@sha256:b8c131c558606d3cea6e18f8e87befbd448c1482319b0db3c5d5388fa6ea72e3
---
.github/.OwlBot.lock.yaml | 2 +-
.pre-commit-config.yaml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index cc49c6a..9602d54 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -1,3 +1,3 @@
docker:
image: gcr.io/repo-automation-bots/owlbot-python:latest
- digest: sha256:b6169fc6a5207b11800a7c002d0c5c2bc6d82697185ca12e666f44031468cfcd
+ digest: sha256:b8c131c558606d3cea6e18f8e87befbd448c1482319b0db3c5d5388fa6ea72e3
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4f00c7c..62eb5a7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -16,7 +16,7 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v3.4.0
+ rev: v4.0.1
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
From 92326754c95b88f6d28e5ca22652f9bc92751ff1 Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Mon, 21 Jun 2021 15:58:43 -0600
Subject: [PATCH 4/8] chore: add kokoro 3.9 config templates (#1128) (#8)
fixes #907
Source-Link: https://github.com/googleapis/synthtool/commit/b0eb8a8b30b46a3c98d23c23107acb748c6601a1
Post-Processor: gcr.io/repo-automation-bots/owlbot-python:latest@sha256:df50e8d462f86d6bcb42f27ecad55bb12c404f1c65de9c6fe4c4d25120080bd6
Co-authored-by: Owl Bot
---
.github/.OwlBot.lock.yaml | 2 +-
.kokoro/samples/python3.9/common.cfg | 40 +++++++++++++++++++++
.kokoro/samples/python3.9/continuous.cfg | 6 ++++
.kokoro/samples/python3.9/periodic-head.cfg | 11 ++++++
.kokoro/samples/python3.9/periodic.cfg | 6 ++++
.kokoro/samples/python3.9/presubmit.cfg | 6 ++++
6 files changed, 70 insertions(+), 1 deletion(-)
create mode 100644 .kokoro/samples/python3.9/common.cfg
create mode 100644 .kokoro/samples/python3.9/continuous.cfg
create mode 100644 .kokoro/samples/python3.9/periodic-head.cfg
create mode 100644 .kokoro/samples/python3.9/periodic.cfg
create mode 100644 .kokoro/samples/python3.9/presubmit.cfg
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 9602d54..0954585 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -1,3 +1,3 @@
docker:
image: gcr.io/repo-automation-bots/owlbot-python:latest
- digest: sha256:b8c131c558606d3cea6e18f8e87befbd448c1482319b0db3c5d5388fa6ea72e3
+ digest: sha256:df50e8d462f86d6bcb42f27ecad55bb12c404f1c65de9c6fe4c4d25120080bd6
diff --git a/.kokoro/samples/python3.9/common.cfg b/.kokoro/samples/python3.9/common.cfg
new file mode 100644
index 0000000..94ce155
--- /dev/null
+++ b/.kokoro/samples/python3.9/common.cfg
@@ -0,0 +1,40 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+# Build logs will be here
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ }
+}
+
+# Specify which tests to run
+env_vars: {
+ key: "RUN_TESTS_SESSION"
+ value: "py-3.9"
+}
+
+# Declare build specific Cloud project.
+env_vars: {
+ key: "BUILD_SPECIFIC_GCLOUD_PROJECT"
+ value: "python-docs-samples-tests-py39"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-shell/.kokoro/test-samples.sh"
+}
+
+# Configure the docker image for kokoro-trampoline.
+env_vars: {
+ key: "TRAMPOLINE_IMAGE"
+ value: "gcr.io/cloud-devrel-kokoro-resources/python-samples-testing-docker"
+}
+
+# Download secrets for samples
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/python-docs-samples"
+
+# Download trampoline resources.
+gfile_resources: "/bigstore/cloud-devrel-kokoro-resources/trampoline"
+
+# Use the trampoline script to run in docker.
+build_file: "python-shell/.kokoro/trampoline.sh"
\ No newline at end of file
diff --git a/.kokoro/samples/python3.9/continuous.cfg b/.kokoro/samples/python3.9/continuous.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.9/continuous.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.9/periodic-head.cfg b/.kokoro/samples/python3.9/periodic-head.cfg
new file mode 100644
index 0000000..f9cfcd3
--- /dev/null
+++ b/.kokoro/samples/python3.9/periodic-head.cfg
@@ -0,0 +1,11 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
+
+env_vars: {
+ key: "TRAMPOLINE_BUILD_FILE"
+ value: "github/python-pubsub/.kokoro/test-samples-against-head.sh"
+}
diff --git a/.kokoro/samples/python3.9/periodic.cfg b/.kokoro/samples/python3.9/periodic.cfg
new file mode 100644
index 0000000..50fec96
--- /dev/null
+++ b/.kokoro/samples/python3.9/periodic.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "False"
+}
\ No newline at end of file
diff --git a/.kokoro/samples/python3.9/presubmit.cfg b/.kokoro/samples/python3.9/presubmit.cfg
new file mode 100644
index 0000000..a1c8d97
--- /dev/null
+++ b/.kokoro/samples/python3.9/presubmit.cfg
@@ -0,0 +1,6 @@
+# Format: //devtools/kokoro/config/proto/build.proto
+
+env_vars: {
+ key: "INSTALL_LIBRARY_FROM_SOURCE"
+ value: "True"
+}
\ No newline at end of file
From 13ce7bab4613f287a73743d80d1bbbee5c59969a Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Wed, 23 Jun 2021 20:30:40 +0000
Subject: [PATCH 5/8] feat: add always_use_jwt_access (#9)
... chore: update gapic-generator-ruby to the latest commit chore: release gapic-generator-typescript 1.5.0
Committer: @miraleung
PiperOrigin-RevId: 380641501
Source-Link: https://github.com/googleapis/googleapis/commit/076f7e9f0b258bdb54338895d7251b202e8f0de3
Source-Link: https://github.com/googleapis/googleapis-gen/commit/27e4c88b4048e5f56508d4e1aa417d60a3380892
---
.../cloud_shell_service/transports/base.py | 40 +++----
.../cloud_shell_service/transports/grpc.py | 7 +-
.../transports/grpc_asyncio.py | 7 +-
setup.py | 2 +-
testing/constraints-3.6.txt | 2 +-
.../shell_v1/test_cloud_shell_service.py | 104 +++---------------
6 files changed, 39 insertions(+), 123 deletions(-)
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
index 881e395..357bdeb 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
@@ -25,6 +25,7 @@
from google.api_core import retry as retries # type: ignore
from google.api_core import operations_v1 # type: ignore
from google.auth import credentials as ga_credentials # type: ignore
+from google.oauth2 import service_account # type: ignore
from google.cloud.shell_v1.types import cloudshell
from google.longrunning import operations_pb2 # type: ignore
@@ -45,8 +46,6 @@
except pkg_resources.DistributionNotFound: # pragma: NO COVER
_GOOGLE_AUTH_VERSION = None
-_API_CORE_VERSION = google.api_core.__version__
-
class CloudShellServiceTransport(abc.ABC):
"""Abstract transport class for CloudShellService."""
@@ -64,6 +63,7 @@ def __init__(
scopes: Optional[Sequence[str]] = None,
quota_project_id: Optional[str] = None,
client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
**kwargs,
) -> None:
"""Instantiate the transport.
@@ -87,6 +87,8 @@ def __init__(
API requests. If ``None``, then default info will be used.
Generally, you only need to set this if you're developing
your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
"""
# Save the hostname. Default to port 443 (HTTPS) if none is specified.
if ":" not in host:
@@ -115,13 +117,20 @@ def __init__(
**scopes_kwargs, quota_project_id=quota_project_id
)
+ # If the credentials is service account credentials, then always try to use self signed JWT.
+ if (
+ always_use_jwt_access
+ and isinstance(credentials, service_account.Credentials)
+ and hasattr(service_account.Credentials, "with_always_use_jwt_access")
+ ):
+ credentials = credentials.with_always_use_jwt_access(True)
+
# Save the credentials.
self._credentials = credentials
- # TODO(busunkim): These two class methods are in the base transport
+ # TODO(busunkim): This method is in the base transport
# to avoid duplicating code across the transport classes. These functions
- # should be deleted once the minimum required versions of google-api-core
- # and google-auth are increased.
+ # should be deleted once the minimum required versions of google-auth is increased.
# TODO: Remove this function once google-auth >= 1.25.0 is required
@classmethod
@@ -142,27 +151,6 @@ def _get_scopes_kwargs(
return scopes_kwargs
- # TODO: Remove this function once google-api-core >= 1.26.0 is required
- @classmethod
- def _get_self_signed_jwt_kwargs(
- cls, host: str, scopes: Optional[Sequence[str]]
- ) -> Dict[str, Union[Optional[Sequence[str]], str]]:
- """Returns kwargs to pass to grpc_helpers.create_channel depending on the google-api-core version"""
-
- self_signed_jwt_kwargs: Dict[str, Union[Optional[Sequence[str]], str]] = {}
-
- if _API_CORE_VERSION and (
- packaging.version.parse(_API_CORE_VERSION)
- >= packaging.version.parse("1.26.0")
- ):
- self_signed_jwt_kwargs["default_scopes"] = cls.AUTH_SCOPES
- self_signed_jwt_kwargs["scopes"] = scopes
- self_signed_jwt_kwargs["default_host"] = cls.DEFAULT_HOST
- else:
- self_signed_jwt_kwargs["scopes"] = scopes or cls.AUTH_SCOPES
-
- return self_signed_jwt_kwargs
-
def _prep_wrapped_messages(self, client_info):
# Precompute the wrapped methods.
self._wrapped_methods = {
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
index 97fae7f..c8b3d6b 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
@@ -159,6 +159,7 @@ def __init__(
scopes=scopes,
quota_project_id=quota_project_id,
client_info=client_info,
+ always_use_jwt_access=True,
)
if not self._grpc_channel:
@@ -214,14 +215,14 @@ def create_channel(
and ``credentials_file`` are passed.
"""
- self_signed_jwt_kwargs = cls._get_self_signed_jwt_kwargs(host, scopes)
-
return grpc_helpers.create_channel(
host,
credentials=credentials,
credentials_file=credentials_file,
quota_project_id=quota_project_id,
- **self_signed_jwt_kwargs,
+ default_scopes=cls.AUTH_SCOPES,
+ scopes=scopes,
+ default_host=cls.DEFAULT_HOST,
**kwargs,
)
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
index 4b08ea8..0d14754 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
@@ -87,14 +87,14 @@ def create_channel(
aio.Channel: A gRPC AsyncIO channel object.
"""
- self_signed_jwt_kwargs = cls._get_self_signed_jwt_kwargs(host, scopes)
-
return grpc_helpers_async.create_channel(
host,
credentials=credentials,
credentials_file=credentials_file,
quota_project_id=quota_project_id,
- **self_signed_jwt_kwargs,
+ default_scopes=cls.AUTH_SCOPES,
+ scopes=scopes,
+ default_host=cls.DEFAULT_HOST,
**kwargs,
)
@@ -205,6 +205,7 @@ def __init__(
scopes=scopes,
quota_project_id=quota_project_id,
client_info=client_info,
+ always_use_jwt_access=True,
)
if not self._grpc_channel:
diff --git a/setup.py b/setup.py
index d34860a..366340c 100644
--- a/setup.py
+++ b/setup.py
@@ -26,7 +26,7 @@
release_status = "Development Status :: 4 - Beta"
url = "https://github.com/googleapis/python-shell"
dependencies = [
- "google-api-core[grpc] >= 1.22.2, < 2.0.0dev",
+ "google-api-core[grpc] >= 1.26.0, <2.0.0dev",
"proto-plus >= 1.15.0",
"packaging >= 14.3",
]
diff --git a/testing/constraints-3.6.txt b/testing/constraints-3.6.txt
index 846a0da..3b213fb 100644
--- a/testing/constraints-3.6.txt
+++ b/testing/constraints-3.6.txt
@@ -5,7 +5,7 @@
#
# e.g., if setup.py has "foo >= 1.14.0, < 2.0.0dev",
# Then this file should have foo==1.14.0
-google-api-core==1.22.2
+google-api-core==1.26.0
proto-plus==1.15.0
packaging==14.3
google-auth==1.24.0 # TODO: remove when google-auth>=1.25.0 is transitively required through google-auth
\ No newline at end of file
diff --git a/tests/unit/gapic/shell_v1/test_cloud_shell_service.py b/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
index c61cd3d..d5c2a2d 100644
--- a/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
+++ b/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
@@ -39,9 +39,6 @@
)
from google.cloud.shell_v1.services.cloud_shell_service import CloudShellServiceClient
from google.cloud.shell_v1.services.cloud_shell_service import transports
-from google.cloud.shell_v1.services.cloud_shell_service.transports.base import (
- _API_CORE_VERSION,
-)
from google.cloud.shell_v1.services.cloud_shell_service.transports.base import (
_GOOGLE_AUTH_VERSION,
)
@@ -52,8 +49,9 @@
import google.auth
-# TODO(busunkim): Once google-api-core >= 1.26.0 is required:
-# - Delete all the api-core and auth "less than" test cases
+# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively
+# through google-api-core:
+# - Delete the auth "less than" test cases
# - Delete these pytest markers (Make the "greater than or equal to" tests the default).
requires_google_auth_lt_1_25_0 = pytest.mark.skipif(
packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"),
@@ -64,16 +62,6 @@
reason="This test requires google-auth >= 1.25.0",
)
-requires_api_core_lt_1_26_0 = pytest.mark.skipif(
- packaging.version.parse(_API_CORE_VERSION) >= packaging.version.parse("1.26.0"),
- reason="This test requires google-api-core < 1.26.0",
-)
-
-requires_api_core_gte_1_26_0 = pytest.mark.skipif(
- packaging.version.parse(_API_CORE_VERSION) < packaging.version.parse("1.26.0"),
- reason="This test requires google-api-core >= 1.26.0",
-)
-
def client_cert_source_callback():
return b"cert bytes", b"key bytes"
@@ -137,6 +125,18 @@ def test_cloud_shell_service_client_from_service_account_info(client_class):
assert client.transport._host == "cloudshell.googleapis.com:443"
+@pytest.mark.parametrize(
+ "client_class", [CloudShellServiceClient, CloudShellServiceAsyncClient,]
+)
+def test_cloud_shell_service_client_service_account_always_use_jwt(client_class):
+ with mock.patch.object(
+ service_account.Credentials, "with_always_use_jwt_access", create=True
+ ) as use_jwt:
+ creds = service_account.Credentials(None, None, None)
+ client = client_class(credentials=creds)
+ use_jwt.assert_called_with(True)
+
+
@pytest.mark.parametrize(
"client_class", [CloudShellServiceClient, CloudShellServiceAsyncClient,]
)
@@ -1522,7 +1522,6 @@ def test_cloud_shell_service_transport_auth_adc_old_google_auth(transport_class)
(transports.CloudShellServiceGrpcAsyncIOTransport, grpc_helpers_async),
],
)
-@requires_api_core_gte_1_26_0
def test_cloud_shell_service_transport_create_channel(transport_class, grpc_helpers):
# If credentials and host are not provided, the transport class should use
# ADC credentials.
@@ -1551,79 +1550,6 @@ def test_cloud_shell_service_transport_create_channel(transport_class, grpc_help
)
-@pytest.mark.parametrize(
- "transport_class,grpc_helpers",
- [
- (transports.CloudShellServiceGrpcTransport, grpc_helpers),
- (transports.CloudShellServiceGrpcAsyncIOTransport, grpc_helpers_async),
- ],
-)
-@requires_api_core_lt_1_26_0
-def test_cloud_shell_service_transport_create_channel_old_api_core(
- transport_class, grpc_helpers
-):
- # If credentials and host are not provided, the transport class should use
- # ADC credentials.
- with mock.patch.object(
- google.auth, "default", autospec=True
- ) as adc, mock.patch.object(
- grpc_helpers, "create_channel", autospec=True
- ) as create_channel:
- creds = ga_credentials.AnonymousCredentials()
- adc.return_value = (creds, None)
- transport_class(quota_project_id="octopus")
-
- create_channel.assert_called_with(
- "cloudshell.googleapis.com:443",
- credentials=creds,
- credentials_file=None,
- quota_project_id="octopus",
- scopes=("https://www.googleapis.com/auth/cloud-platform",),
- ssl_credentials=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
-
-@pytest.mark.parametrize(
- "transport_class,grpc_helpers",
- [
- (transports.CloudShellServiceGrpcTransport, grpc_helpers),
- (transports.CloudShellServiceGrpcAsyncIOTransport, grpc_helpers_async),
- ],
-)
-@requires_api_core_lt_1_26_0
-def test_cloud_shell_service_transport_create_channel_user_scopes(
- transport_class, grpc_helpers
-):
- # If credentials and host are not provided, the transport class should use
- # ADC credentials.
- with mock.patch.object(
- google.auth, "default", autospec=True
- ) as adc, mock.patch.object(
- grpc_helpers, "create_channel", autospec=True
- ) as create_channel:
- creds = ga_credentials.AnonymousCredentials()
- adc.return_value = (creds, None)
-
- transport_class(quota_project_id="octopus", scopes=["1", "2"])
-
- create_channel.assert_called_with(
- "cloudshell.googleapis.com:443",
- credentials=creds,
- credentials_file=None,
- quota_project_id="octopus",
- scopes=["1", "2"],
- ssl_credentials=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
-
@pytest.mark.parametrize(
"transport_class",
[
From 98482f717f5500a611336464496683fb3165034f Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Sat, 26 Jun 2021 16:46:12 +0000
Subject: [PATCH 6/8] chore(python): simplify nox steps in CONTRIBUTING.rst
(#11)
Source-Link: https://github.com/googleapis/synthtool/commit/26558bae8976a985d73c2d98c31d8612273f907d
Post-Processor: gcr.io/repo-automation-bots/owlbot-python:latest@sha256:99d90d097e4a4710cc8658ee0b5b963f4426d0e424819787c3ac1405c9a26719
---
.github/.OwlBot.lock.yaml | 2 +-
CONTRIBUTING.rst | 14 ++++++--------
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml
index 0954585..e2b39f9 100644
--- a/.github/.OwlBot.lock.yaml
+++ b/.github/.OwlBot.lock.yaml
@@ -1,3 +1,3 @@
docker:
image: gcr.io/repo-automation-bots/owlbot-python:latest
- digest: sha256:df50e8d462f86d6bcb42f27ecad55bb12c404f1c65de9c6fe4c4d25120080bd6
+ digest: sha256:99d90d097e4a4710cc8658ee0b5b963f4426d0e424819787c3ac1405c9a26719
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index 6e29e96..173e9fb 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -68,14 +68,12 @@ Using ``nox``
We use `nox `__ to instrument our tests.
- To test your changes, run unit tests with ``nox``::
+ $ nox -s unit
- $ nox -s unit-3.8
- $ ...
+- To run a single unit test::
-- Args to pytest can be passed through the nox command separated by a `--`. For
- example, to run a single test::
+ $ nox -s unit-3.9 -- -k
- $ nox -s unit-3.8 -- -k
.. note::
@@ -142,7 +140,7 @@ Running System Tests
- To run system tests, you can execute::
# Run all system tests
- $ nox -s system-3.8
+ $ nox -s system
# Run a single system test
$ nox -s system-3.8 -- -k
@@ -215,8 +213,8 @@ Supported versions can be found in our ``noxfile.py`` `config`_.
.. _config: https://github.com/googleapis/python-shell/blob/master/noxfile.py
-We also explicitly decided to support Python 3 beginning with version
-3.6. Reasons for this include:
+We also explicitly decided to support Python 3 beginning with version 3.6.
+Reasons for this include:
- Encouraging use of newest versions of Python 3
- Taking the lead of `prominent`_ open-source `projects`_
From b4472606f4eb050b9135d5dd948d65ae065a1e04 Mon Sep 17 00:00:00 2001
From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com>
Date: Wed, 30 Jun 2021 17:19:57 -0700
Subject: [PATCH 7/8] chore: use gapic-generator-python 0.50.3 (#13)
fix: disable always_use_jwt_access
Committer: @busunkim96
PiperOrigin-RevId: 382142900
Source-Link: https://github.com/googleapis/googleapis/commit/513440fda515f3c799c22a30e3906dcda325004e
Source-Link: https://github.com/googleapis/googleapis-gen/commit/7b1e2c31233f79a704ec21ca410bf661d6bc68d0
Co-authored-by: Owl Bot
---
owl-bot-staging/v1/.coveragerc | 17 +
owl-bot-staging/v1/MANIFEST.in | 2 +
owl-bot-staging/v1/README.rst | 49 +
owl-bot-staging/v1/docs/conf.py | 376 ++++
owl-bot-staging/v1/docs/index.rst | 7 +
.../v1/docs/shell_v1/cloud_shell_service.rst | 6 +
owl-bot-staging/v1/docs/shell_v1/services.rst | 6 +
owl-bot-staging/v1/docs/shell_v1/types.rst | 7 +
.../v1/google/cloud/shell/__init__.py | 57 +
.../v1/google/cloud/shell/py.typed | 2 +
.../v1/google/cloud/shell_v1/__init__.py | 58 +
.../google/cloud/shell_v1/gapic_metadata.json | 73 +
.../v1/google/cloud/shell_v1/py.typed | 2 +
.../cloud/shell_v1/services/__init__.py | 15 +
.../services/cloud_shell_service/__init__.py | 22 +
.../cloud_shell_service/async_client.py | 540 +++++
.../services/cloud_shell_service/client.py | 724 +++++++
.../transports/__init__.py | 33 +
.../cloud_shell_service/transports/base.py | 238 +++
.../cloud_shell_service/transports/grpc.py | 400 ++++
.../transports/grpc_asyncio.py | 404 ++++
.../google/cloud/shell_v1/types/__init__.py | 54 +
.../google/cloud/shell_v1/types/cloudshell.py | 413 ++++
owl-bot-staging/v1/mypy.ini | 3 +
owl-bot-staging/v1/noxfile.py | 132 ++
.../v1/scripts/fixup_shell_v1_keywords.py | 180 ++
owl-bot-staging/v1/setup.py | 53 +
owl-bot-staging/v1/tests/__init__.py | 16 +
owl-bot-staging/v1/tests/unit/__init__.py | 16 +
.../v1/tests/unit/gapic/__init__.py | 16 +
.../v1/tests/unit/gapic/shell_v1/__init__.py | 16 +
.../shell_v1/test_cloud_shell_service.py | 1828 +++++++++++++++++
32 files changed, 5765 insertions(+)
create mode 100644 owl-bot-staging/v1/.coveragerc
create mode 100644 owl-bot-staging/v1/MANIFEST.in
create mode 100644 owl-bot-staging/v1/README.rst
create mode 100644 owl-bot-staging/v1/docs/conf.py
create mode 100644 owl-bot-staging/v1/docs/index.rst
create mode 100644 owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
create mode 100644 owl-bot-staging/v1/docs/shell_v1/services.rst
create mode 100644 owl-bot-staging/v1/docs/shell_v1/types.rst
create mode 100644 owl-bot-staging/v1/google/cloud/shell/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell/py.typed
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/py.typed
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
create mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
create mode 100644 owl-bot-staging/v1/mypy.ini
create mode 100644 owl-bot-staging/v1/noxfile.py
create mode 100644 owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
create mode 100644 owl-bot-staging/v1/setup.py
create mode 100644 owl-bot-staging/v1/tests/__init__.py
create mode 100644 owl-bot-staging/v1/tests/unit/__init__.py
create mode 100644 owl-bot-staging/v1/tests/unit/gapic/__init__.py
create mode 100644 owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
create mode 100644 owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
diff --git a/owl-bot-staging/v1/.coveragerc b/owl-bot-staging/v1/.coveragerc
new file mode 100644
index 0000000..3bb19f7
--- /dev/null
+++ b/owl-bot-staging/v1/.coveragerc
@@ -0,0 +1,17 @@
+[run]
+branch = True
+
+[report]
+show_missing = True
+omit =
+ google/cloud/shell/__init__.py
+exclude_lines =
+ # Re-enable the standard pragma
+ pragma: NO COVER
+ # Ignore debug-only repr
+ def __repr__
+ # Ignore pkg_resources exceptions.
+ # This is added at the module level as a safeguard for if someone
+ # generates the code and tries to run it without pip installing. This
+ # makes it virtually impossible to test properly.
+ except pkg_resources.DistributionNotFound
diff --git a/owl-bot-staging/v1/MANIFEST.in b/owl-bot-staging/v1/MANIFEST.in
new file mode 100644
index 0000000..c025a8e
--- /dev/null
+++ b/owl-bot-staging/v1/MANIFEST.in
@@ -0,0 +1,2 @@
+recursive-include google/cloud/shell *.py
+recursive-include google/cloud/shell_v1 *.py
diff --git a/owl-bot-staging/v1/README.rst b/owl-bot-staging/v1/README.rst
new file mode 100644
index 0000000..516d30f
--- /dev/null
+++ b/owl-bot-staging/v1/README.rst
@@ -0,0 +1,49 @@
+Python Client for Google Cloud Shell API
+=================================================
+
+Quick Start
+-----------
+
+In order to use this library, you first need to go through the following steps:
+
+1. `Select or create a Cloud Platform project.`_
+2. `Enable billing for your project.`_
+3. Enable the Google Cloud Shell API.
+4. `Setup Authentication.`_
+
+.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project
+.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project
+.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
+
+Installation
+~~~~~~~~~~~~
+
+Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to
+create isolated Python environments. The basic problem it addresses is one of
+dependencies and versions, and indirectly permissions.
+
+With `virtualenv`_, it's possible to install this library without needing system
+install permissions, and without clashing with the installed system
+dependencies.
+
+.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/
+
+
+Mac/Linux
+^^^^^^^^^
+
+.. code-block:: console
+
+ python3 -m venv
+ source /bin/activate
+ /bin/pip install /path/to/library
+
+
+Windows
+^^^^^^^
+
+.. code-block:: console
+
+ python3 -m venv
+ \Scripts\activate
+ \Scripts\pip.exe install \path\to\library
diff --git a/owl-bot-staging/v1/docs/conf.py b/owl-bot-staging/v1/docs/conf.py
new file mode 100644
index 0000000..5029b4e
--- /dev/null
+++ b/owl-bot-staging/v1/docs/conf.py
@@ -0,0 +1,376 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
+#
+# google-cloud-shell documentation build configuration file
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+import shlex
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+sys.path.insert(0, os.path.abspath(".."))
+
+__version__ = "0.1.0"
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+needs_sphinx = "1.6.3"
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+ "sphinx.ext.autodoc",
+ "sphinx.ext.autosummary",
+ "sphinx.ext.intersphinx",
+ "sphinx.ext.coverage",
+ "sphinx.ext.napoleon",
+ "sphinx.ext.todo",
+ "sphinx.ext.viewcode",
+]
+
+# autodoc/autosummary flags
+autoclass_content = "both"
+autodoc_default_flags = ["members"]
+autosummary_generate = True
+
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ["_templates"]
+
+# Allow markdown includes (so releases.md can include CHANGLEOG.md)
+# http://www.sphinx-doc.org/en/master/markdown.html
+source_parsers = {".md": "recommonmark.parser.CommonMarkParser"}
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+source_suffix = [".rst", ".md"]
+
+# The encoding of source files.
+# source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = "index"
+
+# General information about the project.
+project = u"google-cloud-shell"
+copyright = u"2020, Google, LLC"
+author = u"Google APIs" # TODO: autogenerate this bit
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The full version, including alpha/beta/rc tags.
+release = __version__
+# The short X.Y version.
+version = ".".join(release.split(".")[0:2])
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+# today = ''
+# Else, today_fmt is used as the format for a strftime call.
+# today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = ["_build"]
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+# default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+# add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+# add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+# show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = "sphinx"
+
+# A list of ignored prefixes for module index sorting.
+# modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+# keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = True
+
+
+# -- Options for HTML output ----------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = "alabaster"
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+ "description": "Google Cloud Client Libraries for Python",
+ "github_user": "googleapis",
+ "github_repo": "google-cloud-python",
+ "github_banner": True,
+ "font_family": "'Roboto', Georgia, sans",
+ "head_font_family": "'Roboto', Georgia, serif",
+ "code_font_family": "'Roboto Mono', 'Consolas', monospace",
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+# html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# " v documentation".
+# html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+# html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+# html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+# html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ["_static"]
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+# html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+# html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+# html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+# html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+# html_additional_pages = {}
+
+# If false, no module index is generated.
+# html_domain_indices = True
+
+# If false, no index is generated.
+# html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+# html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+# html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+# html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+# html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+# html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+# html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
+# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
+# html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+# html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+# html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = "google-cloud-shell-doc"
+
+# -- Options for warnings ------------------------------------------------------
+
+
+suppress_warnings = [
+ # Temporarily suppress this to avoid "more than one target found for
+ # cross-reference" warning, which are intractable for us to avoid while in
+ # a mono-repo.
+ # See https://github.com/sphinx-doc/sphinx/blob
+ # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843
+ "ref.python"
+]
+
+# -- Options for LaTeX output ---------------------------------------------
+
+latex_elements = {
+ # The paper size ('letterpaper' or 'a4paper').
+ # 'papersize': 'letterpaper',
+ # The font size ('10pt', '11pt' or '12pt').
+ # 'pointsize': '10pt',
+ # Additional stuff for the LaTeX preamble.
+ # 'preamble': '',
+ # Latex figure (float) alignment
+ # 'figure_align': 'htbp',
+}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+# author, documentclass [howto, manual, or own class]).
+latex_documents = [
+ (
+ master_doc,
+ "google-cloud-shell.tex",
+ u"google-cloud-shell Documentation",
+ author,
+ "manual",
+ )
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+# latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+# latex_use_parts = False
+
+# If true, show page references after internal links.
+# latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+# latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+# latex_appendices = []
+
+# If false, no module index is generated.
+# latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ (
+ master_doc,
+ "google-cloud-shell",
+ u"Google Cloud Shell Documentation",
+ [author],
+ 1,
+ )
+]
+
+# If true, show URL addresses after external links.
+# man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+# dir menu entry, description, category)
+texinfo_documents = [
+ (
+ master_doc,
+ "google-cloud-shell",
+ u"google-cloud-shell Documentation",
+ author,
+ "google-cloud-shell",
+ "GAPIC library for Google Cloud Shell API",
+ "APIs",
+ )
+]
+
+# Documents to append as an appendix to all manuals.
+# texinfo_appendices = []
+
+# If false, no module index is generated.
+# texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+# texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+# texinfo_no_detailmenu = False
+
+
+# Example configuration for intersphinx: refer to the Python standard library.
+intersphinx_mapping = {
+ "python": ("http://python.readthedocs.org/en/latest/", None),
+ "gax": ("https://gax-python.readthedocs.org/en/latest/", None),
+ "google-auth": ("https://google-auth.readthedocs.io/en/stable", None),
+ "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None),
+ "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None),
+ "grpc": ("https://grpc.io/grpc/python/", None),
+ "requests": ("http://requests.kennethreitz.org/en/stable/", None),
+ "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None),
+ "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None),
+}
+
+
+# Napoleon settings
+napoleon_google_docstring = True
+napoleon_numpy_docstring = True
+napoleon_include_private_with_doc = False
+napoleon_include_special_with_doc = True
+napoleon_use_admonition_for_examples = False
+napoleon_use_admonition_for_notes = False
+napoleon_use_admonition_for_references = False
+napoleon_use_ivar = False
+napoleon_use_param = True
+napoleon_use_rtype = True
diff --git a/owl-bot-staging/v1/docs/index.rst b/owl-bot-staging/v1/docs/index.rst
new file mode 100644
index 0000000..4640279
--- /dev/null
+++ b/owl-bot-staging/v1/docs/index.rst
@@ -0,0 +1,7 @@
+API Reference
+-------------
+.. toctree::
+ :maxdepth: 2
+
+ shell_v1/services
+ shell_v1/types
diff --git a/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst b/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
new file mode 100644
index 0000000..9f5f8db
--- /dev/null
+++ b/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
@@ -0,0 +1,6 @@
+CloudShellService
+-----------------------------------
+
+.. automodule:: google.cloud.shell_v1.services.cloud_shell_service
+ :members:
+ :inherited-members:
diff --git a/owl-bot-staging/v1/docs/shell_v1/services.rst b/owl-bot-staging/v1/docs/shell_v1/services.rst
new file mode 100644
index 0000000..f08d568
--- /dev/null
+++ b/owl-bot-staging/v1/docs/shell_v1/services.rst
@@ -0,0 +1,6 @@
+Services for Google Cloud Shell v1 API
+======================================
+.. toctree::
+ :maxdepth: 2
+
+ cloud_shell_service
diff --git a/owl-bot-staging/v1/docs/shell_v1/types.rst b/owl-bot-staging/v1/docs/shell_v1/types.rst
new file mode 100644
index 0000000..5324b54
--- /dev/null
+++ b/owl-bot-staging/v1/docs/shell_v1/types.rst
@@ -0,0 +1,7 @@
+Types for Google Cloud Shell v1 API
+===================================
+
+.. automodule:: google.cloud.shell_v1.types
+ :members:
+ :undoc-members:
+ :show-inheritance:
diff --git a/owl-bot-staging/v1/google/cloud/shell/__init__.py b/owl-bot-staging/v1/google/cloud/shell/__init__.py
new file mode 100644
index 0000000..fedb483
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell/__init__.py
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 google.cloud.shell_v1.services.cloud_shell_service.client import CloudShellServiceClient
+from google.cloud.shell_v1.services.cloud_shell_service.async_client import CloudShellServiceAsyncClient
+
+from google.cloud.shell_v1.types.cloudshell import AddPublicKeyMetadata
+from google.cloud.shell_v1.types.cloudshell import AddPublicKeyRequest
+from google.cloud.shell_v1.types.cloudshell import AddPublicKeyResponse
+from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentMetadata
+from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentRequest
+from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentResponse
+from google.cloud.shell_v1.types.cloudshell import CloudShellErrorDetails
+from google.cloud.shell_v1.types.cloudshell import CreateEnvironmentMetadata
+from google.cloud.shell_v1.types.cloudshell import DeleteEnvironmentMetadata
+from google.cloud.shell_v1.types.cloudshell import Environment
+from google.cloud.shell_v1.types.cloudshell import GetEnvironmentRequest
+from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyMetadata
+from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyRequest
+from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyResponse
+from google.cloud.shell_v1.types.cloudshell import StartEnvironmentMetadata
+from google.cloud.shell_v1.types.cloudshell import StartEnvironmentRequest
+from google.cloud.shell_v1.types.cloudshell import StartEnvironmentResponse
+
+__all__ = ('CloudShellServiceClient',
+ 'CloudShellServiceAsyncClient',
+ 'AddPublicKeyMetadata',
+ 'AddPublicKeyRequest',
+ 'AddPublicKeyResponse',
+ 'AuthorizeEnvironmentMetadata',
+ 'AuthorizeEnvironmentRequest',
+ 'AuthorizeEnvironmentResponse',
+ 'CloudShellErrorDetails',
+ 'CreateEnvironmentMetadata',
+ 'DeleteEnvironmentMetadata',
+ 'Environment',
+ 'GetEnvironmentRequest',
+ 'RemovePublicKeyMetadata',
+ 'RemovePublicKeyRequest',
+ 'RemovePublicKeyResponse',
+ 'StartEnvironmentMetadata',
+ 'StartEnvironmentRequest',
+ 'StartEnvironmentResponse',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell/py.typed b/owl-bot-staging/v1/google/cloud/shell/py.typed
new file mode 100644
index 0000000..8def83e
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell/py.typed
@@ -0,0 +1,2 @@
+# Marker file for PEP 561.
+# The google-cloud-shell package uses inline types.
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
new file mode 100644
index 0000000..5a65b6d
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 .services.cloud_shell_service import CloudShellServiceClient
+from .services.cloud_shell_service import CloudShellServiceAsyncClient
+
+from .types.cloudshell import AddPublicKeyMetadata
+from .types.cloudshell import AddPublicKeyRequest
+from .types.cloudshell import AddPublicKeyResponse
+from .types.cloudshell import AuthorizeEnvironmentMetadata
+from .types.cloudshell import AuthorizeEnvironmentRequest
+from .types.cloudshell import AuthorizeEnvironmentResponse
+from .types.cloudshell import CloudShellErrorDetails
+from .types.cloudshell import CreateEnvironmentMetadata
+from .types.cloudshell import DeleteEnvironmentMetadata
+from .types.cloudshell import Environment
+from .types.cloudshell import GetEnvironmentRequest
+from .types.cloudshell import RemovePublicKeyMetadata
+from .types.cloudshell import RemovePublicKeyRequest
+from .types.cloudshell import RemovePublicKeyResponse
+from .types.cloudshell import StartEnvironmentMetadata
+from .types.cloudshell import StartEnvironmentRequest
+from .types.cloudshell import StartEnvironmentResponse
+
+__all__ = (
+ 'CloudShellServiceAsyncClient',
+'AddPublicKeyMetadata',
+'AddPublicKeyRequest',
+'AddPublicKeyResponse',
+'AuthorizeEnvironmentMetadata',
+'AuthorizeEnvironmentRequest',
+'AuthorizeEnvironmentResponse',
+'CloudShellErrorDetails',
+'CloudShellServiceClient',
+'CreateEnvironmentMetadata',
+'DeleteEnvironmentMetadata',
+'Environment',
+'GetEnvironmentRequest',
+'RemovePublicKeyMetadata',
+'RemovePublicKeyRequest',
+'RemovePublicKeyResponse',
+'StartEnvironmentMetadata',
+'StartEnvironmentRequest',
+'StartEnvironmentResponse',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json b/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
new file mode 100644
index 0000000..c42b8b6
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
@@ -0,0 +1,73 @@
+ {
+ "comment": "This file maps proto services/RPCs to the corresponding library clients/methods",
+ "language": "python",
+ "libraryPackage": "google.cloud.shell_v1",
+ "protoPackage": "google.cloud.shell.v1",
+ "schema": "1.0",
+ "services": {
+ "CloudShellService": {
+ "clients": {
+ "grpc": {
+ "libraryClient": "CloudShellServiceClient",
+ "rpcs": {
+ "AddPublicKey": {
+ "methods": [
+ "add_public_key"
+ ]
+ },
+ "AuthorizeEnvironment": {
+ "methods": [
+ "authorize_environment"
+ ]
+ },
+ "GetEnvironment": {
+ "methods": [
+ "get_environment"
+ ]
+ },
+ "RemovePublicKey": {
+ "methods": [
+ "remove_public_key"
+ ]
+ },
+ "StartEnvironment": {
+ "methods": [
+ "start_environment"
+ ]
+ }
+ }
+ },
+ "grpc-async": {
+ "libraryClient": "CloudShellServiceAsyncClient",
+ "rpcs": {
+ "AddPublicKey": {
+ "methods": [
+ "add_public_key"
+ ]
+ },
+ "AuthorizeEnvironment": {
+ "methods": [
+ "authorize_environment"
+ ]
+ },
+ "GetEnvironment": {
+ "methods": [
+ "get_environment"
+ ]
+ },
+ "RemovePublicKey": {
+ "methods": [
+ "remove_public_key"
+ ]
+ },
+ "StartEnvironment": {
+ "methods": [
+ "start_environment"
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/py.typed b/owl-bot-staging/v1/google/cloud/shell_v1/py.typed
new file mode 100644
index 0000000..8def83e
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/py.typed
@@ -0,0 +1,2 @@
+# Marker file for PEP 561.
+# The google-cloud-shell package uses inline types.
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
new file mode 100644
index 0000000..4de6597
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
@@ -0,0 +1,15 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
new file mode 100644
index 0000000..fa696fc
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 .client import CloudShellServiceClient
+from .async_client import CloudShellServiceAsyncClient
+
+__all__ = (
+ 'CloudShellServiceClient',
+ 'CloudShellServiceAsyncClient',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
new file mode 100644
index 0000000..8af665d
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
@@ -0,0 +1,540 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 collections import OrderedDict
+import functools
+import re
+from typing import Dict, Sequence, Tuple, Type, Union
+import pkg_resources
+
+import google.api_core.client_options as ClientOptions # type: ignore
+from google.api_core import exceptions as core_exceptions # type: ignore
+from google.api_core import gapic_v1 # type: ignore
+from google.api_core import retry as retries # type: ignore
+from google.auth import credentials as ga_credentials # type: ignore
+from google.oauth2 import service_account # type: ignore
+
+from google.api_core import operation # type: ignore
+from google.api_core import operation_async # type: ignore
+from google.cloud.shell_v1.types import cloudshell
+from .transports.base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
+from .transports.grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
+from .client import CloudShellServiceClient
+
+
+class CloudShellServiceAsyncClient:
+ """API for interacting with Google Cloud Shell. Each user of
+ Cloud Shell has at least one environment, which has the ID
+ "default". Environment consists of a Docker image defining what
+ is installed on the environment and a home directory containing
+ the user's data that will remain across sessions. Clients use
+ this API to start and fetch information about their environment,
+ which can then be used to connect to that environment via a
+ separate SSH client.
+ """
+
+ _client: CloudShellServiceClient
+
+ DEFAULT_ENDPOINT = CloudShellServiceClient.DEFAULT_ENDPOINT
+ DEFAULT_MTLS_ENDPOINT = CloudShellServiceClient.DEFAULT_MTLS_ENDPOINT
+
+ environment_path = staticmethod(CloudShellServiceClient.environment_path)
+ parse_environment_path = staticmethod(CloudShellServiceClient.parse_environment_path)
+ common_billing_account_path = staticmethod(CloudShellServiceClient.common_billing_account_path)
+ parse_common_billing_account_path = staticmethod(CloudShellServiceClient.parse_common_billing_account_path)
+ common_folder_path = staticmethod(CloudShellServiceClient.common_folder_path)
+ parse_common_folder_path = staticmethod(CloudShellServiceClient.parse_common_folder_path)
+ common_organization_path = staticmethod(CloudShellServiceClient.common_organization_path)
+ parse_common_organization_path = staticmethod(CloudShellServiceClient.parse_common_organization_path)
+ common_project_path = staticmethod(CloudShellServiceClient.common_project_path)
+ parse_common_project_path = staticmethod(CloudShellServiceClient.parse_common_project_path)
+ common_location_path = staticmethod(CloudShellServiceClient.common_location_path)
+ parse_common_location_path = staticmethod(CloudShellServiceClient.parse_common_location_path)
+
+ @classmethod
+ def from_service_account_info(cls, info: dict, *args, **kwargs):
+ """Creates an instance of this client using the provided credentials
+ info.
+
+ Args:
+ info (dict): The service account private key info.
+ args: Additional arguments to pass to the constructor.
+ kwargs: Additional arguments to pass to the constructor.
+
+ Returns:
+ CloudShellServiceAsyncClient: The constructed client.
+ """
+ return CloudShellServiceClient.from_service_account_info.__func__(CloudShellServiceAsyncClient, info, *args, **kwargs) # type: ignore
+
+ @classmethod
+ def from_service_account_file(cls, filename: str, *args, **kwargs):
+ """Creates an instance of this client using the provided credentials
+ file.
+
+ Args:
+ filename (str): The path to the service account private key json
+ file.
+ args: Additional arguments to pass to the constructor.
+ kwargs: Additional arguments to pass to the constructor.
+
+ Returns:
+ CloudShellServiceAsyncClient: The constructed client.
+ """
+ return CloudShellServiceClient.from_service_account_file.__func__(CloudShellServiceAsyncClient, filename, *args, **kwargs) # type: ignore
+
+ from_service_account_json = from_service_account_file
+
+ @property
+ def transport(self) -> CloudShellServiceTransport:
+ """Returns the transport used by the client instance.
+
+ Returns:
+ CloudShellServiceTransport: The transport used by the client instance.
+ """
+ return self._client.transport
+
+ get_transport_class = functools.partial(type(CloudShellServiceClient).get_transport_class, type(CloudShellServiceClient))
+
+ def __init__(self, *,
+ credentials: ga_credentials.Credentials = None,
+ transport: Union[str, CloudShellServiceTransport] = "grpc_asyncio",
+ client_options: ClientOptions = None,
+ client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ ) -> None:
+ """Instantiates the cloud shell service client.
+
+ Args:
+ credentials (Optional[google.auth.credentials.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify the application to the service; if none
+ are specified, the client will attempt to ascertain the
+ credentials from the environment.
+ transport (Union[str, ~.CloudShellServiceTransport]): The
+ transport to use. If set to None, a transport is chosen
+ automatically.
+ client_options (ClientOptions): Custom options for the client. It
+ won't take effect if a ``transport`` instance is provided.
+ (1) The ``api_endpoint`` property can be used to override the
+ default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT
+ environment variable can also be used to override the endpoint:
+ "always" (always use the default mTLS endpoint), "never" (always
+ use the default regular endpoint) and "auto" (auto switch to the
+ default mTLS endpoint if client certificate is present, this is
+ the default value). However, the ``api_endpoint`` property takes
+ precedence if provided.
+ (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable
+ is "true", then the ``client_cert_source`` property can be used
+ to provide client certificate for mutual TLS transport. If
+ not provided, the default SSL client certificate will be used if
+ present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not
+ set, no client certificate will be used.
+
+ Raises:
+ google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport
+ creation failed for any reason.
+ """
+ self._client = CloudShellServiceClient(
+ credentials=credentials,
+ transport=transport,
+ client_options=client_options,
+ client_info=client_info,
+
+ )
+
+ async def get_environment(self,
+ request: cloudshell.GetEnvironmentRequest = None,
+ *,
+ name: str = None,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> cloudshell.Environment:
+ r"""Gets an environment. Returns NOT_FOUND if the environment does
+ not exist.
+
+ Args:
+ request (:class:`google.cloud.shell_v1.types.GetEnvironmentRequest`):
+ The request object. Request message for
+ [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
+ name (:class:`str`):
+ Required. Name of the requested resource, for example
+ ``users/me/environments/default`` or
+ ``users/someone@example.com/environments/default``.
+
+ This corresponds to the ``name`` field
+ on the ``request`` instance; if ``request`` is provided, this
+ should not be set.
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.cloud.shell_v1.types.Environment:
+ A Cloud Shell environment, which is
+ defined as the combination of a Docker
+ image specifying what is installed on
+ the environment and a home directory
+ containing the user's data that will
+ remain across sessions. Each user has at
+ least an environment with the ID
+ "default".
+
+ """
+ # Create or coerce a protobuf request object.
+ # Sanity check: If we got a request object, we should *not* have
+ # gotten any keyword arguments that map to the request.
+ has_flattened_params = any([name])
+ if request is not None and has_flattened_params:
+ raise ValueError("If the `request` argument is set, then none of "
+ "the individual field arguments should be set.")
+
+ request = cloudshell.GetEnvironmentRequest(request)
+
+ # If we have keyword arguments corresponding to fields on the
+ # request, apply these.
+ if name is not None:
+ request.name = name
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = gapic_v1.method_async.wrap_method(
+ self._client._transport.get_environment,
+ default_retry=retries.Retry(
+initial=1.0,maximum=60.0,multiplier=1.3, predicate=retries.if_exception_type(
+ core_exceptions.ServiceUnavailable,
+ core_exceptions.Unknown,
+ ),
+ deadline=60.0,
+ ),
+ default_timeout=60.0,
+ client_info=DEFAULT_CLIENT_INFO,
+ )
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = await rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ async def start_environment(self,
+ request: cloudshell.StartEnvironmentRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation_async.AsyncOperation:
+ r"""Starts an existing environment, allowing clients to
+ connect to it. The returned operation will contain an
+ instance of StartEnvironmentMetadata in its metadata
+ field. Users can wait for the environment to start by
+ polling this operation via GetOperation. Once the
+ environment has finished starting and is ready to accept
+ connections, the operation will contain a
+ StartEnvironmentResponse in its response field.
+
+ Args:
+ request (:class:`google.cloud.shell_v1.types.StartEnvironmentRequest`):
+ The request object. Request message for
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation_async.AsyncOperation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.StartEnvironmentResponse` Message included in the response field of operations returned from
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
+ once the operation is complete.
+
+ """
+ # Create or coerce a protobuf request object.
+ request = cloudshell.StartEnvironmentRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = gapic_v1.method_async.wrap_method(
+ self._client._transport.start_environment,
+ default_timeout=60.0,
+ client_info=DEFAULT_CLIENT_INFO,
+ )
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = await rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation_async.from_gapic(
+ response,
+ self._client._transport.operations_client,
+ cloudshell.StartEnvironmentResponse,
+ metadata_type=cloudshell.StartEnvironmentMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ async def authorize_environment(self,
+ request: cloudshell.AuthorizeEnvironmentRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation_async.AsyncOperation:
+ r"""Sends OAuth credentials to a running environment on
+ behalf of a user. When this completes, the environment
+ will be authorized to run various Google Cloud command
+ line tools without requiring the user to manually
+ authenticate.
+
+ Args:
+ request (:class:`google.cloud.shell_v1.types.AuthorizeEnvironmentRequest`):
+ The request object. Request message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation_async.AsyncOperation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.AuthorizeEnvironmentResponse` Response message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+
+ """
+ # Create or coerce a protobuf request object.
+ request = cloudshell.AuthorizeEnvironmentRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = gapic_v1.method_async.wrap_method(
+ self._client._transport.authorize_environment,
+ default_timeout=60.0,
+ client_info=DEFAULT_CLIENT_INFO,
+ )
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = await rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation_async.from_gapic(
+ response,
+ self._client._transport.operations_client,
+ cloudshell.AuthorizeEnvironmentResponse,
+ metadata_type=cloudshell.AuthorizeEnvironmentMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ async def add_public_key(self,
+ request: cloudshell.AddPublicKeyRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation_async.AsyncOperation:
+ r"""Adds a public SSH key to an environment, allowing clients with
+ the corresponding private key to connect to that environment via
+ SSH. If a key with the same content already exists, this will
+ error with ALREADY_EXISTS.
+
+ Args:
+ request (:class:`google.cloud.shell_v1.types.AddPublicKeyRequest`):
+ The request object. Request message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation_async.AsyncOperation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.AddPublicKeyResponse` Response message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+
+ """
+ # Create or coerce a protobuf request object.
+ request = cloudshell.AddPublicKeyRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = gapic_v1.method_async.wrap_method(
+ self._client._transport.add_public_key,
+ default_timeout=60.0,
+ client_info=DEFAULT_CLIENT_INFO,
+ )
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("environment", request.environment),
+ )),
+ )
+
+ # Send the request.
+ response = await rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation_async.from_gapic(
+ response,
+ self._client._transport.operations_client,
+ cloudshell.AddPublicKeyResponse,
+ metadata_type=cloudshell.AddPublicKeyMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ async def remove_public_key(self,
+ request: cloudshell.RemovePublicKeyRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation_async.AsyncOperation:
+ r"""Removes a public SSH key from an environment. Clients will no
+ longer be able to connect to the environment using the
+ corresponding private key. If a key with the same content is not
+ present, this will error with NOT_FOUND.
+
+ Args:
+ request (:class:`google.cloud.shell_v1.types.RemovePublicKeyRequest`):
+ The request object. Request message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation_async.AsyncOperation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.RemovePublicKeyResponse` Response message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+
+ """
+ # Create or coerce a protobuf request object.
+ request = cloudshell.RemovePublicKeyRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = gapic_v1.method_async.wrap_method(
+ self._client._transport.remove_public_key,
+ default_timeout=60.0,
+ client_info=DEFAULT_CLIENT_INFO,
+ )
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("environment", request.environment),
+ )),
+ )
+
+ # Send the request.
+ response = await rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation_async.from_gapic(
+ response,
+ self._client._transport.operations_client,
+ cloudshell.RemovePublicKeyResponse,
+ metadata_type=cloudshell.RemovePublicKeyMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+
+
+
+
+try:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
+ gapic_version=pkg_resources.get_distribution(
+ "google-cloud-shell",
+ ).version,
+ )
+except pkg_resources.DistributionNotFound:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
+
+
+__all__ = (
+ "CloudShellServiceAsyncClient",
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
new file mode 100644
index 0000000..67f0b94
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
@@ -0,0 +1,724 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 collections import OrderedDict
+from distutils import util
+import os
+import re
+from typing import Callable, Dict, Optional, Sequence, Tuple, Type, Union
+import pkg_resources
+
+from google.api_core import client_options as client_options_lib # type: ignore
+from google.api_core import exceptions as core_exceptions # type: ignore
+from google.api_core import gapic_v1 # type: ignore
+from google.api_core import retry as retries # type: ignore
+from google.auth import credentials as ga_credentials # type: ignore
+from google.auth.transport import mtls # type: ignore
+from google.auth.transport.grpc import SslCredentials # type: ignore
+from google.auth.exceptions import MutualTLSChannelError # type: ignore
+from google.oauth2 import service_account # type: ignore
+
+from google.api_core import operation # type: ignore
+from google.api_core import operation_async # type: ignore
+from google.cloud.shell_v1.types import cloudshell
+from .transports.base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
+from .transports.grpc import CloudShellServiceGrpcTransport
+from .transports.grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
+
+
+class CloudShellServiceClientMeta(type):
+ """Metaclass for the CloudShellService client.
+
+ This provides class-level methods for building and retrieving
+ support objects (e.g. transport) without polluting the client instance
+ objects.
+ """
+ _transport_registry = OrderedDict() # type: Dict[str, Type[CloudShellServiceTransport]]
+ _transport_registry["grpc"] = CloudShellServiceGrpcTransport
+ _transport_registry["grpc_asyncio"] = CloudShellServiceGrpcAsyncIOTransport
+
+ def get_transport_class(cls,
+ label: str = None,
+ ) -> Type[CloudShellServiceTransport]:
+ """Returns an appropriate transport class.
+
+ Args:
+ label: The name of the desired transport. If none is
+ provided, then the first transport in the registry is used.
+
+ Returns:
+ The transport class to use.
+ """
+ # If a specific transport is requested, return that one.
+ if label:
+ return cls._transport_registry[label]
+
+ # No transport is requested; return the default (that is, the first one
+ # in the dictionary).
+ return next(iter(cls._transport_registry.values()))
+
+
+class CloudShellServiceClient(metaclass=CloudShellServiceClientMeta):
+ """API for interacting with Google Cloud Shell. Each user of
+ Cloud Shell has at least one environment, which has the ID
+ "default". Environment consists of a Docker image defining what
+ is installed on the environment and a home directory containing
+ the user's data that will remain across sessions. Clients use
+ this API to start and fetch information about their environment,
+ which can then be used to connect to that environment via a
+ separate SSH client.
+ """
+
+ @staticmethod
+ def _get_default_mtls_endpoint(api_endpoint):
+ """Converts api endpoint to mTLS endpoint.
+
+ Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to
+ "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively.
+ Args:
+ api_endpoint (Optional[str]): the api endpoint to convert.
+ Returns:
+ str: converted mTLS api endpoint.
+ """
+ if not api_endpoint:
+ return api_endpoint
+
+ mtls_endpoint_re = re.compile(
+ r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?"
+ )
+
+ m = mtls_endpoint_re.match(api_endpoint)
+ name, mtls, sandbox, googledomain = m.groups()
+ if mtls or not googledomain:
+ return api_endpoint
+
+ if sandbox:
+ return api_endpoint.replace(
+ "sandbox.googleapis.com", "mtls.sandbox.googleapis.com"
+ )
+
+ return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com")
+
+ DEFAULT_ENDPOINT = "cloudshell.googleapis.com"
+ DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore
+ DEFAULT_ENDPOINT
+ )
+
+ @classmethod
+ def from_service_account_info(cls, info: dict, *args, **kwargs):
+ """Creates an instance of this client using the provided credentials
+ info.
+
+ Args:
+ info (dict): The service account private key info.
+ args: Additional arguments to pass to the constructor.
+ kwargs: Additional arguments to pass to the constructor.
+
+ Returns:
+ CloudShellServiceClient: The constructed client.
+ """
+ credentials = service_account.Credentials.from_service_account_info(info)
+ kwargs["credentials"] = credentials
+ return cls(*args, **kwargs)
+
+ @classmethod
+ def from_service_account_file(cls, filename: str, *args, **kwargs):
+ """Creates an instance of this client using the provided credentials
+ file.
+
+ Args:
+ filename (str): The path to the service account private key json
+ file.
+ args: Additional arguments to pass to the constructor.
+ kwargs: Additional arguments to pass to the constructor.
+
+ Returns:
+ CloudShellServiceClient: The constructed client.
+ """
+ credentials = service_account.Credentials.from_service_account_file(
+ filename)
+ kwargs["credentials"] = credentials
+ return cls(*args, **kwargs)
+
+ from_service_account_json = from_service_account_file
+
+ @property
+ def transport(self) -> CloudShellServiceTransport:
+ """Returns the transport used by the client instance.
+
+ Returns:
+ CloudShellServiceTransport: The transport used by the client
+ instance.
+ """
+ return self._transport
+
+ @staticmethod
+ def environment_path(user: str,environment: str,) -> str:
+ """Returns a fully-qualified environment string."""
+ return "users/{user}/environments/{environment}".format(user=user, environment=environment, )
+
+ @staticmethod
+ def parse_environment_path(path: str) -> Dict[str,str]:
+ """Parses a environment path into its component segments."""
+ m = re.match(r"^users/(?P.+?)/environments/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ @staticmethod
+ def common_billing_account_path(billing_account: str, ) -> str:
+ """Returns a fully-qualified billing_account string."""
+ return "billingAccounts/{billing_account}".format(billing_account=billing_account, )
+
+ @staticmethod
+ def parse_common_billing_account_path(path: str) -> Dict[str,str]:
+ """Parse a billing_account path into its component segments."""
+ m = re.match(r"^billingAccounts/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ @staticmethod
+ def common_folder_path(folder: str, ) -> str:
+ """Returns a fully-qualified folder string."""
+ return "folders/{folder}".format(folder=folder, )
+
+ @staticmethod
+ def parse_common_folder_path(path: str) -> Dict[str,str]:
+ """Parse a folder path into its component segments."""
+ m = re.match(r"^folders/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ @staticmethod
+ def common_organization_path(organization: str, ) -> str:
+ """Returns a fully-qualified organization string."""
+ return "organizations/{organization}".format(organization=organization, )
+
+ @staticmethod
+ def parse_common_organization_path(path: str) -> Dict[str,str]:
+ """Parse a organization path into its component segments."""
+ m = re.match(r"^organizations/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ @staticmethod
+ def common_project_path(project: str, ) -> str:
+ """Returns a fully-qualified project string."""
+ return "projects/{project}".format(project=project, )
+
+ @staticmethod
+ def parse_common_project_path(path: str) -> Dict[str,str]:
+ """Parse a project path into its component segments."""
+ m = re.match(r"^projects/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ @staticmethod
+ def common_location_path(project: str, location: str, ) -> str:
+ """Returns a fully-qualified location string."""
+ return "projects/{project}/locations/{location}".format(project=project, location=location, )
+
+ @staticmethod
+ def parse_common_location_path(path: str) -> Dict[str,str]:
+ """Parse a location path into its component segments."""
+ m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path)
+ return m.groupdict() if m else {}
+
+ def __init__(self, *,
+ credentials: Optional[ga_credentials.Credentials] = None,
+ transport: Union[str, CloudShellServiceTransport, None] = None,
+ client_options: Optional[client_options_lib.ClientOptions] = None,
+ client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ ) -> None:
+ """Instantiates the cloud shell service client.
+
+ Args:
+ credentials (Optional[google.auth.credentials.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify the application to the service; if none
+ are specified, the client will attempt to ascertain the
+ credentials from the environment.
+ transport (Union[str, CloudShellServiceTransport]): The
+ transport to use. If set to None, a transport is chosen
+ automatically.
+ client_options (google.api_core.client_options.ClientOptions): Custom options for the
+ client. It won't take effect if a ``transport`` instance is provided.
+ (1) The ``api_endpoint`` property can be used to override the
+ default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT
+ environment variable can also be used to override the endpoint:
+ "always" (always use the default mTLS endpoint), "never" (always
+ use the default regular endpoint) and "auto" (auto switch to the
+ default mTLS endpoint if client certificate is present, this is
+ the default value). However, the ``api_endpoint`` property takes
+ precedence if provided.
+ (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable
+ is "true", then the ``client_cert_source`` property can be used
+ to provide client certificate for mutual TLS transport. If
+ not provided, the default SSL client certificate will be used if
+ present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not
+ set, no client certificate will be used.
+ client_info (google.api_core.gapic_v1.client_info.ClientInfo):
+ The client info used to send a user-agent string along with
+ API requests. If ``None``, then default info will be used.
+ Generally, you only need to set this if you're developing
+ your own client library.
+
+ Raises:
+ google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport
+ creation failed for any reason.
+ """
+ if isinstance(client_options, dict):
+ client_options = client_options_lib.from_dict(client_options)
+ if client_options is None:
+ client_options = client_options_lib.ClientOptions()
+
+ # Create SSL credentials for mutual TLS if needed.
+ use_client_cert = bool(util.strtobool(os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")))
+
+ client_cert_source_func = None
+ is_mtls = False
+ if use_client_cert:
+ if client_options.client_cert_source:
+ is_mtls = True
+ client_cert_source_func = client_options.client_cert_source
+ else:
+ is_mtls = mtls.has_default_client_cert_source()
+ if is_mtls:
+ client_cert_source_func = mtls.default_client_cert_source()
+ else:
+ client_cert_source_func = None
+
+ # Figure out which api endpoint to use.
+ if client_options.api_endpoint is not None:
+ api_endpoint = client_options.api_endpoint
+ else:
+ use_mtls_env = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
+ if use_mtls_env == "never":
+ api_endpoint = self.DEFAULT_ENDPOINT
+ elif use_mtls_env == "always":
+ api_endpoint = self.DEFAULT_MTLS_ENDPOINT
+ elif use_mtls_env == "auto":
+ if is_mtls:
+ api_endpoint = self.DEFAULT_MTLS_ENDPOINT
+ else:
+ api_endpoint = self.DEFAULT_ENDPOINT
+ else:
+ raise MutualTLSChannelError(
+ "Unsupported GOOGLE_API_USE_MTLS_ENDPOINT value. Accepted "
+ "values: never, auto, always"
+ )
+
+ # Save or instantiate the transport.
+ # Ordinarily, we provide the transport, but allowing a custom transport
+ # instance provides an extensibility point for unusual situations.
+ if isinstance(transport, CloudShellServiceTransport):
+ # transport is a CloudShellServiceTransport instance.
+ if credentials or client_options.credentials_file:
+ raise ValueError("When providing a transport instance, "
+ "provide its credentials directly.")
+ if client_options.scopes:
+ raise ValueError(
+ "When providing a transport instance, provide its scopes "
+ "directly."
+ )
+ self._transport = transport
+ else:
+ Transport = type(self).get_transport_class(transport)
+ self._transport = Transport(
+ credentials=credentials,
+ credentials_file=client_options.credentials_file,
+ host=api_endpoint,
+ scopes=client_options.scopes,
+ client_cert_source_for_mtls=client_cert_source_func,
+ quota_project_id=client_options.quota_project_id,
+ client_info=client_info,
+ )
+
+ def get_environment(self,
+ request: cloudshell.GetEnvironmentRequest = None,
+ *,
+ name: str = None,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> cloudshell.Environment:
+ r"""Gets an environment. Returns NOT_FOUND if the environment does
+ not exist.
+
+ Args:
+ request (google.cloud.shell_v1.types.GetEnvironmentRequest):
+ The request object. Request message for
+ [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
+ name (str):
+ Required. Name of the requested resource, for example
+ ``users/me/environments/default`` or
+ ``users/someone@example.com/environments/default``.
+
+ This corresponds to the ``name`` field
+ on the ``request`` instance; if ``request`` is provided, this
+ should not be set.
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.cloud.shell_v1.types.Environment:
+ A Cloud Shell environment, which is
+ defined as the combination of a Docker
+ image specifying what is installed on
+ the environment and a home directory
+ containing the user's data that will
+ remain across sessions. Each user has at
+ least an environment with the ID
+ "default".
+
+ """
+ # Create or coerce a protobuf request object.
+ # Sanity check: If we got a request object, we should *not* have
+ # gotten any keyword arguments that map to the request.
+ has_flattened_params = any([name])
+ if request is not None and has_flattened_params:
+ raise ValueError('If the `request` argument is set, then none of '
+ 'the individual field arguments should be set.')
+
+ # Minor optimization to avoid making a copy if the user passes
+ # in a cloudshell.GetEnvironmentRequest.
+ # There's no risk of modifying the input as we've already verified
+ # there are no flattened fields.
+ if not isinstance(request, cloudshell.GetEnvironmentRequest):
+ request = cloudshell.GetEnvironmentRequest(request)
+ # If we have keyword arguments corresponding to fields on the
+ # request, apply these.
+ if name is not None:
+ request.name = name
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = self._transport._wrapped_methods[self._transport.get_environment]
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ def start_environment(self,
+ request: cloudshell.StartEnvironmentRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation.Operation:
+ r"""Starts an existing environment, allowing clients to
+ connect to it. The returned operation will contain an
+ instance of StartEnvironmentMetadata in its metadata
+ field. Users can wait for the environment to start by
+ polling this operation via GetOperation. Once the
+ environment has finished starting and is ready to accept
+ connections, the operation will contain a
+ StartEnvironmentResponse in its response field.
+
+ Args:
+ request (google.cloud.shell_v1.types.StartEnvironmentRequest):
+ The request object. Request message for
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation.Operation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.StartEnvironmentResponse` Message included in the response field of operations returned from
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
+ once the operation is complete.
+
+ """
+ # Create or coerce a protobuf request object.
+ # Minor optimization to avoid making a copy if the user passes
+ # in a cloudshell.StartEnvironmentRequest.
+ # There's no risk of modifying the input as we've already verified
+ # there are no flattened fields.
+ if not isinstance(request, cloudshell.StartEnvironmentRequest):
+ request = cloudshell.StartEnvironmentRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = self._transport._wrapped_methods[self._transport.start_environment]
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation.from_gapic(
+ response,
+ self._transport.operations_client,
+ cloudshell.StartEnvironmentResponse,
+ metadata_type=cloudshell.StartEnvironmentMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ def authorize_environment(self,
+ request: cloudshell.AuthorizeEnvironmentRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation.Operation:
+ r"""Sends OAuth credentials to a running environment on
+ behalf of a user. When this completes, the environment
+ will be authorized to run various Google Cloud command
+ line tools without requiring the user to manually
+ authenticate.
+
+ Args:
+ request (google.cloud.shell_v1.types.AuthorizeEnvironmentRequest):
+ The request object. Request message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation.Operation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.AuthorizeEnvironmentResponse` Response message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+
+ """
+ # Create or coerce a protobuf request object.
+ # Minor optimization to avoid making a copy if the user passes
+ # in a cloudshell.AuthorizeEnvironmentRequest.
+ # There's no risk of modifying the input as we've already verified
+ # there are no flattened fields.
+ if not isinstance(request, cloudshell.AuthorizeEnvironmentRequest):
+ request = cloudshell.AuthorizeEnvironmentRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = self._transport._wrapped_methods[self._transport.authorize_environment]
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("name", request.name),
+ )),
+ )
+
+ # Send the request.
+ response = rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation.from_gapic(
+ response,
+ self._transport.operations_client,
+ cloudshell.AuthorizeEnvironmentResponse,
+ metadata_type=cloudshell.AuthorizeEnvironmentMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ def add_public_key(self,
+ request: cloudshell.AddPublicKeyRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation.Operation:
+ r"""Adds a public SSH key to an environment, allowing clients with
+ the corresponding private key to connect to that environment via
+ SSH. If a key with the same content already exists, this will
+ error with ALREADY_EXISTS.
+
+ Args:
+ request (google.cloud.shell_v1.types.AddPublicKeyRequest):
+ The request object. Request message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation.Operation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.AddPublicKeyResponse` Response message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+
+ """
+ # Create or coerce a protobuf request object.
+ # Minor optimization to avoid making a copy if the user passes
+ # in a cloudshell.AddPublicKeyRequest.
+ # There's no risk of modifying the input as we've already verified
+ # there are no flattened fields.
+ if not isinstance(request, cloudshell.AddPublicKeyRequest):
+ request = cloudshell.AddPublicKeyRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = self._transport._wrapped_methods[self._transport.add_public_key]
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("environment", request.environment),
+ )),
+ )
+
+ # Send the request.
+ response = rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation.from_gapic(
+ response,
+ self._transport.operations_client,
+ cloudshell.AddPublicKeyResponse,
+ metadata_type=cloudshell.AddPublicKeyMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+ def remove_public_key(self,
+ request: cloudshell.RemovePublicKeyRequest = None,
+ *,
+ retry: retries.Retry = gapic_v1.method.DEFAULT,
+ timeout: float = None,
+ metadata: Sequence[Tuple[str, str]] = (),
+ ) -> operation.Operation:
+ r"""Removes a public SSH key from an environment. Clients will no
+ longer be able to connect to the environment using the
+ corresponding private key. If a key with the same content is not
+ present, this will error with NOT_FOUND.
+
+ Args:
+ request (google.cloud.shell_v1.types.RemovePublicKeyRequest):
+ The request object. Request message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+ retry (google.api_core.retry.Retry): Designation of what errors, if any,
+ should be retried.
+ timeout (float): The timeout for this request.
+ metadata (Sequence[Tuple[str, str]]): Strings which should be
+ sent along with the request as metadata.
+
+ Returns:
+ google.api_core.operation.Operation:
+ An object representing a long-running operation.
+
+ The result type for the operation will be :class:`google.cloud.shell_v1.types.RemovePublicKeyResponse` Response message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+
+ """
+ # Create or coerce a protobuf request object.
+ # Minor optimization to avoid making a copy if the user passes
+ # in a cloudshell.RemovePublicKeyRequest.
+ # There's no risk of modifying the input as we've already verified
+ # there are no flattened fields.
+ if not isinstance(request, cloudshell.RemovePublicKeyRequest):
+ request = cloudshell.RemovePublicKeyRequest(request)
+
+ # Wrap the RPC method; this adds retry and timeout information,
+ # and friendly error handling.
+ rpc = self._transport._wrapped_methods[self._transport.remove_public_key]
+
+ # Certain fields should be provided within the metadata header;
+ # add these here.
+ metadata = tuple(metadata) + (
+ gapic_v1.routing_header.to_grpc_metadata((
+ ("environment", request.environment),
+ )),
+ )
+
+ # Send the request.
+ response = rpc(
+ request,
+ retry=retry,
+ timeout=timeout,
+ metadata=metadata,
+ )
+
+ # Wrap the response in an operation future.
+ response = operation.from_gapic(
+ response,
+ self._transport.operations_client,
+ cloudshell.RemovePublicKeyResponse,
+ metadata_type=cloudshell.RemovePublicKeyMetadata,
+ )
+
+ # Done; return the response.
+ return response
+
+
+
+
+
+try:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
+ gapic_version=pkg_resources.get_distribution(
+ "google-cloud-shell",
+ ).version,
+ )
+except pkg_resources.DistributionNotFound:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
+
+
+__all__ = (
+ "CloudShellServiceClient",
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
new file mode 100644
index 0000000..fef2496
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 collections import OrderedDict
+from typing import Dict, Type
+
+from .base import CloudShellServiceTransport
+from .grpc import CloudShellServiceGrpcTransport
+from .grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
+
+
+# Compile a registry of transports.
+_transport_registry = OrderedDict() # type: Dict[str, Type[CloudShellServiceTransport]]
+_transport_registry['grpc'] = CloudShellServiceGrpcTransport
+_transport_registry['grpc_asyncio'] = CloudShellServiceGrpcAsyncIOTransport
+
+__all__ = (
+ 'CloudShellServiceTransport',
+ 'CloudShellServiceGrpcTransport',
+ 'CloudShellServiceGrpcAsyncIOTransport',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
new file mode 100644
index 0000000..b65a12b
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
@@ -0,0 +1,238 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 abc
+from typing import Awaitable, Callable, Dict, Optional, Sequence, Union
+import packaging.version
+import pkg_resources
+
+import google.auth # type: ignore
+import google.api_core # type: ignore
+from google.api_core import exceptions as core_exceptions # type: ignore
+from google.api_core import gapic_v1 # type: ignore
+from google.api_core import retry as retries # type: ignore
+from google.api_core import operations_v1 # type: ignore
+from google.auth import credentials as ga_credentials # type: ignore
+from google.oauth2 import service_account # type: ignore
+
+from google.cloud.shell_v1.types import cloudshell
+from google.longrunning import operations_pb2 # type: ignore
+
+try:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
+ gapic_version=pkg_resources.get_distribution(
+ 'google-cloud-shell',
+ ).version,
+ )
+except pkg_resources.DistributionNotFound:
+ DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
+
+try:
+ # google.auth.__version__ was added in 1.26.0
+ _GOOGLE_AUTH_VERSION = google.auth.__version__
+except AttributeError:
+ try: # try pkg_resources if it is available
+ _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version
+ except pkg_resources.DistributionNotFound: # pragma: NO COVER
+ _GOOGLE_AUTH_VERSION = None
+
+
+class CloudShellServiceTransport(abc.ABC):
+ """Abstract transport class for CloudShellService."""
+
+ AUTH_SCOPES = (
+ 'https://www.googleapis.com/auth/cloud-platform',
+ )
+
+ DEFAULT_HOST: str = 'cloudshell.googleapis.com'
+ def __init__(
+ self, *,
+ host: str = DEFAULT_HOST,
+ credentials: ga_credentials.Credentials = None,
+ credentials_file: Optional[str] = None,
+ scopes: Optional[Sequence[str]] = None,
+ quota_project_id: Optional[str] = None,
+ client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
+ **kwargs,
+ ) -> None:
+ """Instantiate the transport.
+
+ Args:
+ host (Optional[str]):
+ The hostname to connect to.
+ credentials (Optional[google.auth.credentials.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify the application to the service; if none
+ are specified, the client will attempt to ascertain the
+ credentials from the environment.
+ credentials_file (Optional[str]): A file with credentials that can
+ be loaded with :func:`google.auth.load_credentials_from_file`.
+ This argument is mutually exclusive with credentials.
+ scopes (Optional[Sequence[str]]): A list of scopes.
+ quota_project_id (Optional[str]): An optional project to use for billing
+ and quota.
+ client_info (google.api_core.gapic_v1.client_info.ClientInfo):
+ The client info used to send a user-agent string along with
+ API requests. If ``None``, then default info will be used.
+ Generally, you only need to set this if you're developing
+ your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
+ """
+ # Save the hostname. Default to port 443 (HTTPS) if none is specified.
+ if ':' not in host:
+ host += ':443'
+ self._host = host
+
+ scopes_kwargs = self._get_scopes_kwargs(self._host, scopes)
+
+ # Save the scopes.
+ self._scopes = scopes
+
+ # If no credentials are provided, then determine the appropriate
+ # defaults.
+ if credentials and credentials_file:
+ raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive")
+
+ if credentials_file is not None:
+ credentials, _ = google.auth.load_credentials_from_file(
+ credentials_file,
+ **scopes_kwargs,
+ quota_project_id=quota_project_id
+ )
+
+ elif credentials is None:
+ credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id)
+
+ # If the credentials is service account credentials, then always try to use self signed JWT.
+ if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"):
+ credentials = credentials.with_always_use_jwt_access(True)
+
+ # Save the credentials.
+ self._credentials = credentials
+
+ # TODO(busunkim): This method is in the base transport
+ # to avoid duplicating code across the transport classes. These functions
+ # should be deleted once the minimum required versions of google-auth is increased.
+
+ # TODO: Remove this function once google-auth >= 1.25.0 is required
+ @classmethod
+ def _get_scopes_kwargs(cls, host: str, scopes: Optional[Sequence[str]]) -> Dict[str, Optional[Sequence[str]]]:
+ """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version"""
+
+ scopes_kwargs = {}
+
+ if _GOOGLE_AUTH_VERSION and (
+ packaging.version.parse(_GOOGLE_AUTH_VERSION)
+ >= packaging.version.parse("1.25.0")
+ ):
+ scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES}
+ else:
+ scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES}
+
+ return scopes_kwargs
+
+ def _prep_wrapped_messages(self, client_info):
+ # Precompute the wrapped methods.
+ self._wrapped_methods = {
+ self.get_environment: gapic_v1.method.wrap_method(
+ self.get_environment,
+ default_retry=retries.Retry(
+initial=1.0,maximum=60.0,multiplier=1.3, predicate=retries.if_exception_type(
+ core_exceptions.ServiceUnavailable,
+ core_exceptions.Unknown,
+ ),
+ deadline=60.0,
+ ),
+ default_timeout=60.0,
+ client_info=client_info,
+ ),
+ self.start_environment: gapic_v1.method.wrap_method(
+ self.start_environment,
+ default_timeout=60.0,
+ client_info=client_info,
+ ),
+ self.authorize_environment: gapic_v1.method.wrap_method(
+ self.authorize_environment,
+ default_timeout=60.0,
+ client_info=client_info,
+ ),
+ self.add_public_key: gapic_v1.method.wrap_method(
+ self.add_public_key,
+ default_timeout=60.0,
+ client_info=client_info,
+ ),
+ self.remove_public_key: gapic_v1.method.wrap_method(
+ self.remove_public_key,
+ default_timeout=60.0,
+ client_info=client_info,
+ ),
+ }
+
+ @property
+ def operations_client(self) -> operations_v1.OperationsClient:
+ """Return the client designed to process long-running operations."""
+ raise NotImplementedError()
+
+ @property
+ def get_environment(self) -> Callable[
+ [cloudshell.GetEnvironmentRequest],
+ Union[
+ cloudshell.Environment,
+ Awaitable[cloudshell.Environment]
+ ]]:
+ raise NotImplementedError()
+
+ @property
+ def start_environment(self) -> Callable[
+ [cloudshell.StartEnvironmentRequest],
+ Union[
+ operations_pb2.Operation,
+ Awaitable[operations_pb2.Operation]
+ ]]:
+ raise NotImplementedError()
+
+ @property
+ def authorize_environment(self) -> Callable[
+ [cloudshell.AuthorizeEnvironmentRequest],
+ Union[
+ operations_pb2.Operation,
+ Awaitable[operations_pb2.Operation]
+ ]]:
+ raise NotImplementedError()
+
+ @property
+ def add_public_key(self) -> Callable[
+ [cloudshell.AddPublicKeyRequest],
+ Union[
+ operations_pb2.Operation,
+ Awaitable[operations_pb2.Operation]
+ ]]:
+ raise NotImplementedError()
+
+ @property
+ def remove_public_key(self) -> Callable[
+ [cloudshell.RemovePublicKeyRequest],
+ Union[
+ operations_pb2.Operation,
+ Awaitable[operations_pb2.Operation]
+ ]]:
+ raise NotImplementedError()
+
+
+__all__ = (
+ 'CloudShellServiceTransport',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
new file mode 100644
index 0000000..3336a16
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
@@ -0,0 +1,400 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 warnings
+from typing import Callable, Dict, Optional, Sequence, Tuple, Union
+
+from google.api_core import grpc_helpers # type: ignore
+from google.api_core import operations_v1 # type: ignore
+from google.api_core import gapic_v1 # type: ignore
+import google.auth # type: ignore
+from google.auth import credentials as ga_credentials # type: ignore
+from google.auth.transport.grpc import SslCredentials # type: ignore
+
+import grpc # type: ignore
+
+from google.cloud.shell_v1.types import cloudshell
+from google.longrunning import operations_pb2 # type: ignore
+from .base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
+
+
+class CloudShellServiceGrpcTransport(CloudShellServiceTransport):
+ """gRPC backend transport for CloudShellService.
+
+ API for interacting with Google Cloud Shell. Each user of
+ Cloud Shell has at least one environment, which has the ID
+ "default". Environment consists of a Docker image defining what
+ is installed on the environment and a home directory containing
+ the user's data that will remain across sessions. Clients use
+ this API to start and fetch information about their environment,
+ which can then be used to connect to that environment via a
+ separate SSH client.
+
+ This class defines the same methods as the primary client, so the
+ primary client can load the underlying transport implementation
+ and call it.
+
+ It sends protocol buffers over the wire using gRPC (which is built on
+ top of HTTP/2); the ``grpcio`` package must be installed.
+ """
+ _stubs: Dict[str, Callable]
+
+ def __init__(self, *,
+ host: str = 'cloudshell.googleapis.com',
+ credentials: ga_credentials.Credentials = None,
+ credentials_file: str = None,
+ scopes: Sequence[str] = None,
+ channel: grpc.Channel = None,
+ api_mtls_endpoint: str = None,
+ client_cert_source: Callable[[], Tuple[bytes, bytes]] = None,
+ ssl_channel_credentials: grpc.ChannelCredentials = None,
+ client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
+ quota_project_id: Optional[str] = None,
+ client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
+ ) -> None:
+ """Instantiate the transport.
+
+ Args:
+ host (Optional[str]):
+ The hostname to connect to.
+ credentials (Optional[google.auth.credentials.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify the application to the service; if none
+ are specified, the client will attempt to ascertain the
+ credentials from the environment.
+ This argument is ignored if ``channel`` is provided.
+ credentials_file (Optional[str]): A file with credentials that can
+ be loaded with :func:`google.auth.load_credentials_from_file`.
+ This argument is ignored if ``channel`` is provided.
+ scopes (Optional(Sequence[str])): A list of scopes. This argument is
+ ignored if ``channel`` is provided.
+ channel (Optional[grpc.Channel]): A ``Channel`` instance through
+ which to make calls.
+ api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint.
+ If provided, it overrides the ``host`` argument and tries to create
+ a mutual TLS channel with client SSL credentials from
+ ``client_cert_source`` or applicatin default SSL credentials.
+ client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]):
+ Deprecated. A callback to provide client SSL certificate bytes and
+ private key bytes, both in PEM format. It is ignored if
+ ``api_mtls_endpoint`` is None.
+ ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials
+ for grpc channel. It is ignored if ``channel`` is provided.
+ client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]):
+ A callback to provide client certificate bytes and private key bytes,
+ both in PEM format. It is used to configure mutual TLS channel. It is
+ ignored if ``channel`` or ``ssl_channel_credentials`` is provided.
+ quota_project_id (Optional[str]): An optional project to use for billing
+ and quota.
+ client_info (google.api_core.gapic_v1.client_info.ClientInfo):
+ The client info used to send a user-agent string along with
+ API requests. If ``None``, then default info will be used.
+ Generally, you only need to set this if you're developing
+ your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
+
+ Raises:
+ google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport
+ creation failed for any reason.
+ google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
+ and ``credentials_file`` are passed.
+ """
+ self._grpc_channel = None
+ self._ssl_channel_credentials = ssl_channel_credentials
+ self._stubs: Dict[str, Callable] = {}
+ self._operations_client = None
+
+ if api_mtls_endpoint:
+ warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning)
+ if client_cert_source:
+ warnings.warn("client_cert_source is deprecated", DeprecationWarning)
+
+ if channel:
+ # Ignore credentials if a channel was passed.
+ credentials = False
+ # If a channel was explicitly provided, set it.
+ self._grpc_channel = channel
+ self._ssl_channel_credentials = None
+
+ else:
+ if api_mtls_endpoint:
+ host = api_mtls_endpoint
+
+ # Create SSL credentials with client_cert_source or application
+ # default SSL credentials.
+ if client_cert_source:
+ cert, key = client_cert_source()
+ self._ssl_channel_credentials = grpc.ssl_channel_credentials(
+ certificate_chain=cert, private_key=key
+ )
+ else:
+ self._ssl_channel_credentials = SslCredentials().ssl_credentials
+
+ else:
+ if client_cert_source_for_mtls and not ssl_channel_credentials:
+ cert, key = client_cert_source_for_mtls()
+ self._ssl_channel_credentials = grpc.ssl_channel_credentials(
+ certificate_chain=cert, private_key=key
+ )
+
+ # The base transport sets the host, credentials and scopes
+ super().__init__(
+ host=host,
+ credentials=credentials,
+ credentials_file=credentials_file,
+ scopes=scopes,
+ quota_project_id=quota_project_id,
+ client_info=client_info,
+ always_use_jwt_access=always_use_jwt_access,
+ )
+
+ if not self._grpc_channel:
+ self._grpc_channel = type(self).create_channel(
+ self._host,
+ credentials=self._credentials,
+ credentials_file=credentials_file,
+ scopes=self._scopes,
+ ssl_credentials=self._ssl_channel_credentials,
+ quota_project_id=quota_project_id,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+
+ # Wrap messages. This must be done after self._grpc_channel exists
+ self._prep_wrapped_messages(client_info)
+
+ @classmethod
+ def create_channel(cls,
+ host: str = 'cloudshell.googleapis.com',
+ credentials: ga_credentials.Credentials = None,
+ credentials_file: str = None,
+ scopes: Optional[Sequence[str]] = None,
+ quota_project_id: Optional[str] = None,
+ **kwargs) -> grpc.Channel:
+ """Create and return a gRPC channel object.
+ Args:
+ host (Optional[str]): The host for the channel to use.
+ credentials (Optional[~.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify this application to the service. If
+ none are specified, the client will attempt to ascertain
+ the credentials from the environment.
+ credentials_file (Optional[str]): A file with credentials that can
+ be loaded with :func:`google.auth.load_credentials_from_file`.
+ This argument is mutually exclusive with credentials.
+ scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
+ service. These are only used when credentials are not specified and
+ are passed to :func:`google.auth.default`.
+ quota_project_id (Optional[str]): An optional project to use for billing
+ and quota.
+ kwargs (Optional[dict]): Keyword arguments, which are passed to the
+ channel creation.
+ Returns:
+ grpc.Channel: A gRPC channel object.
+
+ Raises:
+ google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
+ and ``credentials_file`` are passed.
+ """
+
+ return grpc_helpers.create_channel(
+ host,
+ credentials=credentials,
+ credentials_file=credentials_file,
+ quota_project_id=quota_project_id,
+ default_scopes=cls.AUTH_SCOPES,
+ scopes=scopes,
+ default_host=cls.DEFAULT_HOST,
+ **kwargs
+ )
+
+ @property
+ def grpc_channel(self) -> grpc.Channel:
+ """Return the channel designed to connect to this service.
+ """
+ return self._grpc_channel
+
+ @property
+ def operations_client(self) -> operations_v1.OperationsClient:
+ """Create the client designed to process long-running operations.
+
+ This property caches on the instance; repeated calls return the same
+ client.
+ """
+ # Sanity check: Only create a new client if we do not already have one.
+ if self._operations_client is None:
+ self._operations_client = operations_v1.OperationsClient(
+ self.grpc_channel
+ )
+
+ # Return the client from cache.
+ return self._operations_client
+
+ @property
+ def get_environment(self) -> Callable[
+ [cloudshell.GetEnvironmentRequest],
+ cloudshell.Environment]:
+ r"""Return a callable for the get environment method over gRPC.
+
+ Gets an environment. Returns NOT_FOUND if the environment does
+ not exist.
+
+ Returns:
+ Callable[[~.GetEnvironmentRequest],
+ ~.Environment]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'get_environment' not in self._stubs:
+ self._stubs['get_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/GetEnvironment',
+ request_serializer=cloudshell.GetEnvironmentRequest.serialize,
+ response_deserializer=cloudshell.Environment.deserialize,
+ )
+ return self._stubs['get_environment']
+
+ @property
+ def start_environment(self) -> Callable[
+ [cloudshell.StartEnvironmentRequest],
+ operations_pb2.Operation]:
+ r"""Return a callable for the start environment method over gRPC.
+
+ Starts an existing environment, allowing clients to
+ connect to it. The returned operation will contain an
+ instance of StartEnvironmentMetadata in its metadata
+ field. Users can wait for the environment to start by
+ polling this operation via GetOperation. Once the
+ environment has finished starting and is ready to accept
+ connections, the operation will contain a
+ StartEnvironmentResponse in its response field.
+
+ Returns:
+ Callable[[~.StartEnvironmentRequest],
+ ~.Operation]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'start_environment' not in self._stubs:
+ self._stubs['start_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/StartEnvironment',
+ request_serializer=cloudshell.StartEnvironmentRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['start_environment']
+
+ @property
+ def authorize_environment(self) -> Callable[
+ [cloudshell.AuthorizeEnvironmentRequest],
+ operations_pb2.Operation]:
+ r"""Return a callable for the authorize environment method over gRPC.
+
+ Sends OAuth credentials to a running environment on
+ behalf of a user. When this completes, the environment
+ will be authorized to run various Google Cloud command
+ line tools without requiring the user to manually
+ authenticate.
+
+ Returns:
+ Callable[[~.AuthorizeEnvironmentRequest],
+ ~.Operation]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'authorize_environment' not in self._stubs:
+ self._stubs['authorize_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/AuthorizeEnvironment',
+ request_serializer=cloudshell.AuthorizeEnvironmentRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['authorize_environment']
+
+ @property
+ def add_public_key(self) -> Callable[
+ [cloudshell.AddPublicKeyRequest],
+ operations_pb2.Operation]:
+ r"""Return a callable for the add public key method over gRPC.
+
+ Adds a public SSH key to an environment, allowing clients with
+ the corresponding private key to connect to that environment via
+ SSH. If a key with the same content already exists, this will
+ error with ALREADY_EXISTS.
+
+ Returns:
+ Callable[[~.AddPublicKeyRequest],
+ ~.Operation]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'add_public_key' not in self._stubs:
+ self._stubs['add_public_key'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/AddPublicKey',
+ request_serializer=cloudshell.AddPublicKeyRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['add_public_key']
+
+ @property
+ def remove_public_key(self) -> Callable[
+ [cloudshell.RemovePublicKeyRequest],
+ operations_pb2.Operation]:
+ r"""Return a callable for the remove public key method over gRPC.
+
+ Removes a public SSH key from an environment. Clients will no
+ longer be able to connect to the environment using the
+ corresponding private key. If a key with the same content is not
+ present, this will error with NOT_FOUND.
+
+ Returns:
+ Callable[[~.RemovePublicKeyRequest],
+ ~.Operation]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'remove_public_key' not in self._stubs:
+ self._stubs['remove_public_key'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/RemovePublicKey',
+ request_serializer=cloudshell.RemovePublicKeyRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['remove_public_key']
+
+
+__all__ = (
+ 'CloudShellServiceGrpcTransport',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
new file mode 100644
index 0000000..400db2b
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
@@ -0,0 +1,404 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 warnings
+from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union
+
+from google.api_core import gapic_v1 # type: ignore
+from google.api_core import grpc_helpers_async # type: ignore
+from google.api_core import operations_v1 # type: ignore
+from google.auth import credentials as ga_credentials # type: ignore
+from google.auth.transport.grpc import SslCredentials # type: ignore
+import packaging.version
+
+import grpc # type: ignore
+from grpc.experimental import aio # type: ignore
+
+from google.cloud.shell_v1.types import cloudshell
+from google.longrunning import operations_pb2 # type: ignore
+from .base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
+from .grpc import CloudShellServiceGrpcTransport
+
+
+class CloudShellServiceGrpcAsyncIOTransport(CloudShellServiceTransport):
+ """gRPC AsyncIO backend transport for CloudShellService.
+
+ API for interacting with Google Cloud Shell. Each user of
+ Cloud Shell has at least one environment, which has the ID
+ "default". Environment consists of a Docker image defining what
+ is installed on the environment and a home directory containing
+ the user's data that will remain across sessions. Clients use
+ this API to start and fetch information about their environment,
+ which can then be used to connect to that environment via a
+ separate SSH client.
+
+ This class defines the same methods as the primary client, so the
+ primary client can load the underlying transport implementation
+ and call it.
+
+ It sends protocol buffers over the wire using gRPC (which is built on
+ top of HTTP/2); the ``grpcio`` package must be installed.
+ """
+
+ _grpc_channel: aio.Channel
+ _stubs: Dict[str, Callable] = {}
+
+ @classmethod
+ def create_channel(cls,
+ host: str = 'cloudshell.googleapis.com',
+ credentials: ga_credentials.Credentials = None,
+ credentials_file: Optional[str] = None,
+ scopes: Optional[Sequence[str]] = None,
+ quota_project_id: Optional[str] = None,
+ **kwargs) -> aio.Channel:
+ """Create and return a gRPC AsyncIO channel object.
+ Args:
+ host (Optional[str]): The host for the channel to use.
+ credentials (Optional[~.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify this application to the service. If
+ none are specified, the client will attempt to ascertain
+ the credentials from the environment.
+ credentials_file (Optional[str]): A file with credentials that can
+ be loaded with :func:`google.auth.load_credentials_from_file`.
+ This argument is ignored if ``channel`` is provided.
+ scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
+ service. These are only used when credentials are not specified and
+ are passed to :func:`google.auth.default`.
+ quota_project_id (Optional[str]): An optional project to use for billing
+ and quota.
+ kwargs (Optional[dict]): Keyword arguments, which are passed to the
+ channel creation.
+ Returns:
+ aio.Channel: A gRPC AsyncIO channel object.
+ """
+
+ return grpc_helpers_async.create_channel(
+ host,
+ credentials=credentials,
+ credentials_file=credentials_file,
+ quota_project_id=quota_project_id,
+ default_scopes=cls.AUTH_SCOPES,
+ scopes=scopes,
+ default_host=cls.DEFAULT_HOST,
+ **kwargs
+ )
+
+ def __init__(self, *,
+ host: str = 'cloudshell.googleapis.com',
+ credentials: ga_credentials.Credentials = None,
+ credentials_file: Optional[str] = None,
+ scopes: Optional[Sequence[str]] = None,
+ channel: aio.Channel = None,
+ api_mtls_endpoint: str = None,
+ client_cert_source: Callable[[], Tuple[bytes, bytes]] = None,
+ ssl_channel_credentials: grpc.ChannelCredentials = None,
+ client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
+ quota_project_id=None,
+ client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
+ ) -> None:
+ """Instantiate the transport.
+
+ Args:
+ host (Optional[str]):
+ The hostname to connect to.
+ credentials (Optional[google.auth.credentials.Credentials]): The
+ authorization credentials to attach to requests. These
+ credentials identify the application to the service; if none
+ are specified, the client will attempt to ascertain the
+ credentials from the environment.
+ This argument is ignored if ``channel`` is provided.
+ credentials_file (Optional[str]): A file with credentials that can
+ be loaded with :func:`google.auth.load_credentials_from_file`.
+ This argument is ignored if ``channel`` is provided.
+ scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
+ service. These are only used when credentials are not specified and
+ are passed to :func:`google.auth.default`.
+ channel (Optional[aio.Channel]): A ``Channel`` instance through
+ which to make calls.
+ api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint.
+ If provided, it overrides the ``host`` argument and tries to create
+ a mutual TLS channel with client SSL credentials from
+ ``client_cert_source`` or applicatin default SSL credentials.
+ client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]):
+ Deprecated. A callback to provide client SSL certificate bytes and
+ private key bytes, both in PEM format. It is ignored if
+ ``api_mtls_endpoint`` is None.
+ ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials
+ for grpc channel. It is ignored if ``channel`` is provided.
+ client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]):
+ A callback to provide client certificate bytes and private key bytes,
+ both in PEM format. It is used to configure mutual TLS channel. It is
+ ignored if ``channel`` or ``ssl_channel_credentials`` is provided.
+ quota_project_id (Optional[str]): An optional project to use for billing
+ and quota.
+ client_info (google.api_core.gapic_v1.client_info.ClientInfo):
+ The client info used to send a user-agent string along with
+ API requests. If ``None``, then default info will be used.
+ Generally, you only need to set this if you're developing
+ your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
+
+ Raises:
+ google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport
+ creation failed for any reason.
+ google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
+ and ``credentials_file`` are passed.
+ """
+ self._grpc_channel = None
+ self._ssl_channel_credentials = ssl_channel_credentials
+ self._stubs: Dict[str, Callable] = {}
+ self._operations_client = None
+
+ if api_mtls_endpoint:
+ warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning)
+ if client_cert_source:
+ warnings.warn("client_cert_source is deprecated", DeprecationWarning)
+
+ if channel:
+ # Ignore credentials if a channel was passed.
+ credentials = False
+ # If a channel was explicitly provided, set it.
+ self._grpc_channel = channel
+ self._ssl_channel_credentials = None
+ else:
+ if api_mtls_endpoint:
+ host = api_mtls_endpoint
+
+ # Create SSL credentials with client_cert_source or application
+ # default SSL credentials.
+ if client_cert_source:
+ cert, key = client_cert_source()
+ self._ssl_channel_credentials = grpc.ssl_channel_credentials(
+ certificate_chain=cert, private_key=key
+ )
+ else:
+ self._ssl_channel_credentials = SslCredentials().ssl_credentials
+
+ else:
+ if client_cert_source_for_mtls and not ssl_channel_credentials:
+ cert, key = client_cert_source_for_mtls()
+ self._ssl_channel_credentials = grpc.ssl_channel_credentials(
+ certificate_chain=cert, private_key=key
+ )
+
+ # The base transport sets the host, credentials and scopes
+ super().__init__(
+ host=host,
+ credentials=credentials,
+ credentials_file=credentials_file,
+ scopes=scopes,
+ quota_project_id=quota_project_id,
+ client_info=client_info,
+ always_use_jwt_access=always_use_jwt_access,
+ )
+
+ if not self._grpc_channel:
+ self._grpc_channel = type(self).create_channel(
+ self._host,
+ credentials=self._credentials,
+ credentials_file=credentials_file,
+ scopes=self._scopes,
+ ssl_credentials=self._ssl_channel_credentials,
+ quota_project_id=quota_project_id,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+
+ # Wrap messages. This must be done after self._grpc_channel exists
+ self._prep_wrapped_messages(client_info)
+
+ @property
+ def grpc_channel(self) -> aio.Channel:
+ """Create the channel designed to connect to this service.
+
+ This property caches on the instance; repeated calls return
+ the same channel.
+ """
+ # Return the channel from cache.
+ return self._grpc_channel
+
+ @property
+ def operations_client(self) -> operations_v1.OperationsAsyncClient:
+ """Create the client designed to process long-running operations.
+
+ This property caches on the instance; repeated calls return the same
+ client.
+ """
+ # Sanity check: Only create a new client if we do not already have one.
+ if self._operations_client is None:
+ self._operations_client = operations_v1.OperationsAsyncClient(
+ self.grpc_channel
+ )
+
+ # Return the client from cache.
+ return self._operations_client
+
+ @property
+ def get_environment(self) -> Callable[
+ [cloudshell.GetEnvironmentRequest],
+ Awaitable[cloudshell.Environment]]:
+ r"""Return a callable for the get environment method over gRPC.
+
+ Gets an environment. Returns NOT_FOUND if the environment does
+ not exist.
+
+ Returns:
+ Callable[[~.GetEnvironmentRequest],
+ Awaitable[~.Environment]]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'get_environment' not in self._stubs:
+ self._stubs['get_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/GetEnvironment',
+ request_serializer=cloudshell.GetEnvironmentRequest.serialize,
+ response_deserializer=cloudshell.Environment.deserialize,
+ )
+ return self._stubs['get_environment']
+
+ @property
+ def start_environment(self) -> Callable[
+ [cloudshell.StartEnvironmentRequest],
+ Awaitable[operations_pb2.Operation]]:
+ r"""Return a callable for the start environment method over gRPC.
+
+ Starts an existing environment, allowing clients to
+ connect to it. The returned operation will contain an
+ instance of StartEnvironmentMetadata in its metadata
+ field. Users can wait for the environment to start by
+ polling this operation via GetOperation. Once the
+ environment has finished starting and is ready to accept
+ connections, the operation will contain a
+ StartEnvironmentResponse in its response field.
+
+ Returns:
+ Callable[[~.StartEnvironmentRequest],
+ Awaitable[~.Operation]]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'start_environment' not in self._stubs:
+ self._stubs['start_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/StartEnvironment',
+ request_serializer=cloudshell.StartEnvironmentRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['start_environment']
+
+ @property
+ def authorize_environment(self) -> Callable[
+ [cloudshell.AuthorizeEnvironmentRequest],
+ Awaitable[operations_pb2.Operation]]:
+ r"""Return a callable for the authorize environment method over gRPC.
+
+ Sends OAuth credentials to a running environment on
+ behalf of a user. When this completes, the environment
+ will be authorized to run various Google Cloud command
+ line tools without requiring the user to manually
+ authenticate.
+
+ Returns:
+ Callable[[~.AuthorizeEnvironmentRequest],
+ Awaitable[~.Operation]]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'authorize_environment' not in self._stubs:
+ self._stubs['authorize_environment'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/AuthorizeEnvironment',
+ request_serializer=cloudshell.AuthorizeEnvironmentRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['authorize_environment']
+
+ @property
+ def add_public_key(self) -> Callable[
+ [cloudshell.AddPublicKeyRequest],
+ Awaitable[operations_pb2.Operation]]:
+ r"""Return a callable for the add public key method over gRPC.
+
+ Adds a public SSH key to an environment, allowing clients with
+ the corresponding private key to connect to that environment via
+ SSH. If a key with the same content already exists, this will
+ error with ALREADY_EXISTS.
+
+ Returns:
+ Callable[[~.AddPublicKeyRequest],
+ Awaitable[~.Operation]]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'add_public_key' not in self._stubs:
+ self._stubs['add_public_key'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/AddPublicKey',
+ request_serializer=cloudshell.AddPublicKeyRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['add_public_key']
+
+ @property
+ def remove_public_key(self) -> Callable[
+ [cloudshell.RemovePublicKeyRequest],
+ Awaitable[operations_pb2.Operation]]:
+ r"""Return a callable for the remove public key method over gRPC.
+
+ Removes a public SSH key from an environment. Clients will no
+ longer be able to connect to the environment using the
+ corresponding private key. If a key with the same content is not
+ present, this will error with NOT_FOUND.
+
+ Returns:
+ Callable[[~.RemovePublicKeyRequest],
+ Awaitable[~.Operation]]:
+ A function that, when called, will call the underlying RPC
+ on the server.
+ """
+ # Generate a "stub function" on-the-fly which will actually make
+ # the request.
+ # gRPC handles serialization and deserialization, so we just need
+ # to pass in the functions for each.
+ if 'remove_public_key' not in self._stubs:
+ self._stubs['remove_public_key'] = self.grpc_channel.unary_unary(
+ '/google.cloud.shell.v1.CloudShellService/RemovePublicKey',
+ request_serializer=cloudshell.RemovePublicKeyRequest.serialize,
+ response_deserializer=operations_pb2.Operation.FromString,
+ )
+ return self._stubs['remove_public_key']
+
+
+__all__ = (
+ 'CloudShellServiceGrpcAsyncIOTransport',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
new file mode 100644
index 0000000..1ed9f35
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 .cloudshell import (
+ AddPublicKeyMetadata,
+ AddPublicKeyRequest,
+ AddPublicKeyResponse,
+ AuthorizeEnvironmentMetadata,
+ AuthorizeEnvironmentRequest,
+ AuthorizeEnvironmentResponse,
+ CloudShellErrorDetails,
+ CreateEnvironmentMetadata,
+ DeleteEnvironmentMetadata,
+ Environment,
+ GetEnvironmentRequest,
+ RemovePublicKeyMetadata,
+ RemovePublicKeyRequest,
+ RemovePublicKeyResponse,
+ StartEnvironmentMetadata,
+ StartEnvironmentRequest,
+ StartEnvironmentResponse,
+)
+
+__all__ = (
+ 'AddPublicKeyMetadata',
+ 'AddPublicKeyRequest',
+ 'AddPublicKeyResponse',
+ 'AuthorizeEnvironmentMetadata',
+ 'AuthorizeEnvironmentRequest',
+ 'AuthorizeEnvironmentResponse',
+ 'CloudShellErrorDetails',
+ 'CreateEnvironmentMetadata',
+ 'DeleteEnvironmentMetadata',
+ 'Environment',
+ 'GetEnvironmentRequest',
+ 'RemovePublicKeyMetadata',
+ 'RemovePublicKeyRequest',
+ 'RemovePublicKeyResponse',
+ 'StartEnvironmentMetadata',
+ 'StartEnvironmentRequest',
+ 'StartEnvironmentResponse',
+)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py b/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
new file mode 100644
index 0000000..cdaa562
--- /dev/null
+++ b/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
@@ -0,0 +1,413 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 proto # type: ignore
+
+from google.protobuf import timestamp_pb2 # type: ignore
+
+
+__protobuf__ = proto.module(
+ package='google.cloud.shell.v1',
+ manifest={
+ 'Environment',
+ 'GetEnvironmentRequest',
+ 'CreateEnvironmentMetadata',
+ 'DeleteEnvironmentMetadata',
+ 'StartEnvironmentRequest',
+ 'AuthorizeEnvironmentRequest',
+ 'AuthorizeEnvironmentResponse',
+ 'AuthorizeEnvironmentMetadata',
+ 'StartEnvironmentMetadata',
+ 'StartEnvironmentResponse',
+ 'AddPublicKeyRequest',
+ 'AddPublicKeyResponse',
+ 'AddPublicKeyMetadata',
+ 'RemovePublicKeyRequest',
+ 'RemovePublicKeyResponse',
+ 'RemovePublicKeyMetadata',
+ 'CloudShellErrorDetails',
+ },
+)
+
+
+class Environment(proto.Message):
+ r"""A Cloud Shell environment, which is defined as the
+ combination of a Docker image specifying what is installed on
+ the environment and a home directory containing the user's data
+ that will remain across sessions. Each user has at least an
+ environment with the ID "default".
+
+ Attributes:
+ name (str):
+ Immutable. Full name of this resource, in the format
+ ``users/{owner_email}/environments/{environment_id}``.
+ ``{owner_email}`` is the email address of the user to whom
+ this environment belongs, and ``{environment_id}`` is the
+ identifier of this environment. For example,
+ ``users/someone@example.com/environments/default``.
+ id (str):
+ Output only. The environment's identifier,
+ unique among the user's environments.
+ docker_image (str):
+ Required. Immutable. Full path to the Docker
+ image used to run this environment, e.g.
+ "gcr.io/dev-con/cloud-devshell:latest".
+ state (google.cloud.shell_v1.types.Environment.State):
+ Output only. Current execution state of this
+ environment.
+ web_host (str):
+ Output only. Host to which clients can
+ connect to initiate HTTPS or WSS connections
+ with the environment.
+ ssh_username (str):
+ Output only. Username that clients should use
+ when initiating SSH sessions with the
+ environment.
+ ssh_host (str):
+ Output only. Host to which clients can
+ connect to initiate SSH sessions with the
+ environment.
+ ssh_port (int):
+ Output only. Port to which clients can
+ connect to initiate SSH sessions with the
+ environment.
+ public_keys (Sequence[str]):
+ Output only. Public keys associated with the
+ environment. Clients can connect to this
+ environment via SSH only if they possess a
+ private key corresponding to at least one of
+ these public keys. Keys can be added to or
+ removed from the environment using the
+ AddPublicKey and RemovePublicKey methods.
+ """
+ class State(proto.Enum):
+ r"""Possible execution states for an environment."""
+ STATE_UNSPECIFIED = 0
+ SUSPENDED = 1
+ PENDING = 2
+ RUNNING = 3
+ DELETING = 4
+
+ name = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+ id = proto.Field(
+ proto.STRING,
+ number=2,
+ )
+ docker_image = proto.Field(
+ proto.STRING,
+ number=3,
+ )
+ state = proto.Field(
+ proto.ENUM,
+ number=4,
+ enum=State,
+ )
+ web_host = proto.Field(
+ proto.STRING,
+ number=12,
+ )
+ ssh_username = proto.Field(
+ proto.STRING,
+ number=5,
+ )
+ ssh_host = proto.Field(
+ proto.STRING,
+ number=6,
+ )
+ ssh_port = proto.Field(
+ proto.INT32,
+ number=7,
+ )
+ public_keys = proto.RepeatedField(
+ proto.STRING,
+ number=8,
+ )
+
+
+class GetEnvironmentRequest(proto.Message):
+ r"""Request message for
+ [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
+
+ Attributes:
+ name (str):
+ Required. Name of the requested resource, for example
+ ``users/me/environments/default`` or
+ ``users/someone@example.com/environments/default``.
+ """
+
+ name = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+
+
+class CreateEnvironmentMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [CreateEnvironment][google.cloud.shell.v1.CloudShellService.CreateEnvironment].
+ """
+
+
+class DeleteEnvironmentMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [DeleteEnvironment][google.cloud.shell.v1.CloudShellService.DeleteEnvironment].
+ """
+
+
+class StartEnvironmentRequest(proto.Message):
+ r"""Request message for
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
+
+ Attributes:
+ name (str):
+ Name of the resource that should be started, for example
+ ``users/me/environments/default`` or
+ ``users/someone@example.com/environments/default``.
+ access_token (str):
+ The initial access token passed to the
+ environment. If this is present and valid, the
+ environment will be pre-authenticated with
+ gcloud so that the user can run gcloud commands
+ in Cloud Shell without having to log in. This
+ code can be updated later by calling
+ AuthorizeEnvironment.
+ public_keys (Sequence[str]):
+ Public keys that should be added to the
+ environment before it is started.
+ """
+
+ name = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+ access_token = proto.Field(
+ proto.STRING,
+ number=2,
+ )
+ public_keys = proto.RepeatedField(
+ proto.STRING,
+ number=3,
+ )
+
+
+class AuthorizeEnvironmentRequest(proto.Message):
+ r"""Request message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+
+ Attributes:
+ name (str):
+ Name of the resource that should receive the credentials,
+ for example ``users/me/environments/default`` or
+ ``users/someone@example.com/environments/default``.
+ access_token (str):
+ The OAuth access token that should be sent to
+ the environment.
+ id_token (str):
+ The OAuth ID token that should be sent to the
+ environment.
+ expire_time (google.protobuf.timestamp_pb2.Timestamp):
+ The time when the credentials expire. If not
+ set, defaults to one hour from when the server
+ received the request.
+ """
+
+ name = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+ access_token = proto.Field(
+ proto.STRING,
+ number=2,
+ )
+ id_token = proto.Field(
+ proto.STRING,
+ number=4,
+ )
+ expire_time = proto.Field(
+ proto.MESSAGE,
+ number=3,
+ message=timestamp_pb2.Timestamp,
+ )
+
+
+class AuthorizeEnvironmentResponse(proto.Message):
+ r"""Response message for
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+ """
+
+
+class AuthorizeEnvironmentMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
+ """
+
+
+class StartEnvironmentMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
+
+ Attributes:
+ state (google.cloud.shell_v1.types.StartEnvironmentMetadata.State):
+ Current state of the environment being
+ started.
+ """
+ class State(proto.Enum):
+ r"""Possible states an environment might transition between
+ during startup. These states are not normally actionable by
+ clients, but may be used to show a progress message to the user.
+ An environment won't necessarily go through all of these states
+ when starting. More states are likely to be added in the future.
+ """
+ STATE_UNSPECIFIED = 0
+ STARTING = 1
+ UNARCHIVING_DISK = 2
+ AWAITING_COMPUTE_RESOURCES = 4
+ FINISHED = 3
+
+ state = proto.Field(
+ proto.ENUM,
+ number=1,
+ enum=State,
+ )
+
+
+class StartEnvironmentResponse(proto.Message):
+ r"""Message included in the response field of operations returned from
+ [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
+ once the operation is complete.
+
+ Attributes:
+ environment (google.cloud.shell_v1.types.Environment):
+ Environment that was started.
+ """
+
+ environment = proto.Field(
+ proto.MESSAGE,
+ number=1,
+ message='Environment',
+ )
+
+
+class AddPublicKeyRequest(proto.Message):
+ r"""Request message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+
+ Attributes:
+ environment (str):
+ Environment this key should be added to, e.g.
+ ``users/me/environments/default``.
+ key (str):
+ Key that should be added to the environment. Supported
+ formats are ``ssh-dss`` (see RFC4253), ``ssh-rsa`` (see
+ RFC4253), ``ecdsa-sha2-nistp256`` (see RFC5656),
+ ``ecdsa-sha2-nistp384`` (see RFC5656) and
+ ``ecdsa-sha2-nistp521`` (see RFC5656). It should be
+ structured as , where part is
+ encoded with Base64.
+ """
+
+ environment = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+ key = proto.Field(
+ proto.STRING,
+ number=2,
+ )
+
+
+class AddPublicKeyResponse(proto.Message):
+ r"""Response message for
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+
+ Attributes:
+ key (str):
+ Key that was added to the environment.
+ """
+
+ key = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+
+
+class AddPublicKeyMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
+ """
+
+
+class RemovePublicKeyRequest(proto.Message):
+ r"""Request message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+
+ Attributes:
+ environment (str):
+ Environment this key should be removed from, e.g.
+ ``users/me/environments/default``.
+ key (str):
+ Key that should be removed from the
+ environment.
+ """
+
+ environment = proto.Field(
+ proto.STRING,
+ number=1,
+ )
+ key = proto.Field(
+ proto.STRING,
+ number=2,
+ )
+
+
+class RemovePublicKeyResponse(proto.Message):
+ r"""Response message for
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+ """
+
+
+class RemovePublicKeyMetadata(proto.Message):
+ r"""Message included in the metadata field of operations returned from
+ [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
+ """
+
+
+class CloudShellErrorDetails(proto.Message):
+ r"""Cloud-shell specific information that will be included as
+ details in failure responses.
+
+ Attributes:
+ code (google.cloud.shell_v1.types.CloudShellErrorDetails.CloudShellErrorCode):
+ Code indicating the specific error the
+ occurred.
+ """
+ class CloudShellErrorCode(proto.Enum):
+ r"""Set of possible errors returned from API calls."""
+ CLOUD_SHELL_ERROR_CODE_UNSPECIFIED = 0
+ IMAGE_UNAVAILABLE = 1
+ CLOUD_SHELL_DISABLED = 2
+ TOS_VIOLATION = 4
+ QUOTA_EXCEEDED = 5
+
+ code = proto.Field(
+ proto.ENUM,
+ number=1,
+ enum=CloudShellErrorCode,
+ )
+
+
+__all__ = tuple(sorted(__protobuf__.manifest))
diff --git a/owl-bot-staging/v1/mypy.ini b/owl-bot-staging/v1/mypy.ini
new file mode 100644
index 0000000..4505b48
--- /dev/null
+++ b/owl-bot-staging/v1/mypy.ini
@@ -0,0 +1,3 @@
+[mypy]
+python_version = 3.6
+namespace_packages = True
diff --git a/owl-bot-staging/v1/noxfile.py b/owl-bot-staging/v1/noxfile.py
new file mode 100644
index 0000000..696a092
--- /dev/null
+++ b/owl-bot-staging/v1/noxfile.py
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 pathlib
+import shutil
+import subprocess
+import sys
+
+
+import nox # type: ignore
+
+CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute()
+
+LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt"
+PACKAGE_NAME = subprocess.check_output([sys.executable, "setup.py", "--name"], encoding="utf-8")
+
+
+nox.sessions = [
+ "unit",
+ "cover",
+ "mypy",
+ "check_lower_bounds"
+ # exclude update_lower_bounds from default
+ "docs",
+]
+
+@nox.session(python=['3.6', '3.7', '3.8', '3.9'])
+def unit(session):
+ """Run the unit test suite."""
+
+ session.install('coverage', 'pytest', 'pytest-cov', 'asyncmock', 'pytest-asyncio')
+ session.install('-e', '.')
+
+ session.run(
+ 'py.test',
+ '--quiet',
+ '--cov=google/cloud/shell_v1/',
+ '--cov-config=.coveragerc',
+ '--cov-report=term',
+ '--cov-report=html',
+ os.path.join('tests', 'unit', ''.join(session.posargs))
+ )
+
+
+@nox.session(python='3.7')
+def cover(session):
+ """Run the final coverage report.
+ This outputs the coverage report aggregating coverage from the unit
+ test runs (not system test runs), and then erases coverage data.
+ """
+ session.install("coverage", "pytest-cov")
+ session.run("coverage", "report", "--show-missing", "--fail-under=100")
+
+ session.run("coverage", "erase")
+
+
+@nox.session(python=['3.6', '3.7'])
+def mypy(session):
+ """Run the type checker."""
+ session.install('mypy', 'types-pkg_resources')
+ session.install('.')
+ session.run(
+ 'mypy',
+ '--explicit-package-bases',
+ 'google',
+ )
+
+
+@nox.session
+def update_lower_bounds(session):
+ """Update lower bounds in constraints.txt to match setup.py"""
+ session.install('google-cloud-testutils')
+ session.install('.')
+
+ session.run(
+ 'lower-bound-checker',
+ 'update',
+ '--package-name',
+ PACKAGE_NAME,
+ '--constraints-file',
+ str(LOWER_BOUND_CONSTRAINTS_FILE),
+ )
+
+
+@nox.session
+def check_lower_bounds(session):
+ """Check lower bounds in setup.py are reflected in constraints file"""
+ session.install('google-cloud-testutils')
+ session.install('.')
+
+ session.run(
+ 'lower-bound-checker',
+ 'check',
+ '--package-name',
+ PACKAGE_NAME,
+ '--constraints-file',
+ str(LOWER_BOUND_CONSTRAINTS_FILE),
+ )
+
+@nox.session(python='3.6')
+def docs(session):
+ """Build the docs for this library."""
+
+ session.install("-e", ".")
+ session.install("sphinx<3.0.0", "alabaster", "recommonmark")
+
+ shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True)
+ session.run(
+ "sphinx-build",
+ "-W", # warnings as errors
+ "-T", # show full traceback on exception
+ "-N", # no colors
+ "-b",
+ "html",
+ "-d",
+ os.path.join("docs", "_build", "doctrees", ""),
+ os.path.join("docs", ""),
+ os.path.join("docs", "_build", "html", ""),
+ )
diff --git a/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py b/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
new file mode 100644
index 0000000..c4b2aa4
--- /dev/null
+++ b/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
@@ -0,0 +1,180 @@
+#! /usr/bin/env python3
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 argparse
+import os
+import libcst as cst
+import pathlib
+import sys
+from typing import (Any, Callable, Dict, List, Sequence, Tuple)
+
+
+def partition(
+ predicate: Callable[[Any], bool],
+ iterator: Sequence[Any]
+) -> Tuple[List[Any], List[Any]]:
+ """A stable, out-of-place partition."""
+ results = ([], [])
+
+ for i in iterator:
+ results[int(predicate(i))].append(i)
+
+ # Returns trueList, falseList
+ return results[1], results[0]
+
+
+class shellCallTransformer(cst.CSTTransformer):
+ CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata')
+ METHOD_TO_PARAMS: Dict[str, Tuple[str]] = {
+ 'add_public_key': ('environment', 'key', ),
+ 'authorize_environment': ('name', 'access_token', 'id_token', 'expire_time', ),
+ 'get_environment': ('name', ),
+ 'remove_public_key': ('environment', 'key', ),
+ 'start_environment': ('name', 'access_token', 'public_keys', ),
+ }
+
+ def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode:
+ try:
+ key = original.func.attr.value
+ kword_params = self.METHOD_TO_PARAMS[key]
+ except (AttributeError, KeyError):
+ # Either not a method from the API or too convoluted to be sure.
+ return updated
+
+ # If the existing code is valid, keyword args come after positional args.
+ # Therefore, all positional args must map to the first parameters.
+ args, kwargs = partition(lambda a: not bool(a.keyword), updated.args)
+ if any(k.keyword.value == "request" for k in kwargs):
+ # We've already fixed this file, don't fix it again.
+ return updated
+
+ kwargs, ctrl_kwargs = partition(
+ lambda a: not a.keyword.value in self.CTRL_PARAMS,
+ kwargs
+ )
+
+ args, ctrl_args = args[:len(kword_params)], args[len(kword_params):]
+ ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl))
+ for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS))
+
+ request_arg = cst.Arg(
+ value=cst.Dict([
+ cst.DictElement(
+ cst.SimpleString("'{}'".format(name)),
+cst.Element(value=arg.value)
+ )
+ # Note: the args + kwargs looks silly, but keep in mind that
+ # the control parameters had to be stripped out, and that
+ # those could have been passed positionally or by keyword.
+ for name, arg in zip(kword_params, args + kwargs)]),
+ keyword=cst.Name("request")
+ )
+
+ return updated.with_changes(
+ args=[request_arg] + ctrl_kwargs
+ )
+
+
+def fix_files(
+ in_dir: pathlib.Path,
+ out_dir: pathlib.Path,
+ *,
+ transformer=shellCallTransformer(),
+):
+ """Duplicate the input dir to the output dir, fixing file method calls.
+
+ Preconditions:
+ * in_dir is a real directory
+ * out_dir is a real, empty directory
+ """
+ pyfile_gen = (
+ pathlib.Path(os.path.join(root, f))
+ for root, _, files in os.walk(in_dir)
+ for f in files if os.path.splitext(f)[1] == ".py"
+ )
+
+ for fpath in pyfile_gen:
+ with open(fpath, 'r') as f:
+ src = f.read()
+
+ # Parse the code and insert method call fixes.
+ tree = cst.parse_module(src)
+ updated = tree.visit(transformer)
+
+ # Create the path and directory structure for the new file.
+ updated_path = out_dir.joinpath(fpath.relative_to(in_dir))
+ updated_path.parent.mkdir(parents=True, exist_ok=True)
+
+ # Generate the updated source file at the corresponding path.
+ with open(updated_path, 'w') as f:
+ f.write(updated.code)
+
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser(
+ description="""Fix up source that uses the shell client library.
+
+The existing sources are NOT overwritten but are copied to output_dir with changes made.
+
+Note: This tool operates at a best-effort level at converting positional
+ parameters in client method calls to keyword based parameters.
+ Cases where it WILL FAIL include
+ A) * or ** expansion in a method call.
+ B) Calls via function or method alias (includes free function calls)
+ C) Indirect or dispatched calls (e.g. the method is looked up dynamically)
+
+ These all constitute false negatives. The tool will also detect false
+ positives when an API method shares a name with another method.
+""")
+ parser.add_argument(
+ '-d',
+ '--input-directory',
+ required=True,
+ dest='input_dir',
+ help='the input directory to walk for python files to fix up',
+ )
+ parser.add_argument(
+ '-o',
+ '--output-directory',
+ required=True,
+ dest='output_dir',
+ help='the directory to output files fixed via un-flattening',
+ )
+ args = parser.parse_args()
+ input_dir = pathlib.Path(args.input_dir)
+ output_dir = pathlib.Path(args.output_dir)
+ if not input_dir.is_dir():
+ print(
+ f"input directory '{input_dir}' does not exist or is not a directory",
+ file=sys.stderr,
+ )
+ sys.exit(-1)
+
+ if not output_dir.is_dir():
+ print(
+ f"output directory '{output_dir}' does not exist or is not a directory",
+ file=sys.stderr,
+ )
+ sys.exit(-1)
+
+ if os.listdir(output_dir):
+ print(
+ f"output directory '{output_dir}' is not empty",
+ file=sys.stderr,
+ )
+ sys.exit(-1)
+
+ fix_files(input_dir, output_dir)
diff --git a/owl-bot-staging/v1/setup.py b/owl-bot-staging/v1/setup.py
new file mode 100644
index 0000000..0e6bd92
--- /dev/null
+++ b/owl-bot-staging/v1/setup.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 io
+import os
+import setuptools # type: ignore
+
+version = '0.1.0'
+
+package_root = os.path.abspath(os.path.dirname(__file__))
+
+readme_filename = os.path.join(package_root, 'README.rst')
+with io.open(readme_filename, encoding='utf-8') as readme_file:
+ readme = readme_file.read()
+
+setuptools.setup(
+ name='google-cloud-shell',
+ version=version,
+ long_description=readme,
+ packages=setuptools.PEP420PackageFinder.find(),
+ namespace_packages=('google', 'google.cloud'),
+ platforms='Posix; MacOS X; Windows',
+ include_package_data=True,
+ install_requires=(
+ 'google-api-core[grpc] >= 1.27.0, < 2.0.0dev',
+ 'libcst >= 0.2.5',
+ 'proto-plus >= 1.15.0',
+ 'packaging >= 14.3', ),
+ python_requires='>=3.6',
+ classifiers=[
+ 'Development Status :: 3 - Alpha',
+ 'Intended Audience :: Developers',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
+ 'Topic :: Internet',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ ],
+ zip_safe=False,
+)
diff --git a/owl-bot-staging/v1/tests/__init__.py b/owl-bot-staging/v1/tests/__init__.py
new file mode 100644
index 0000000..b54a5fc
--- /dev/null
+++ b/owl-bot-staging/v1/tests/__init__.py
@@ -0,0 +1,16 @@
+
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
diff --git a/owl-bot-staging/v1/tests/unit/__init__.py b/owl-bot-staging/v1/tests/unit/__init__.py
new file mode 100644
index 0000000..b54a5fc
--- /dev/null
+++ b/owl-bot-staging/v1/tests/unit/__init__.py
@@ -0,0 +1,16 @@
+
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/__init__.py b/owl-bot-staging/v1/tests/unit/gapic/__init__.py
new file mode 100644
index 0000000..b54a5fc
--- /dev/null
+++ b/owl-bot-staging/v1/tests/unit/gapic/__init__.py
@@ -0,0 +1,16 @@
+
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
new file mode 100644
index 0000000..b54a5fc
--- /dev/null
+++ b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
@@ -0,0 +1,16 @@
+
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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.
+#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
new file mode 100644
index 0000000..9a364f6
--- /dev/null
+++ b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
@@ -0,0 +1,1828 @@
+# -*- coding: utf-8 -*-
+# Copyright 2020 Google LLC
+#
+# 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 mock
+import packaging.version
+
+import grpc
+from grpc.experimental import aio
+import math
+import pytest
+from proto.marshal.rules.dates import DurationRule, TimestampRule
+
+
+from google.api_core import client_options
+from google.api_core import exceptions as core_exceptions
+from google.api_core import future
+from google.api_core import gapic_v1
+from google.api_core import grpc_helpers
+from google.api_core import grpc_helpers_async
+from google.api_core import operation_async # type: ignore
+from google.api_core import operations_v1
+from google.auth import credentials as ga_credentials
+from google.auth.exceptions import MutualTLSChannelError
+from google.cloud.shell_v1.services.cloud_shell_service import CloudShellServiceAsyncClient
+from google.cloud.shell_v1.services.cloud_shell_service import CloudShellServiceClient
+from google.cloud.shell_v1.services.cloud_shell_service import transports
+from google.cloud.shell_v1.services.cloud_shell_service.transports.base import _GOOGLE_AUTH_VERSION
+from google.cloud.shell_v1.types import cloudshell
+from google.longrunning import operations_pb2
+from google.oauth2 import service_account
+from google.protobuf import timestamp_pb2 # type: ignore
+import google.auth
+
+
+# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively
+# through google-api-core:
+# - Delete the auth "less than" test cases
+# - Delete these pytest markers (Make the "greater than or equal to" tests the default).
+requires_google_auth_lt_1_25_0 = pytest.mark.skipif(
+ packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"),
+ reason="This test requires google-auth < 1.25.0",
+)
+requires_google_auth_gte_1_25_0 = pytest.mark.skipif(
+ packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"),
+ reason="This test requires google-auth >= 1.25.0",
+)
+
+def client_cert_source_callback():
+ return b"cert bytes", b"key bytes"
+
+
+# If default endpoint is localhost, then default mtls endpoint will be the same.
+# This method modifies the default endpoint so the client can produce a different
+# mtls endpoint for endpoint testing purposes.
+def modify_default_endpoint(client):
+ return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT
+
+
+def test__get_default_mtls_endpoint():
+ api_endpoint = "example.googleapis.com"
+ api_mtls_endpoint = "example.mtls.googleapis.com"
+ sandbox_endpoint = "example.sandbox.googleapis.com"
+ sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com"
+ non_googleapi = "api.example.com"
+
+ assert CloudShellServiceClient._get_default_mtls_endpoint(None) is None
+ assert CloudShellServiceClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint
+ assert CloudShellServiceClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint
+ assert CloudShellServiceClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint
+ assert CloudShellServiceClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint
+ assert CloudShellServiceClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi
+
+
+@pytest.mark.parametrize("client_class", [
+ CloudShellServiceClient,
+ CloudShellServiceAsyncClient,
+])
+def test_cloud_shell_service_client_from_service_account_info(client_class):
+ creds = ga_credentials.AnonymousCredentials()
+ with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory:
+ factory.return_value = creds
+ info = {"valid": True}
+ client = client_class.from_service_account_info(info)
+ assert client.transport._credentials == creds
+ assert isinstance(client, client_class)
+
+ assert client.transport._host == 'cloudshell.googleapis.com:443'
+
+
+@pytest.mark.parametrize("client_class", [
+ CloudShellServiceClient,
+ CloudShellServiceAsyncClient,
+])
+def test_cloud_shell_service_client_service_account_always_use_jwt(client_class):
+ with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt:
+ creds = service_account.Credentials(None, None, None)
+ client = client_class(credentials=creds)
+ use_jwt.assert_not_called()
+
+
+@pytest.mark.parametrize("transport_class,transport_name", [
+ (transports.CloudShellServiceGrpcTransport, "grpc"),
+ (transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
+])
+def test_cloud_shell_service_client_service_account_always_use_jwt_true(transport_class, transport_name):
+ with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt:
+ creds = service_account.Credentials(None, None, None)
+ transport = transport_class(credentials=creds, always_use_jwt_access=True)
+ use_jwt.assert_called_once_with(True)
+
+
+@pytest.mark.parametrize("client_class", [
+ CloudShellServiceClient,
+ CloudShellServiceAsyncClient,
+])
+def test_cloud_shell_service_client_from_service_account_file(client_class):
+ creds = ga_credentials.AnonymousCredentials()
+ with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory:
+ factory.return_value = creds
+ client = client_class.from_service_account_file("dummy/file/path.json")
+ assert client.transport._credentials == creds
+ assert isinstance(client, client_class)
+
+ client = client_class.from_service_account_json("dummy/file/path.json")
+ assert client.transport._credentials == creds
+ assert isinstance(client, client_class)
+
+ assert client.transport._host == 'cloudshell.googleapis.com:443'
+
+
+def test_cloud_shell_service_client_get_transport_class():
+ transport = CloudShellServiceClient.get_transport_class()
+ available_transports = [
+ transports.CloudShellServiceGrpcTransport,
+ ]
+ assert transport in available_transports
+
+ transport = CloudShellServiceClient.get_transport_class("grpc")
+ assert transport == transports.CloudShellServiceGrpcTransport
+
+
+@pytest.mark.parametrize("client_class,transport_class,transport_name", [
+ (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
+ (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
+])
+@mock.patch.object(CloudShellServiceClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceClient))
+@mock.patch.object(CloudShellServiceAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceAsyncClient))
+def test_cloud_shell_service_client_client_options(client_class, transport_class, transport_name):
+ # Check that if channel is provided we won't create a new one.
+ with mock.patch.object(CloudShellServiceClient, 'get_transport_class') as gtc:
+ transport = transport_class(
+ credentials=ga_credentials.AnonymousCredentials()
+ )
+ client = client_class(transport=transport)
+ gtc.assert_not_called()
+
+ # Check that if channel is provided via str we will create a new one.
+ with mock.patch.object(CloudShellServiceClient, 'get_transport_class') as gtc:
+ client = client_class(transport=transport_name)
+ gtc.assert_called()
+
+ # Check the case api_endpoint is provided.
+ options = client_options.ClientOptions(api_endpoint="squid.clam.whelk")
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class(client_options=options)
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host="squid.clam.whelk",
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+ # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is
+ # "never".
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}):
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class()
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=client.DEFAULT_ENDPOINT,
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+ # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is
+ # "always".
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}):
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class()
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=client.DEFAULT_MTLS_ENDPOINT,
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+ # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has
+ # unsupported value.
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}):
+ with pytest.raises(MutualTLSChannelError):
+ client = client_class()
+
+ # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value.
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}):
+ with pytest.raises(ValueError):
+ client = client_class()
+
+ # Check the case quota_project_id is provided
+ options = client_options.ClientOptions(quota_project_id="octopus")
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class(client_options=options)
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=client.DEFAULT_ENDPOINT,
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id="octopus",
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [
+ (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc", "true"),
+ (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio", "true"),
+ (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc", "false"),
+ (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio", "false"),
+])
+@mock.patch.object(CloudShellServiceClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceClient))
+@mock.patch.object(CloudShellServiceAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceAsyncClient))
+@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"})
+def test_cloud_shell_service_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env):
+ # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default
+ # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists.
+
+ # Check the case client_cert_source is provided. Whether client cert is used depends on
+ # GOOGLE_API_USE_CLIENT_CERTIFICATE value.
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
+ options = client_options.ClientOptions(client_cert_source=client_cert_source_callback)
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class(client_options=options)
+
+ if use_client_cert_env == "false":
+ expected_client_cert_source = None
+ expected_host = client.DEFAULT_ENDPOINT
+ else:
+ expected_client_cert_source = client_cert_source_callback
+ expected_host = client.DEFAULT_MTLS_ENDPOINT
+
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=expected_host,
+ scopes=None,
+ client_cert_source_for_mtls=expected_client_cert_source,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+ # Check the case ADC client cert is provided. Whether client cert is used depends on
+ # GOOGLE_API_USE_CLIENT_CERTIFICATE value.
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
+ with mock.patch.object(transport_class, '__init__') as patched:
+ with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True):
+ with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback):
+ if use_client_cert_env == "false":
+ expected_host = client.DEFAULT_ENDPOINT
+ expected_client_cert_source = None
+ else:
+ expected_host = client.DEFAULT_MTLS_ENDPOINT
+ expected_client_cert_source = client_cert_source_callback
+
+ patched.return_value = None
+ client = client_class()
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=expected_host,
+ scopes=None,
+ client_cert_source_for_mtls=expected_client_cert_source,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+ # Check the case client_cert_source and ADC client cert are not provided.
+ with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
+ with mock.patch.object(transport_class, '__init__') as patched:
+ with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False):
+ patched.return_value = None
+ client = client_class()
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=client.DEFAULT_ENDPOINT,
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+
+@pytest.mark.parametrize("client_class,transport_class,transport_name", [
+ (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
+ (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
+])
+def test_cloud_shell_service_client_client_options_scopes(client_class, transport_class, transport_name):
+ # Check the case scopes are provided.
+ options = client_options.ClientOptions(
+ scopes=["1", "2"],
+ )
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class(client_options=options)
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host=client.DEFAULT_ENDPOINT,
+ scopes=["1", "2"],
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+@pytest.mark.parametrize("client_class,transport_class,transport_name", [
+ (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
+ (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
+])
+def test_cloud_shell_service_client_client_options_credentials_file(client_class, transport_class, transport_name):
+ # Check the case credentials file is provided.
+ options = client_options.ClientOptions(
+ credentials_file="credentials.json"
+ )
+ with mock.patch.object(transport_class, '__init__') as patched:
+ patched.return_value = None
+ client = client_class(client_options=options)
+ patched.assert_called_once_with(
+ credentials=None,
+ credentials_file="credentials.json",
+ host=client.DEFAULT_ENDPOINT,
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+
+def test_cloud_shell_service_client_client_options_from_dict():
+ with mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceGrpcTransport.__init__') as grpc_transport:
+ grpc_transport.return_value = None
+ client = CloudShellServiceClient(
+ client_options={'api_endpoint': 'squid.clam.whelk'}
+ )
+ grpc_transport.assert_called_once_with(
+ credentials=None,
+ credentials_file=None,
+ host="squid.clam.whelk",
+ scopes=None,
+ client_cert_source_for_mtls=None,
+ quota_project_id=None,
+ client_info=transports.base.DEFAULT_CLIENT_INFO,
+ )
+
+
+def test_get_environment(transport: str = 'grpc', request_type=cloudshell.GetEnvironmentRequest):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = cloudshell.Environment(
+ name='name_value',
+ id='id_value',
+ docker_image='docker_image_value',
+ state=cloudshell.Environment.State.SUSPENDED,
+ web_host='web_host_value',
+ ssh_username='ssh_username_value',
+ ssh_host='ssh_host_value',
+ ssh_port=882,
+ public_keys=['public_keys_value'],
+ )
+ response = client.get_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.GetEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, cloudshell.Environment)
+ assert response.name == 'name_value'
+ assert response.id == 'id_value'
+ assert response.docker_image == 'docker_image_value'
+ assert response.state == cloudshell.Environment.State.SUSPENDED
+ assert response.web_host == 'web_host_value'
+ assert response.ssh_username == 'ssh_username_value'
+ assert response.ssh_host == 'ssh_host_value'
+ assert response.ssh_port == 882
+ assert response.public_keys == ['public_keys_value']
+
+
+def test_get_environment_from_dict():
+ test_get_environment(request_type=dict)
+
+
+def test_get_environment_empty_call():
+ # This test is a coverage failsafe to make sure that totally empty calls,
+ # i.e. request == None and no flattened fields passed, work.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ client.get_environment()
+ call.assert_called()
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.GetEnvironmentRequest()
+
+
+@pytest.mark.asyncio
+async def test_get_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.GetEnvironmentRequest):
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment(
+ name='name_value',
+ id='id_value',
+ docker_image='docker_image_value',
+ state=cloudshell.Environment.State.SUSPENDED,
+ web_host='web_host_value',
+ ssh_username='ssh_username_value',
+ ssh_host='ssh_host_value',
+ ssh_port=882,
+ public_keys=['public_keys_value'],
+ ))
+ response = await client.get_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.GetEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, cloudshell.Environment)
+ assert response.name == 'name_value'
+ assert response.id == 'id_value'
+ assert response.docker_image == 'docker_image_value'
+ assert response.state == cloudshell.Environment.State.SUSPENDED
+ assert response.web_host == 'web_host_value'
+ assert response.ssh_username == 'ssh_username_value'
+ assert response.ssh_host == 'ssh_host_value'
+ assert response.ssh_port == 882
+ assert response.public_keys == ['public_keys_value']
+
+
+@pytest.mark.asyncio
+async def test_get_environment_async_from_dict():
+ await test_get_environment_async(request_type=dict)
+
+
+def test_get_environment_field_headers():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.GetEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ call.return_value = cloudshell.Environment()
+ client.get_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+@pytest.mark.asyncio
+async def test_get_environment_field_headers_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.GetEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment())
+ await client.get_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+def test_get_environment_flattened():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = cloudshell.Environment()
+ # Call the method with a truthy value for each flattened field,
+ # using the keyword arguments to the method.
+ client.get_environment(
+ name='name_value',
+ )
+
+ # Establish that the underlying call was made with the expected
+ # request object values.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0].name == 'name_value'
+
+
+def test_get_environment_flattened_error():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Attempting to call a method with both a request object and flattened
+ # fields is an error.
+ with pytest.raises(ValueError):
+ client.get_environment(
+ cloudshell.GetEnvironmentRequest(),
+ name='name_value',
+ )
+
+
+@pytest.mark.asyncio
+async def test_get_environment_flattened_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.get_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = cloudshell.Environment()
+
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment())
+ # Call the method with a truthy value for each flattened field,
+ # using the keyword arguments to the method.
+ response = await client.get_environment(
+ name='name_value',
+ )
+
+ # Establish that the underlying call was made with the expected
+ # request object values.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0].name == 'name_value'
+
+
+@pytest.mark.asyncio
+async def test_get_environment_flattened_error_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Attempting to call a method with both a request object and flattened
+ # fields is an error.
+ with pytest.raises(ValueError):
+ await client.get_environment(
+ cloudshell.GetEnvironmentRequest(),
+ name='name_value',
+ )
+
+
+def test_start_environment(transport: str = 'grpc', request_type=cloudshell.StartEnvironmentRequest):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.start_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = operations_pb2.Operation(name='operations/spam')
+ response = client.start_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.StartEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+def test_start_environment_from_dict():
+ test_start_environment(request_type=dict)
+
+
+def test_start_environment_empty_call():
+ # This test is a coverage failsafe to make sure that totally empty calls,
+ # i.e. request == None and no flattened fields passed, work.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.start_environment),
+ '__call__') as call:
+ client.start_environment()
+ call.assert_called()
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.StartEnvironmentRequest()
+
+
+@pytest.mark.asyncio
+async def test_start_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.StartEnvironmentRequest):
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.start_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
+ operations_pb2.Operation(name='operations/spam')
+ )
+ response = await client.start_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.StartEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+@pytest.mark.asyncio
+async def test_start_environment_async_from_dict():
+ await test_start_environment_async(request_type=dict)
+
+
+def test_start_environment_field_headers():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.StartEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.start_environment),
+ '__call__') as call:
+ call.return_value = operations_pb2.Operation(name='operations/op')
+ client.start_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+@pytest.mark.asyncio
+async def test_start_environment_field_headers_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.StartEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.start_environment),
+ '__call__') as call:
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
+ await client.start_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+def test_authorize_environment(transport: str = 'grpc', request_type=cloudshell.AuthorizeEnvironmentRequest):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.authorize_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = operations_pb2.Operation(name='operations/spam')
+ response = client.authorize_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+def test_authorize_environment_from_dict():
+ test_authorize_environment(request_type=dict)
+
+
+def test_authorize_environment_empty_call():
+ # This test is a coverage failsafe to make sure that totally empty calls,
+ # i.e. request == None and no flattened fields passed, work.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.authorize_environment),
+ '__call__') as call:
+ client.authorize_environment()
+ call.assert_called()
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
+
+
+@pytest.mark.asyncio
+async def test_authorize_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.AuthorizeEnvironmentRequest):
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.authorize_environment),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
+ operations_pb2.Operation(name='operations/spam')
+ )
+ response = await client.authorize_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+@pytest.mark.asyncio
+async def test_authorize_environment_async_from_dict():
+ await test_authorize_environment_async(request_type=dict)
+
+
+def test_authorize_environment_field_headers():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.AuthorizeEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.authorize_environment),
+ '__call__') as call:
+ call.return_value = operations_pb2.Operation(name='operations/op')
+ client.authorize_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+@pytest.mark.asyncio
+async def test_authorize_environment_field_headers_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.AuthorizeEnvironmentRequest()
+
+ request.name = 'name/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.authorize_environment),
+ '__call__') as call:
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
+ await client.authorize_environment(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'name=name/value',
+ ) in kw['metadata']
+
+
+def test_add_public_key(transport: str = 'grpc', request_type=cloudshell.AddPublicKeyRequest):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.add_public_key),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = operations_pb2.Operation(name='operations/spam')
+ response = client.add_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AddPublicKeyRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+def test_add_public_key_from_dict():
+ test_add_public_key(request_type=dict)
+
+
+def test_add_public_key_empty_call():
+ # This test is a coverage failsafe to make sure that totally empty calls,
+ # i.e. request == None and no flattened fields passed, work.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.add_public_key),
+ '__call__') as call:
+ client.add_public_key()
+ call.assert_called()
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AddPublicKeyRequest()
+
+
+@pytest.mark.asyncio
+async def test_add_public_key_async(transport: str = 'grpc_asyncio', request_type=cloudshell.AddPublicKeyRequest):
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.add_public_key),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
+ operations_pb2.Operation(name='operations/spam')
+ )
+ response = await client.add_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.AddPublicKeyRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+@pytest.mark.asyncio
+async def test_add_public_key_async_from_dict():
+ await test_add_public_key_async(request_type=dict)
+
+
+def test_add_public_key_field_headers():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.AddPublicKeyRequest()
+
+ request.environment = 'environment/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.add_public_key),
+ '__call__') as call:
+ call.return_value = operations_pb2.Operation(name='operations/op')
+ client.add_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'environment=environment/value',
+ ) in kw['metadata']
+
+
+@pytest.mark.asyncio
+async def test_add_public_key_field_headers_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.AddPublicKeyRequest()
+
+ request.environment = 'environment/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.add_public_key),
+ '__call__') as call:
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
+ await client.add_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'environment=environment/value',
+ ) in kw['metadata']
+
+
+def test_remove_public_key(transport: str = 'grpc', request_type=cloudshell.RemovePublicKeyRequest):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.remove_public_key),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = operations_pb2.Operation(name='operations/spam')
+ response = client.remove_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.RemovePublicKeyRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+def test_remove_public_key_from_dict():
+ test_remove_public_key(request_type=dict)
+
+
+def test_remove_public_key_empty_call():
+ # This test is a coverage failsafe to make sure that totally empty calls,
+ # i.e. request == None and no flattened fields passed, work.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.remove_public_key),
+ '__call__') as call:
+ client.remove_public_key()
+ call.assert_called()
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.RemovePublicKeyRequest()
+
+
+@pytest.mark.asyncio
+async def test_remove_public_key_async(transport: str = 'grpc_asyncio', request_type=cloudshell.RemovePublicKeyRequest):
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # Everything is optional in proto3 as far as the runtime is concerned,
+ # and we are mocking out the actual API, so just send an empty request.
+ request = request_type()
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.remove_public_key),
+ '__call__') as call:
+ # Designate an appropriate return value for the call.
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
+ operations_pb2.Operation(name='operations/spam')
+ )
+ response = await client.remove_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == cloudshell.RemovePublicKeyRequest()
+
+ # Establish that the response is the type that we expect.
+ assert isinstance(response, future.Future)
+
+
+@pytest.mark.asyncio
+async def test_remove_public_key_async_from_dict():
+ await test_remove_public_key_async(request_type=dict)
+
+
+def test_remove_public_key_field_headers():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.RemovePublicKeyRequest()
+
+ request.environment = 'environment/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.remove_public_key),
+ '__call__') as call:
+ call.return_value = operations_pb2.Operation(name='operations/op')
+ client.remove_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls) == 1
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'environment=environment/value',
+ ) in kw['metadata']
+
+
+@pytest.mark.asyncio
+async def test_remove_public_key_field_headers_async():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Any value that is part of the HTTP/1.1 URI should be sent as
+ # a field header. Set these to a non-empty value.
+ request = cloudshell.RemovePublicKeyRequest()
+
+ request.environment = 'environment/value'
+
+ # Mock the actual call within the gRPC stub, and fake the request.
+ with mock.patch.object(
+ type(client.transport.remove_public_key),
+ '__call__') as call:
+ call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
+ await client.remove_public_key(request)
+
+ # Establish that the underlying gRPC stub method was called.
+ assert len(call.mock_calls)
+ _, args, _ = call.mock_calls[0]
+ assert args[0] == request
+
+ # Establish that the field header was sent.
+ _, _, kw = call.mock_calls[0]
+ assert (
+ 'x-goog-request-params',
+ 'environment=environment/value',
+ ) in kw['metadata']
+
+
+def test_credentials_transport_error():
+ # It is an error to provide credentials and a transport instance.
+ transport = transports.CloudShellServiceGrpcTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ with pytest.raises(ValueError):
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport=transport,
+ )
+
+ # It is an error to provide a credentials file and a transport instance.
+ transport = transports.CloudShellServiceGrpcTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ with pytest.raises(ValueError):
+ client = CloudShellServiceClient(
+ client_options={"credentials_file": "credentials.json"},
+ transport=transport,
+ )
+
+ # It is an error to provide scopes and a transport instance.
+ transport = transports.CloudShellServiceGrpcTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ with pytest.raises(ValueError):
+ client = CloudShellServiceClient(
+ client_options={"scopes": ["1", "2"]},
+ transport=transport,
+ )
+
+
+def test_transport_instance():
+ # A client may be instantiated with a custom transport instance.
+ transport = transports.CloudShellServiceGrpcTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ client = CloudShellServiceClient(transport=transport)
+ assert client.transport is transport
+
+def test_transport_get_channel():
+ # A client may be instantiated with a custom transport instance.
+ transport = transports.CloudShellServiceGrpcTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ channel = transport.grpc_channel
+ assert channel
+
+ transport = transports.CloudShellServiceGrpcAsyncIOTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ channel = transport.grpc_channel
+ assert channel
+
+@pytest.mark.parametrize("transport_class", [
+ transports.CloudShellServiceGrpcTransport,
+ transports.CloudShellServiceGrpcAsyncIOTransport,
+])
+def test_transport_adc(transport_class):
+ # Test default credentials are used if not provided.
+ with mock.patch.object(google.auth, 'default') as adc:
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport_class()
+ adc.assert_called_once()
+
+def test_transport_grpc_default():
+ # A client should use the gRPC transport by default.
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+ assert isinstance(
+ client.transport,
+ transports.CloudShellServiceGrpcTransport,
+ )
+
+def test_cloud_shell_service_base_transport_error():
+ # Passing both a credentials object and credentials_file should raise an error
+ with pytest.raises(core_exceptions.DuplicateCredentialArgs):
+ transport = transports.CloudShellServiceTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ credentials_file="credentials.json"
+ )
+
+
+def test_cloud_shell_service_base_transport():
+ # Instantiate the base transport.
+ with mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport.__init__') as Transport:
+ Transport.return_value = None
+ transport = transports.CloudShellServiceTransport(
+ credentials=ga_credentials.AnonymousCredentials(),
+ )
+
+ # Every method on the transport should just blindly
+ # raise NotImplementedError.
+ methods = (
+ 'get_environment',
+ 'start_environment',
+ 'authorize_environment',
+ 'add_public_key',
+ 'remove_public_key',
+ )
+ for method in methods:
+ with pytest.raises(NotImplementedError):
+ getattr(transport, method)(request=object())
+
+ # Additionally, the LRO client (a property) should
+ # also raise NotImplementedError
+ with pytest.raises(NotImplementedError):
+ transport.operations_client
+
+
+@requires_google_auth_gte_1_25_0
+def test_cloud_shell_service_base_transport_with_credentials_file():
+ # Instantiate the base transport with a credentials file
+ with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
+ Transport.return_value = None
+ load_creds.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport = transports.CloudShellServiceTransport(
+ credentials_file="credentials.json",
+ quota_project_id="octopus",
+ )
+ load_creds.assert_called_once_with("credentials.json",
+ scopes=None,
+ default_scopes=(
+ 'https://www.googleapis.com/auth/cloud-platform',
+),
+ quota_project_id="octopus",
+ )
+
+
+@requires_google_auth_lt_1_25_0
+def test_cloud_shell_service_base_transport_with_credentials_file_old_google_auth():
+ # Instantiate the base transport with a credentials file
+ with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
+ Transport.return_value = None
+ load_creds.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport = transports.CloudShellServiceTransport(
+ credentials_file="credentials.json",
+ quota_project_id="octopus",
+ )
+ load_creds.assert_called_once_with("credentials.json", scopes=(
+ 'https://www.googleapis.com/auth/cloud-platform',
+ ),
+ quota_project_id="octopus",
+ )
+
+
+def test_cloud_shell_service_base_transport_with_adc():
+ # Test the default credentials are used if credentials and credentials_file are None.
+ with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
+ Transport.return_value = None
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport = transports.CloudShellServiceTransport()
+ adc.assert_called_once()
+
+
+@requires_google_auth_gte_1_25_0
+def test_cloud_shell_service_auth_adc():
+ # If no credentials are provided, we should use ADC credentials.
+ with mock.patch.object(google.auth, 'default', autospec=True) as adc:
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ CloudShellServiceClient()
+ adc.assert_called_once_with(
+ scopes=None,
+ default_scopes=(
+ 'https://www.googleapis.com/auth/cloud-platform',
+),
+ quota_project_id=None,
+ )
+
+
+@requires_google_auth_lt_1_25_0
+def test_cloud_shell_service_auth_adc_old_google_auth():
+ # If no credentials are provided, we should use ADC credentials.
+ with mock.patch.object(google.auth, 'default', autospec=True) as adc:
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ CloudShellServiceClient()
+ adc.assert_called_once_with(
+ scopes=( 'https://www.googleapis.com/auth/cloud-platform',),
+ quota_project_id=None,
+ )
+
+
+@pytest.mark.parametrize(
+ "transport_class",
+ [
+ transports.CloudShellServiceGrpcTransport,
+ transports.CloudShellServiceGrpcAsyncIOTransport,
+ ],
+)
+@requires_google_auth_gte_1_25_0
+def test_cloud_shell_service_transport_auth_adc(transport_class):
+ # If credentials and host are not provided, the transport class should use
+ # ADC credentials.
+ with mock.patch.object(google.auth, 'default', autospec=True) as adc:
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport_class(quota_project_id="octopus", scopes=["1", "2"])
+ adc.assert_called_once_with(
+ scopes=["1", "2"],
+ default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',),
+ quota_project_id="octopus",
+ )
+
+
+@pytest.mark.parametrize(
+ "transport_class",
+ [
+ transports.CloudShellServiceGrpcTransport,
+ transports.CloudShellServiceGrpcAsyncIOTransport,
+ ],
+)
+@requires_google_auth_lt_1_25_0
+def test_cloud_shell_service_transport_auth_adc_old_google_auth(transport_class):
+ # If credentials and host are not provided, the transport class should use
+ # ADC credentials.
+ with mock.patch.object(google.auth, "default", autospec=True) as adc:
+ adc.return_value = (ga_credentials.AnonymousCredentials(), None)
+ transport_class(quota_project_id="octopus")
+ adc.assert_called_once_with(scopes=(
+ 'https://www.googleapis.com/auth/cloud-platform',
+),
+ quota_project_id="octopus",
+ )
+
+
+@pytest.mark.parametrize(
+ "transport_class,grpc_helpers",
+ [
+ (transports.CloudShellServiceGrpcTransport, grpc_helpers),
+ (transports.CloudShellServiceGrpcAsyncIOTransport, grpc_helpers_async)
+ ],
+)
+def test_cloud_shell_service_transport_create_channel(transport_class, grpc_helpers):
+ # If credentials and host are not provided, the transport class should use
+ # ADC credentials.
+ with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object(
+ grpc_helpers, "create_channel", autospec=True
+ ) as create_channel:
+ creds = ga_credentials.AnonymousCredentials()
+ adc.return_value = (creds, None)
+ transport_class(
+ quota_project_id="octopus",
+ scopes=["1", "2"]
+ )
+
+ create_channel.assert_called_with(
+ "cloudshell.googleapis.com:443",
+ credentials=creds,
+ credentials_file=None,
+ quota_project_id="octopus",
+ default_scopes=(
+ 'https://www.googleapis.com/auth/cloud-platform',
+),
+ scopes=["1", "2"],
+ default_host="cloudshell.googleapis.com",
+ ssl_credentials=None,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+
+
+@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
+def test_cloud_shell_service_grpc_transport_client_cert_source_for_mtls(
+ transport_class
+):
+ cred = ga_credentials.AnonymousCredentials()
+
+ # Check ssl_channel_credentials is used if provided.
+ with mock.patch.object(transport_class, "create_channel") as mock_create_channel:
+ mock_ssl_channel_creds = mock.Mock()
+ transport_class(
+ host="squid.clam.whelk",
+ credentials=cred,
+ ssl_channel_credentials=mock_ssl_channel_creds
+ )
+ mock_create_channel.assert_called_once_with(
+ "squid.clam.whelk:443",
+ credentials=cred,
+ credentials_file=None,
+ scopes=None,
+ ssl_credentials=mock_ssl_channel_creds,
+ quota_project_id=None,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+
+ # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls
+ # is used.
+ with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()):
+ with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred:
+ transport_class(
+ credentials=cred,
+ client_cert_source_for_mtls=client_cert_source_callback
+ )
+ expected_cert, expected_key = client_cert_source_callback()
+ mock_ssl_cred.assert_called_once_with(
+ certificate_chain=expected_cert,
+ private_key=expected_key
+ )
+
+
+def test_cloud_shell_service_host_no_port():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ client_options=client_options.ClientOptions(api_endpoint='cloudshell.googleapis.com'),
+ )
+ assert client.transport._host == 'cloudshell.googleapis.com:443'
+
+
+def test_cloud_shell_service_host_with_port():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ client_options=client_options.ClientOptions(api_endpoint='cloudshell.googleapis.com:8000'),
+ )
+ assert client.transport._host == 'cloudshell.googleapis.com:8000'
+
+def test_cloud_shell_service_grpc_transport_channel():
+ channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials())
+
+ # Check that channel is used if provided.
+ transport = transports.CloudShellServiceGrpcTransport(
+ host="squid.clam.whelk",
+ channel=channel,
+ )
+ assert transport.grpc_channel == channel
+ assert transport._host == "squid.clam.whelk:443"
+ assert transport._ssl_channel_credentials == None
+
+
+def test_cloud_shell_service_grpc_asyncio_transport_channel():
+ channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials())
+
+ # Check that channel is used if provided.
+ transport = transports.CloudShellServiceGrpcAsyncIOTransport(
+ host="squid.clam.whelk",
+ channel=channel,
+ )
+ assert transport.grpc_channel == channel
+ assert transport._host == "squid.clam.whelk:443"
+ assert transport._ssl_channel_credentials == None
+
+
+# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are
+# removed from grpc/grpc_asyncio transport constructor.
+@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
+def test_cloud_shell_service_transport_channel_mtls_with_client_cert_source(
+ transport_class
+):
+ with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred:
+ with mock.patch.object(transport_class, "create_channel") as grpc_create_channel:
+ mock_ssl_cred = mock.Mock()
+ grpc_ssl_channel_cred.return_value = mock_ssl_cred
+
+ mock_grpc_channel = mock.Mock()
+ grpc_create_channel.return_value = mock_grpc_channel
+
+ cred = ga_credentials.AnonymousCredentials()
+ with pytest.warns(DeprecationWarning):
+ with mock.patch.object(google.auth, 'default') as adc:
+ adc.return_value = (cred, None)
+ transport = transport_class(
+ host="squid.clam.whelk",
+ api_mtls_endpoint="mtls.squid.clam.whelk",
+ client_cert_source=client_cert_source_callback,
+ )
+ adc.assert_called_once()
+
+ grpc_ssl_channel_cred.assert_called_once_with(
+ certificate_chain=b"cert bytes", private_key=b"key bytes"
+ )
+ grpc_create_channel.assert_called_once_with(
+ "mtls.squid.clam.whelk:443",
+ credentials=cred,
+ credentials_file=None,
+ scopes=None,
+ ssl_credentials=mock_ssl_cred,
+ quota_project_id=None,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+ assert transport.grpc_channel == mock_grpc_channel
+ assert transport._ssl_channel_credentials == mock_ssl_cred
+
+
+# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are
+# removed from grpc/grpc_asyncio transport constructor.
+@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
+def test_cloud_shell_service_transport_channel_mtls_with_adc(
+ transport_class
+):
+ mock_ssl_cred = mock.Mock()
+ with mock.patch.multiple(
+ "google.auth.transport.grpc.SslCredentials",
+ __init__=mock.Mock(return_value=None),
+ ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred),
+ ):
+ with mock.patch.object(transport_class, "create_channel") as grpc_create_channel:
+ mock_grpc_channel = mock.Mock()
+ grpc_create_channel.return_value = mock_grpc_channel
+ mock_cred = mock.Mock()
+
+ with pytest.warns(DeprecationWarning):
+ transport = transport_class(
+ host="squid.clam.whelk",
+ credentials=mock_cred,
+ api_mtls_endpoint="mtls.squid.clam.whelk",
+ client_cert_source=None,
+ )
+
+ grpc_create_channel.assert_called_once_with(
+ "mtls.squid.clam.whelk:443",
+ credentials=mock_cred,
+ credentials_file=None,
+ scopes=None,
+ ssl_credentials=mock_ssl_cred,
+ quota_project_id=None,
+ options=[
+ ("grpc.max_send_message_length", -1),
+ ("grpc.max_receive_message_length", -1),
+ ],
+ )
+ assert transport.grpc_channel == mock_grpc_channel
+
+
+def test_cloud_shell_service_grpc_lro_client():
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc',
+ )
+ transport = client.transport
+
+ # Ensure that we have a api-core operations client.
+ assert isinstance(
+ transport.operations_client,
+ operations_v1.OperationsClient,
+ )
+
+ # Ensure that subsequent calls to the property send the exact same object.
+ assert transport.operations_client is transport.operations_client
+
+
+def test_cloud_shell_service_grpc_lro_async_client():
+ client = CloudShellServiceAsyncClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ transport='grpc_asyncio',
+ )
+ transport = client.transport
+
+ # Ensure that we have a api-core operations client.
+ assert isinstance(
+ transport.operations_client,
+ operations_v1.OperationsAsyncClient,
+ )
+
+ # Ensure that subsequent calls to the property send the exact same object.
+ assert transport.operations_client is transport.operations_client
+
+
+def test_environment_path():
+ user = "squid"
+ environment = "clam"
+ expected = "users/{user}/environments/{environment}".format(user=user, environment=environment, )
+ actual = CloudShellServiceClient.environment_path(user, environment)
+ assert expected == actual
+
+
+def test_parse_environment_path():
+ expected = {
+ "user": "whelk",
+ "environment": "octopus",
+ }
+ path = CloudShellServiceClient.environment_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_environment_path(path)
+ assert expected == actual
+
+def test_common_billing_account_path():
+ billing_account = "oyster"
+ expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, )
+ actual = CloudShellServiceClient.common_billing_account_path(billing_account)
+ assert expected == actual
+
+
+def test_parse_common_billing_account_path():
+ expected = {
+ "billing_account": "nudibranch",
+ }
+ path = CloudShellServiceClient.common_billing_account_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_common_billing_account_path(path)
+ assert expected == actual
+
+def test_common_folder_path():
+ folder = "cuttlefish"
+ expected = "folders/{folder}".format(folder=folder, )
+ actual = CloudShellServiceClient.common_folder_path(folder)
+ assert expected == actual
+
+
+def test_parse_common_folder_path():
+ expected = {
+ "folder": "mussel",
+ }
+ path = CloudShellServiceClient.common_folder_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_common_folder_path(path)
+ assert expected == actual
+
+def test_common_organization_path():
+ organization = "winkle"
+ expected = "organizations/{organization}".format(organization=organization, )
+ actual = CloudShellServiceClient.common_organization_path(organization)
+ assert expected == actual
+
+
+def test_parse_common_organization_path():
+ expected = {
+ "organization": "nautilus",
+ }
+ path = CloudShellServiceClient.common_organization_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_common_organization_path(path)
+ assert expected == actual
+
+def test_common_project_path():
+ project = "scallop"
+ expected = "projects/{project}".format(project=project, )
+ actual = CloudShellServiceClient.common_project_path(project)
+ assert expected == actual
+
+
+def test_parse_common_project_path():
+ expected = {
+ "project": "abalone",
+ }
+ path = CloudShellServiceClient.common_project_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_common_project_path(path)
+ assert expected == actual
+
+def test_common_location_path():
+ project = "squid"
+ location = "clam"
+ expected = "projects/{project}/locations/{location}".format(project=project, location=location, )
+ actual = CloudShellServiceClient.common_location_path(project, location)
+ assert expected == actual
+
+
+def test_parse_common_location_path():
+ expected = {
+ "project": "whelk",
+ "location": "octopus",
+ }
+ path = CloudShellServiceClient.common_location_path(**expected)
+
+ # Check that the path construction is reversible.
+ actual = CloudShellServiceClient.parse_common_location_path(path)
+ assert expected == actual
+
+
+def test_client_withDEFAULT_CLIENT_INFO():
+ client_info = gapic_v1.client_info.ClientInfo()
+
+ with mock.patch.object(transports.CloudShellServiceTransport, '_prep_wrapped_messages') as prep:
+ client = CloudShellServiceClient(
+ credentials=ga_credentials.AnonymousCredentials(),
+ client_info=client_info,
+ )
+ prep.assert_called_once_with(client_info)
+
+ with mock.patch.object(transports.CloudShellServiceTransport, '_prep_wrapped_messages') as prep:
+ transport_class = CloudShellServiceClient.get_transport_class()
+ transport = transport_class(
+ credentials=ga_credentials.AnonymousCredentials(),
+ client_info=client_info,
+ )
+ prep.assert_called_once_with(client_info)
From f11c19bc0656dade4537250502e04408950d01d5 Mon Sep 17 00:00:00 2001
From: "release-please[bot]"
<55107282+release-please[bot]@users.noreply.github.com>
Date: Wed, 30 Jun 2021 17:26:46 -0700
Subject: [PATCH 8/8] chore: release 0.2.0 (#10)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* chore: release 0.2.0
* 🦉 Updates from OwlBot
See https://github.com/googleapis/repo-automation-bots/blob/master/packages/owl-bot/README.md
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Co-authored-by: Owl Bot
---
CHANGELOG.md | 17 +
.../cloud_shell_service/transports/base.py | 2 +-
.../cloud_shell_service/transports/grpc.py | 5 +-
.../transports/grpc_asyncio.py | 5 +-
owl-bot-staging/v1/.coveragerc | 17 -
owl-bot-staging/v1/MANIFEST.in | 2 -
owl-bot-staging/v1/README.rst | 49 -
owl-bot-staging/v1/docs/conf.py | 376 ----
owl-bot-staging/v1/docs/index.rst | 7 -
.../v1/docs/shell_v1/cloud_shell_service.rst | 6 -
owl-bot-staging/v1/docs/shell_v1/services.rst | 6 -
owl-bot-staging/v1/docs/shell_v1/types.rst | 7 -
.../v1/google/cloud/shell/__init__.py | 57 -
.../v1/google/cloud/shell/py.typed | 2 -
.../v1/google/cloud/shell_v1/__init__.py | 58 -
.../google/cloud/shell_v1/gapic_metadata.json | 73 -
.../v1/google/cloud/shell_v1/py.typed | 2 -
.../cloud/shell_v1/services/__init__.py | 15 -
.../services/cloud_shell_service/__init__.py | 22 -
.../cloud_shell_service/async_client.py | 540 -----
.../services/cloud_shell_service/client.py | 724 -------
.../transports/__init__.py | 33 -
.../cloud_shell_service/transports/base.py | 238 ---
.../cloud_shell_service/transports/grpc.py | 400 ----
.../transports/grpc_asyncio.py | 404 ----
.../google/cloud/shell_v1/types/__init__.py | 54 -
.../google/cloud/shell_v1/types/cloudshell.py | 413 ----
owl-bot-staging/v1/mypy.ini | 3 -
owl-bot-staging/v1/noxfile.py | 132 --
.../v1/scripts/fixup_shell_v1_keywords.py | 180 --
owl-bot-staging/v1/setup.py | 53 -
owl-bot-staging/v1/tests/__init__.py | 16 -
owl-bot-staging/v1/tests/unit/__init__.py | 16 -
.../v1/tests/unit/gapic/__init__.py | 16 -
.../v1/tests/unit/gapic/shell_v1/__init__.py | 16 -
.../shell_v1/test_cloud_shell_service.py | 1828 -----------------
setup.py | 2 +-
.../shell_v1/test_cloud_shell_service.py | 26 +-
38 files changed, 49 insertions(+), 5773 deletions(-)
delete mode 100644 owl-bot-staging/v1/.coveragerc
delete mode 100644 owl-bot-staging/v1/MANIFEST.in
delete mode 100644 owl-bot-staging/v1/README.rst
delete mode 100644 owl-bot-staging/v1/docs/conf.py
delete mode 100644 owl-bot-staging/v1/docs/index.rst
delete mode 100644 owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
delete mode 100644 owl-bot-staging/v1/docs/shell_v1/services.rst
delete mode 100644 owl-bot-staging/v1/docs/shell_v1/types.rst
delete mode 100644 owl-bot-staging/v1/google/cloud/shell/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell/py.typed
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/py.typed
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
delete mode 100644 owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
delete mode 100644 owl-bot-staging/v1/mypy.ini
delete mode 100644 owl-bot-staging/v1/noxfile.py
delete mode 100644 owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
delete mode 100644 owl-bot-staging/v1/setup.py
delete mode 100644 owl-bot-staging/v1/tests/__init__.py
delete mode 100644 owl-bot-staging/v1/tests/unit/__init__.py
delete mode 100644 owl-bot-staging/v1/tests/unit/gapic/__init__.py
delete mode 100644 owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
delete mode 100644 owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1f22f3..97e7403 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,22 @@
# Changelog
+## [0.2.0](https://www.github.com/googleapis/python-shell/compare/v0.1.0...v0.2.0) (2021-07-01)
+
+
+### Features
+
+* add always_use_jwt_access ([#9](https://www.github.com/googleapis/python-shell/issues/9)) ([13ce7ba](https://www.github.com/googleapis/python-shell/commit/13ce7bab4613f287a73743d80d1bbbee5c59969a))
+
+
+### Bug Fixes
+
+* disable always_use_jwt_access ([b447260](https://www.github.com/googleapis/python-shell/commit/b4472606f4eb050b9135d5dd948d65ae065a1e04))
+
+
+### Documentation
+
+* omit mention of Python 2.7 in 'CONTRIBUTING.rst' ([#1127](https://www.github.com/googleapis/python-shell/issues/1127)) ([#4](https://www.github.com/googleapis/python-shell/issues/4)) ([0150a5d](https://www.github.com/googleapis/python-shell/commit/0150a5d71e22b6aeb194cd2992d58ed03683d1ca)), closes [#1126](https://www.github.com/googleapis/python-shell/issues/1126)
+
## 0.1.0 (2021-06-13)
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
index 357bdeb..b1a6fb2 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
@@ -98,7 +98,7 @@ def __init__(
scopes_kwargs = self._get_scopes_kwargs(self._host, scopes)
# Save the scopes.
- self._scopes = scopes or self.AUTH_SCOPES
+ self._scopes = scopes
# If no credentials are provided, then determine the appropriate
# defaults.
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
index c8b3d6b..33b7b09 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
@@ -66,6 +66,7 @@ def __init__(
client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
quota_project_id: Optional[str] = None,
client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
) -> None:
"""Instantiate the transport.
@@ -106,6 +107,8 @@ def __init__(
API requests. If ``None``, then default info will be used.
Generally, you only need to set this if you're developing
your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
Raises:
google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport
@@ -159,7 +162,7 @@ def __init__(
scopes=scopes,
quota_project_id=quota_project_id,
client_info=client_info,
- always_use_jwt_access=True,
+ always_use_jwt_access=always_use_jwt_access,
)
if not self._grpc_channel:
diff --git a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
index 0d14754..ba99aa2 100644
--- a/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
+++ b/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
@@ -112,6 +112,7 @@ def __init__(
client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
quota_project_id=None,
client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
+ always_use_jwt_access: Optional[bool] = False,
) -> None:
"""Instantiate the transport.
@@ -153,6 +154,8 @@ def __init__(
API requests. If ``None``, then default info will be used.
Generally, you only need to set this if you're developing
your own client library.
+ always_use_jwt_access (Optional[bool]): Whether self signed JWT should
+ be used for service account credentials.
Raises:
google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport
@@ -205,7 +208,7 @@ def __init__(
scopes=scopes,
quota_project_id=quota_project_id,
client_info=client_info,
- always_use_jwt_access=True,
+ always_use_jwt_access=always_use_jwt_access,
)
if not self._grpc_channel:
diff --git a/owl-bot-staging/v1/.coveragerc b/owl-bot-staging/v1/.coveragerc
deleted file mode 100644
index 3bb19f7..0000000
--- a/owl-bot-staging/v1/.coveragerc
+++ /dev/null
@@ -1,17 +0,0 @@
-[run]
-branch = True
-
-[report]
-show_missing = True
-omit =
- google/cloud/shell/__init__.py
-exclude_lines =
- # Re-enable the standard pragma
- pragma: NO COVER
- # Ignore debug-only repr
- def __repr__
- # Ignore pkg_resources exceptions.
- # This is added at the module level as a safeguard for if someone
- # generates the code and tries to run it without pip installing. This
- # makes it virtually impossible to test properly.
- except pkg_resources.DistributionNotFound
diff --git a/owl-bot-staging/v1/MANIFEST.in b/owl-bot-staging/v1/MANIFEST.in
deleted file mode 100644
index c025a8e..0000000
--- a/owl-bot-staging/v1/MANIFEST.in
+++ /dev/null
@@ -1,2 +0,0 @@
-recursive-include google/cloud/shell *.py
-recursive-include google/cloud/shell_v1 *.py
diff --git a/owl-bot-staging/v1/README.rst b/owl-bot-staging/v1/README.rst
deleted file mode 100644
index 516d30f..0000000
--- a/owl-bot-staging/v1/README.rst
+++ /dev/null
@@ -1,49 +0,0 @@
-Python Client for Google Cloud Shell API
-=================================================
-
-Quick Start
------------
-
-In order to use this library, you first need to go through the following steps:
-
-1. `Select or create a Cloud Platform project.`_
-2. `Enable billing for your project.`_
-3. Enable the Google Cloud Shell API.
-4. `Setup Authentication.`_
-
-.. _Select or create a Cloud Platform project.: https://console.cloud.google.com/project
-.. _Enable billing for your project.: https://cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project
-.. _Setup Authentication.: https://googleapis.dev/python/google-api-core/latest/auth.html
-
-Installation
-~~~~~~~~~~~~
-
-Install this library in a `virtualenv`_ using pip. `virtualenv`_ is a tool to
-create isolated Python environments. The basic problem it addresses is one of
-dependencies and versions, and indirectly permissions.
-
-With `virtualenv`_, it's possible to install this library without needing system
-install permissions, and without clashing with the installed system
-dependencies.
-
-.. _`virtualenv`: https://virtualenv.pypa.io/en/latest/
-
-
-Mac/Linux
-^^^^^^^^^
-
-.. code-block:: console
-
- python3 -m venv
- source /bin/activate
- /bin/pip install /path/to/library
-
-
-Windows
-^^^^^^^
-
-.. code-block:: console
-
- python3 -m venv
- \Scripts\activate
- \Scripts\pip.exe install \path\to\library
diff --git a/owl-bot-staging/v1/docs/conf.py b/owl-bot-staging/v1/docs/conf.py
deleted file mode 100644
index 5029b4e..0000000
--- a/owl-bot-staging/v1/docs/conf.py
+++ /dev/null
@@ -1,376 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
-#
-# google-cloud-shell documentation build configuration file
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-import shlex
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath(".."))
-
-__version__ = "0.1.0"
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-needs_sphinx = "1.6.3"
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
- "sphinx.ext.autodoc",
- "sphinx.ext.autosummary",
- "sphinx.ext.intersphinx",
- "sphinx.ext.coverage",
- "sphinx.ext.napoleon",
- "sphinx.ext.todo",
- "sphinx.ext.viewcode",
-]
-
-# autodoc/autosummary flags
-autoclass_content = "both"
-autodoc_default_flags = ["members"]
-autosummary_generate = True
-
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ["_templates"]
-
-# Allow markdown includes (so releases.md can include CHANGLEOG.md)
-# http://www.sphinx-doc.org/en/master/markdown.html
-source_parsers = {".md": "recommonmark.parser.CommonMarkParser"}
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-source_suffix = [".rst", ".md"]
-
-# The encoding of source files.
-# source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = "index"
-
-# General information about the project.
-project = u"google-cloud-shell"
-copyright = u"2020, Google, LLC"
-author = u"Google APIs" # TODO: autogenerate this bit
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The full version, including alpha/beta/rc tags.
-release = __version__
-# The short X.Y version.
-version = ".".join(release.split(".")[0:2])
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = None
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-# today = ''
-# Else, today_fmt is used as the format for a strftime call.
-# today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ["_build"]
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-# default_role = None
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-# add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-# add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-# show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = "sphinx"
-
-# A list of ignored prefixes for module index sorting.
-# modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-# keep_warnings = False
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = True
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-html_theme = "alabaster"
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-html_theme_options = {
- "description": "Google Cloud Client Libraries for Python",
- "github_user": "googleapis",
- "github_repo": "google-cloud-python",
- "github_banner": True,
- "font_family": "'Roboto', Georgia, sans",
- "head_font_family": "'Roboto', Georgia, serif",
- "code_font_family": "'Roboto Mono', 'Consolas', monospace",
-}
-
-# Add any paths that contain custom themes here, relative to this directory.
-# html_theme_path = []
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# " v documentation".
-# html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-# html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-# html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-# html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ["_static"]
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-# html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-# html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-# html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-# html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-# html_additional_pages = {}
-
-# If false, no module index is generated.
-# html_domain_indices = True
-
-# If false, no index is generated.
-# html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-# html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-# html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-# html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-# html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-# html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-# html_file_suffix = None
-
-# Language to be used for generating the HTML full-text search index.
-# Sphinx supports the following languages:
-# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
-# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
-# html_search_language = 'en'
-
-# A dictionary with options for the search language support, empty by default.
-# Now only 'ja' uses this config value
-# html_search_options = {'type': 'default'}
-
-# The name of a javascript file (relative to the configuration directory) that
-# implements a search results scorer. If empty, the default will be used.
-# html_search_scorer = 'scorer.js'
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = "google-cloud-shell-doc"
-
-# -- Options for warnings ------------------------------------------------------
-
-
-suppress_warnings = [
- # Temporarily suppress this to avoid "more than one target found for
- # cross-reference" warning, which are intractable for us to avoid while in
- # a mono-repo.
- # See https://github.com/sphinx-doc/sphinx/blob
- # /2a65ffeef5c107c19084fabdd706cdff3f52d93c/sphinx/domains/python.py#L843
- "ref.python"
-]
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- # 'papersize': 'letterpaper',
- # The font size ('10pt', '11pt' or '12pt').
- # 'pointsize': '10pt',
- # Additional stuff for the LaTeX preamble.
- # 'preamble': '',
- # Latex figure (float) alignment
- # 'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (
- master_doc,
- "google-cloud-shell.tex",
- u"google-cloud-shell Documentation",
- author,
- "manual",
- )
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-# latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-# latex_use_parts = False
-
-# If true, show page references after internal links.
-# latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-# latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-# latex_appendices = []
-
-# If false, no module index is generated.
-# latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (
- master_doc,
- "google-cloud-shell",
- u"Google Cloud Shell Documentation",
- [author],
- 1,
- )
-]
-
-# If true, show URL addresses after external links.
-# man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (
- master_doc,
- "google-cloud-shell",
- u"google-cloud-shell Documentation",
- author,
- "google-cloud-shell",
- "GAPIC library for Google Cloud Shell API",
- "APIs",
- )
-]
-
-# Documents to append as an appendix to all manuals.
-# texinfo_appendices = []
-
-# If false, no module index is generated.
-# texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-# texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-# texinfo_no_detailmenu = False
-
-
-# Example configuration for intersphinx: refer to the Python standard library.
-intersphinx_mapping = {
- "python": ("http://python.readthedocs.org/en/latest/", None),
- "gax": ("https://gax-python.readthedocs.org/en/latest/", None),
- "google-auth": ("https://google-auth.readthedocs.io/en/stable", None),
- "google-gax": ("https://gax-python.readthedocs.io/en/latest/", None),
- "google.api_core": ("https://googleapis.dev/python/google-api-core/latest/", None),
- "grpc": ("https://grpc.io/grpc/python/", None),
- "requests": ("http://requests.kennethreitz.org/en/stable/", None),
- "proto": ("https://proto-plus-python.readthedocs.io/en/stable", None),
- "protobuf": ("https://googleapis.dev/python/protobuf/latest/", None),
-}
-
-
-# Napoleon settings
-napoleon_google_docstring = True
-napoleon_numpy_docstring = True
-napoleon_include_private_with_doc = False
-napoleon_include_special_with_doc = True
-napoleon_use_admonition_for_examples = False
-napoleon_use_admonition_for_notes = False
-napoleon_use_admonition_for_references = False
-napoleon_use_ivar = False
-napoleon_use_param = True
-napoleon_use_rtype = True
diff --git a/owl-bot-staging/v1/docs/index.rst b/owl-bot-staging/v1/docs/index.rst
deleted file mode 100644
index 4640279..0000000
--- a/owl-bot-staging/v1/docs/index.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-API Reference
--------------
-.. toctree::
- :maxdepth: 2
-
- shell_v1/services
- shell_v1/types
diff --git a/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst b/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
deleted file mode 100644
index 9f5f8db..0000000
--- a/owl-bot-staging/v1/docs/shell_v1/cloud_shell_service.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-CloudShellService
------------------------------------
-
-.. automodule:: google.cloud.shell_v1.services.cloud_shell_service
- :members:
- :inherited-members:
diff --git a/owl-bot-staging/v1/docs/shell_v1/services.rst b/owl-bot-staging/v1/docs/shell_v1/services.rst
deleted file mode 100644
index f08d568..0000000
--- a/owl-bot-staging/v1/docs/shell_v1/services.rst
+++ /dev/null
@@ -1,6 +0,0 @@
-Services for Google Cloud Shell v1 API
-======================================
-.. toctree::
- :maxdepth: 2
-
- cloud_shell_service
diff --git a/owl-bot-staging/v1/docs/shell_v1/types.rst b/owl-bot-staging/v1/docs/shell_v1/types.rst
deleted file mode 100644
index 5324b54..0000000
--- a/owl-bot-staging/v1/docs/shell_v1/types.rst
+++ /dev/null
@@ -1,7 +0,0 @@
-Types for Google Cloud Shell v1 API
-===================================
-
-.. automodule:: google.cloud.shell_v1.types
- :members:
- :undoc-members:
- :show-inheritance:
diff --git a/owl-bot-staging/v1/google/cloud/shell/__init__.py b/owl-bot-staging/v1/google/cloud/shell/__init__.py
deleted file mode 100644
index fedb483..0000000
--- a/owl-bot-staging/v1/google/cloud/shell/__init__.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 google.cloud.shell_v1.services.cloud_shell_service.client import CloudShellServiceClient
-from google.cloud.shell_v1.services.cloud_shell_service.async_client import CloudShellServiceAsyncClient
-
-from google.cloud.shell_v1.types.cloudshell import AddPublicKeyMetadata
-from google.cloud.shell_v1.types.cloudshell import AddPublicKeyRequest
-from google.cloud.shell_v1.types.cloudshell import AddPublicKeyResponse
-from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentMetadata
-from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentRequest
-from google.cloud.shell_v1.types.cloudshell import AuthorizeEnvironmentResponse
-from google.cloud.shell_v1.types.cloudshell import CloudShellErrorDetails
-from google.cloud.shell_v1.types.cloudshell import CreateEnvironmentMetadata
-from google.cloud.shell_v1.types.cloudshell import DeleteEnvironmentMetadata
-from google.cloud.shell_v1.types.cloudshell import Environment
-from google.cloud.shell_v1.types.cloudshell import GetEnvironmentRequest
-from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyMetadata
-from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyRequest
-from google.cloud.shell_v1.types.cloudshell import RemovePublicKeyResponse
-from google.cloud.shell_v1.types.cloudshell import StartEnvironmentMetadata
-from google.cloud.shell_v1.types.cloudshell import StartEnvironmentRequest
-from google.cloud.shell_v1.types.cloudshell import StartEnvironmentResponse
-
-__all__ = ('CloudShellServiceClient',
- 'CloudShellServiceAsyncClient',
- 'AddPublicKeyMetadata',
- 'AddPublicKeyRequest',
- 'AddPublicKeyResponse',
- 'AuthorizeEnvironmentMetadata',
- 'AuthorizeEnvironmentRequest',
- 'AuthorizeEnvironmentResponse',
- 'CloudShellErrorDetails',
- 'CreateEnvironmentMetadata',
- 'DeleteEnvironmentMetadata',
- 'Environment',
- 'GetEnvironmentRequest',
- 'RemovePublicKeyMetadata',
- 'RemovePublicKeyRequest',
- 'RemovePublicKeyResponse',
- 'StartEnvironmentMetadata',
- 'StartEnvironmentRequest',
- 'StartEnvironmentResponse',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell/py.typed b/owl-bot-staging/v1/google/cloud/shell/py.typed
deleted file mode 100644
index 8def83e..0000000
--- a/owl-bot-staging/v1/google/cloud/shell/py.typed
+++ /dev/null
@@ -1,2 +0,0 @@
-# Marker file for PEP 561.
-# The google-cloud-shell package uses inline types.
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
deleted file mode 100644
index 5a65b6d..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/__init__.py
+++ /dev/null
@@ -1,58 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 .services.cloud_shell_service import CloudShellServiceClient
-from .services.cloud_shell_service import CloudShellServiceAsyncClient
-
-from .types.cloudshell import AddPublicKeyMetadata
-from .types.cloudshell import AddPublicKeyRequest
-from .types.cloudshell import AddPublicKeyResponse
-from .types.cloudshell import AuthorizeEnvironmentMetadata
-from .types.cloudshell import AuthorizeEnvironmentRequest
-from .types.cloudshell import AuthorizeEnvironmentResponse
-from .types.cloudshell import CloudShellErrorDetails
-from .types.cloudshell import CreateEnvironmentMetadata
-from .types.cloudshell import DeleteEnvironmentMetadata
-from .types.cloudshell import Environment
-from .types.cloudshell import GetEnvironmentRequest
-from .types.cloudshell import RemovePublicKeyMetadata
-from .types.cloudshell import RemovePublicKeyRequest
-from .types.cloudshell import RemovePublicKeyResponse
-from .types.cloudshell import StartEnvironmentMetadata
-from .types.cloudshell import StartEnvironmentRequest
-from .types.cloudshell import StartEnvironmentResponse
-
-__all__ = (
- 'CloudShellServiceAsyncClient',
-'AddPublicKeyMetadata',
-'AddPublicKeyRequest',
-'AddPublicKeyResponse',
-'AuthorizeEnvironmentMetadata',
-'AuthorizeEnvironmentRequest',
-'AuthorizeEnvironmentResponse',
-'CloudShellErrorDetails',
-'CloudShellServiceClient',
-'CreateEnvironmentMetadata',
-'DeleteEnvironmentMetadata',
-'Environment',
-'GetEnvironmentRequest',
-'RemovePublicKeyMetadata',
-'RemovePublicKeyRequest',
-'RemovePublicKeyResponse',
-'StartEnvironmentMetadata',
-'StartEnvironmentRequest',
-'StartEnvironmentResponse',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json b/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
deleted file mode 100644
index c42b8b6..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/gapic_metadata.json
+++ /dev/null
@@ -1,73 +0,0 @@
- {
- "comment": "This file maps proto services/RPCs to the corresponding library clients/methods",
- "language": "python",
- "libraryPackage": "google.cloud.shell_v1",
- "protoPackage": "google.cloud.shell.v1",
- "schema": "1.0",
- "services": {
- "CloudShellService": {
- "clients": {
- "grpc": {
- "libraryClient": "CloudShellServiceClient",
- "rpcs": {
- "AddPublicKey": {
- "methods": [
- "add_public_key"
- ]
- },
- "AuthorizeEnvironment": {
- "methods": [
- "authorize_environment"
- ]
- },
- "GetEnvironment": {
- "methods": [
- "get_environment"
- ]
- },
- "RemovePublicKey": {
- "methods": [
- "remove_public_key"
- ]
- },
- "StartEnvironment": {
- "methods": [
- "start_environment"
- ]
- }
- }
- },
- "grpc-async": {
- "libraryClient": "CloudShellServiceAsyncClient",
- "rpcs": {
- "AddPublicKey": {
- "methods": [
- "add_public_key"
- ]
- },
- "AuthorizeEnvironment": {
- "methods": [
- "authorize_environment"
- ]
- },
- "GetEnvironment": {
- "methods": [
- "get_environment"
- ]
- },
- "RemovePublicKey": {
- "methods": [
- "remove_public_key"
- ]
- },
- "StartEnvironment": {
- "methods": [
- "start_environment"
- ]
- }
- }
- }
- }
- }
- }
-}
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/py.typed b/owl-bot-staging/v1/google/cloud/shell_v1/py.typed
deleted file mode 100644
index 8def83e..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/py.typed
+++ /dev/null
@@ -1,2 +0,0 @@
-# Marker file for PEP 561.
-# The google-cloud-shell package uses inline types.
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
deleted file mode 100644
index 4de6597..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/__init__.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
deleted file mode 100644
index fa696fc..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/__init__.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 .client import CloudShellServiceClient
-from .async_client import CloudShellServiceAsyncClient
-
-__all__ = (
- 'CloudShellServiceClient',
- 'CloudShellServiceAsyncClient',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
deleted file mode 100644
index 8af665d..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/async_client.py
+++ /dev/null
@@ -1,540 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 collections import OrderedDict
-import functools
-import re
-from typing import Dict, Sequence, Tuple, Type, Union
-import pkg_resources
-
-import google.api_core.client_options as ClientOptions # type: ignore
-from google.api_core import exceptions as core_exceptions # type: ignore
-from google.api_core import gapic_v1 # type: ignore
-from google.api_core import retry as retries # type: ignore
-from google.auth import credentials as ga_credentials # type: ignore
-from google.oauth2 import service_account # type: ignore
-
-from google.api_core import operation # type: ignore
-from google.api_core import operation_async # type: ignore
-from google.cloud.shell_v1.types import cloudshell
-from .transports.base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
-from .transports.grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
-from .client import CloudShellServiceClient
-
-
-class CloudShellServiceAsyncClient:
- """API for interacting with Google Cloud Shell. Each user of
- Cloud Shell has at least one environment, which has the ID
- "default". Environment consists of a Docker image defining what
- is installed on the environment and a home directory containing
- the user's data that will remain across sessions. Clients use
- this API to start and fetch information about their environment,
- which can then be used to connect to that environment via a
- separate SSH client.
- """
-
- _client: CloudShellServiceClient
-
- DEFAULT_ENDPOINT = CloudShellServiceClient.DEFAULT_ENDPOINT
- DEFAULT_MTLS_ENDPOINT = CloudShellServiceClient.DEFAULT_MTLS_ENDPOINT
-
- environment_path = staticmethod(CloudShellServiceClient.environment_path)
- parse_environment_path = staticmethod(CloudShellServiceClient.parse_environment_path)
- common_billing_account_path = staticmethod(CloudShellServiceClient.common_billing_account_path)
- parse_common_billing_account_path = staticmethod(CloudShellServiceClient.parse_common_billing_account_path)
- common_folder_path = staticmethod(CloudShellServiceClient.common_folder_path)
- parse_common_folder_path = staticmethod(CloudShellServiceClient.parse_common_folder_path)
- common_organization_path = staticmethod(CloudShellServiceClient.common_organization_path)
- parse_common_organization_path = staticmethod(CloudShellServiceClient.parse_common_organization_path)
- common_project_path = staticmethod(CloudShellServiceClient.common_project_path)
- parse_common_project_path = staticmethod(CloudShellServiceClient.parse_common_project_path)
- common_location_path = staticmethod(CloudShellServiceClient.common_location_path)
- parse_common_location_path = staticmethod(CloudShellServiceClient.parse_common_location_path)
-
- @classmethod
- def from_service_account_info(cls, info: dict, *args, **kwargs):
- """Creates an instance of this client using the provided credentials
- info.
-
- Args:
- info (dict): The service account private key info.
- args: Additional arguments to pass to the constructor.
- kwargs: Additional arguments to pass to the constructor.
-
- Returns:
- CloudShellServiceAsyncClient: The constructed client.
- """
- return CloudShellServiceClient.from_service_account_info.__func__(CloudShellServiceAsyncClient, info, *args, **kwargs) # type: ignore
-
- @classmethod
- def from_service_account_file(cls, filename: str, *args, **kwargs):
- """Creates an instance of this client using the provided credentials
- file.
-
- Args:
- filename (str): The path to the service account private key json
- file.
- args: Additional arguments to pass to the constructor.
- kwargs: Additional arguments to pass to the constructor.
-
- Returns:
- CloudShellServiceAsyncClient: The constructed client.
- """
- return CloudShellServiceClient.from_service_account_file.__func__(CloudShellServiceAsyncClient, filename, *args, **kwargs) # type: ignore
-
- from_service_account_json = from_service_account_file
-
- @property
- def transport(self) -> CloudShellServiceTransport:
- """Returns the transport used by the client instance.
-
- Returns:
- CloudShellServiceTransport: The transport used by the client instance.
- """
- return self._client.transport
-
- get_transport_class = functools.partial(type(CloudShellServiceClient).get_transport_class, type(CloudShellServiceClient))
-
- def __init__(self, *,
- credentials: ga_credentials.Credentials = None,
- transport: Union[str, CloudShellServiceTransport] = "grpc_asyncio",
- client_options: ClientOptions = None,
- client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
- ) -> None:
- """Instantiates the cloud shell service client.
-
- Args:
- credentials (Optional[google.auth.credentials.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify the application to the service; if none
- are specified, the client will attempt to ascertain the
- credentials from the environment.
- transport (Union[str, ~.CloudShellServiceTransport]): The
- transport to use. If set to None, a transport is chosen
- automatically.
- client_options (ClientOptions): Custom options for the client. It
- won't take effect if a ``transport`` instance is provided.
- (1) The ``api_endpoint`` property can be used to override the
- default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT
- environment variable can also be used to override the endpoint:
- "always" (always use the default mTLS endpoint), "never" (always
- use the default regular endpoint) and "auto" (auto switch to the
- default mTLS endpoint if client certificate is present, this is
- the default value). However, the ``api_endpoint`` property takes
- precedence if provided.
- (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable
- is "true", then the ``client_cert_source`` property can be used
- to provide client certificate for mutual TLS transport. If
- not provided, the default SSL client certificate will be used if
- present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not
- set, no client certificate will be used.
-
- Raises:
- google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport
- creation failed for any reason.
- """
- self._client = CloudShellServiceClient(
- credentials=credentials,
- transport=transport,
- client_options=client_options,
- client_info=client_info,
-
- )
-
- async def get_environment(self,
- request: cloudshell.GetEnvironmentRequest = None,
- *,
- name: str = None,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> cloudshell.Environment:
- r"""Gets an environment. Returns NOT_FOUND if the environment does
- not exist.
-
- Args:
- request (:class:`google.cloud.shell_v1.types.GetEnvironmentRequest`):
- The request object. Request message for
- [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
- name (:class:`str`):
- Required. Name of the requested resource, for example
- ``users/me/environments/default`` or
- ``users/someone@example.com/environments/default``.
-
- This corresponds to the ``name`` field
- on the ``request`` instance; if ``request`` is provided, this
- should not be set.
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.cloud.shell_v1.types.Environment:
- A Cloud Shell environment, which is
- defined as the combination of a Docker
- image specifying what is installed on
- the environment and a home directory
- containing the user's data that will
- remain across sessions. Each user has at
- least an environment with the ID
- "default".
-
- """
- # Create or coerce a protobuf request object.
- # Sanity check: If we got a request object, we should *not* have
- # gotten any keyword arguments that map to the request.
- has_flattened_params = any([name])
- if request is not None and has_flattened_params:
- raise ValueError("If the `request` argument is set, then none of "
- "the individual field arguments should be set.")
-
- request = cloudshell.GetEnvironmentRequest(request)
-
- # If we have keyword arguments corresponding to fields on the
- # request, apply these.
- if name is not None:
- request.name = name
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = gapic_v1.method_async.wrap_method(
- self._client._transport.get_environment,
- default_retry=retries.Retry(
-initial=1.0,maximum=60.0,multiplier=1.3, predicate=retries.if_exception_type(
- core_exceptions.ServiceUnavailable,
- core_exceptions.Unknown,
- ),
- deadline=60.0,
- ),
- default_timeout=60.0,
- client_info=DEFAULT_CLIENT_INFO,
- )
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = await rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Done; return the response.
- return response
-
- async def start_environment(self,
- request: cloudshell.StartEnvironmentRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation_async.AsyncOperation:
- r"""Starts an existing environment, allowing clients to
- connect to it. The returned operation will contain an
- instance of StartEnvironmentMetadata in its metadata
- field. Users can wait for the environment to start by
- polling this operation via GetOperation. Once the
- environment has finished starting and is ready to accept
- connections, the operation will contain a
- StartEnvironmentResponse in its response field.
-
- Args:
- request (:class:`google.cloud.shell_v1.types.StartEnvironmentRequest`):
- The request object. Request message for
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation_async.AsyncOperation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.StartEnvironmentResponse` Message included in the response field of operations returned from
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
- once the operation is complete.
-
- """
- # Create or coerce a protobuf request object.
- request = cloudshell.StartEnvironmentRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = gapic_v1.method_async.wrap_method(
- self._client._transport.start_environment,
- default_timeout=60.0,
- client_info=DEFAULT_CLIENT_INFO,
- )
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = await rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation_async.from_gapic(
- response,
- self._client._transport.operations_client,
- cloudshell.StartEnvironmentResponse,
- metadata_type=cloudshell.StartEnvironmentMetadata,
- )
-
- # Done; return the response.
- return response
-
- async def authorize_environment(self,
- request: cloudshell.AuthorizeEnvironmentRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation_async.AsyncOperation:
- r"""Sends OAuth credentials to a running environment on
- behalf of a user. When this completes, the environment
- will be authorized to run various Google Cloud command
- line tools without requiring the user to manually
- authenticate.
-
- Args:
- request (:class:`google.cloud.shell_v1.types.AuthorizeEnvironmentRequest`):
- The request object. Request message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation_async.AsyncOperation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.AuthorizeEnvironmentResponse` Response message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
-
- """
- # Create or coerce a protobuf request object.
- request = cloudshell.AuthorizeEnvironmentRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = gapic_v1.method_async.wrap_method(
- self._client._transport.authorize_environment,
- default_timeout=60.0,
- client_info=DEFAULT_CLIENT_INFO,
- )
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = await rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation_async.from_gapic(
- response,
- self._client._transport.operations_client,
- cloudshell.AuthorizeEnvironmentResponse,
- metadata_type=cloudshell.AuthorizeEnvironmentMetadata,
- )
-
- # Done; return the response.
- return response
-
- async def add_public_key(self,
- request: cloudshell.AddPublicKeyRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation_async.AsyncOperation:
- r"""Adds a public SSH key to an environment, allowing clients with
- the corresponding private key to connect to that environment via
- SSH. If a key with the same content already exists, this will
- error with ALREADY_EXISTS.
-
- Args:
- request (:class:`google.cloud.shell_v1.types.AddPublicKeyRequest`):
- The request object. Request message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation_async.AsyncOperation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.AddPublicKeyResponse` Response message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
-
- """
- # Create or coerce a protobuf request object.
- request = cloudshell.AddPublicKeyRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = gapic_v1.method_async.wrap_method(
- self._client._transport.add_public_key,
- default_timeout=60.0,
- client_info=DEFAULT_CLIENT_INFO,
- )
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("environment", request.environment),
- )),
- )
-
- # Send the request.
- response = await rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation_async.from_gapic(
- response,
- self._client._transport.operations_client,
- cloudshell.AddPublicKeyResponse,
- metadata_type=cloudshell.AddPublicKeyMetadata,
- )
-
- # Done; return the response.
- return response
-
- async def remove_public_key(self,
- request: cloudshell.RemovePublicKeyRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation_async.AsyncOperation:
- r"""Removes a public SSH key from an environment. Clients will no
- longer be able to connect to the environment using the
- corresponding private key. If a key with the same content is not
- present, this will error with NOT_FOUND.
-
- Args:
- request (:class:`google.cloud.shell_v1.types.RemovePublicKeyRequest`):
- The request object. Request message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation_async.AsyncOperation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.RemovePublicKeyResponse` Response message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
-
- """
- # Create or coerce a protobuf request object.
- request = cloudshell.RemovePublicKeyRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = gapic_v1.method_async.wrap_method(
- self._client._transport.remove_public_key,
- default_timeout=60.0,
- client_info=DEFAULT_CLIENT_INFO,
- )
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("environment", request.environment),
- )),
- )
-
- # Send the request.
- response = await rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation_async.from_gapic(
- response,
- self._client._transport.operations_client,
- cloudshell.RemovePublicKeyResponse,
- metadata_type=cloudshell.RemovePublicKeyMetadata,
- )
-
- # Done; return the response.
- return response
-
-
-
-
-
-try:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
- gapic_version=pkg_resources.get_distribution(
- "google-cloud-shell",
- ).version,
- )
-except pkg_resources.DistributionNotFound:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
-
-
-__all__ = (
- "CloudShellServiceAsyncClient",
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
deleted file mode 100644
index 67f0b94..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/client.py
+++ /dev/null
@@ -1,724 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 collections import OrderedDict
-from distutils import util
-import os
-import re
-from typing import Callable, Dict, Optional, Sequence, Tuple, Type, Union
-import pkg_resources
-
-from google.api_core import client_options as client_options_lib # type: ignore
-from google.api_core import exceptions as core_exceptions # type: ignore
-from google.api_core import gapic_v1 # type: ignore
-from google.api_core import retry as retries # type: ignore
-from google.auth import credentials as ga_credentials # type: ignore
-from google.auth.transport import mtls # type: ignore
-from google.auth.transport.grpc import SslCredentials # type: ignore
-from google.auth.exceptions import MutualTLSChannelError # type: ignore
-from google.oauth2 import service_account # type: ignore
-
-from google.api_core import operation # type: ignore
-from google.api_core import operation_async # type: ignore
-from google.cloud.shell_v1.types import cloudshell
-from .transports.base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
-from .transports.grpc import CloudShellServiceGrpcTransport
-from .transports.grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
-
-
-class CloudShellServiceClientMeta(type):
- """Metaclass for the CloudShellService client.
-
- This provides class-level methods for building and retrieving
- support objects (e.g. transport) without polluting the client instance
- objects.
- """
- _transport_registry = OrderedDict() # type: Dict[str, Type[CloudShellServiceTransport]]
- _transport_registry["grpc"] = CloudShellServiceGrpcTransport
- _transport_registry["grpc_asyncio"] = CloudShellServiceGrpcAsyncIOTransport
-
- def get_transport_class(cls,
- label: str = None,
- ) -> Type[CloudShellServiceTransport]:
- """Returns an appropriate transport class.
-
- Args:
- label: The name of the desired transport. If none is
- provided, then the first transport in the registry is used.
-
- Returns:
- The transport class to use.
- """
- # If a specific transport is requested, return that one.
- if label:
- return cls._transport_registry[label]
-
- # No transport is requested; return the default (that is, the first one
- # in the dictionary).
- return next(iter(cls._transport_registry.values()))
-
-
-class CloudShellServiceClient(metaclass=CloudShellServiceClientMeta):
- """API for interacting with Google Cloud Shell. Each user of
- Cloud Shell has at least one environment, which has the ID
- "default". Environment consists of a Docker image defining what
- is installed on the environment and a home directory containing
- the user's data that will remain across sessions. Clients use
- this API to start and fetch information about their environment,
- which can then be used to connect to that environment via a
- separate SSH client.
- """
-
- @staticmethod
- def _get_default_mtls_endpoint(api_endpoint):
- """Converts api endpoint to mTLS endpoint.
-
- Convert "*.sandbox.googleapis.com" and "*.googleapis.com" to
- "*.mtls.sandbox.googleapis.com" and "*.mtls.googleapis.com" respectively.
- Args:
- api_endpoint (Optional[str]): the api endpoint to convert.
- Returns:
- str: converted mTLS api endpoint.
- """
- if not api_endpoint:
- return api_endpoint
-
- mtls_endpoint_re = re.compile(
- r"(?P[^.]+)(?P\.mtls)?(?P\.sandbox)?(?P\.googleapis\.com)?"
- )
-
- m = mtls_endpoint_re.match(api_endpoint)
- name, mtls, sandbox, googledomain = m.groups()
- if mtls or not googledomain:
- return api_endpoint
-
- if sandbox:
- return api_endpoint.replace(
- "sandbox.googleapis.com", "mtls.sandbox.googleapis.com"
- )
-
- return api_endpoint.replace(".googleapis.com", ".mtls.googleapis.com")
-
- DEFAULT_ENDPOINT = "cloudshell.googleapis.com"
- DEFAULT_MTLS_ENDPOINT = _get_default_mtls_endpoint.__func__( # type: ignore
- DEFAULT_ENDPOINT
- )
-
- @classmethod
- def from_service_account_info(cls, info: dict, *args, **kwargs):
- """Creates an instance of this client using the provided credentials
- info.
-
- Args:
- info (dict): The service account private key info.
- args: Additional arguments to pass to the constructor.
- kwargs: Additional arguments to pass to the constructor.
-
- Returns:
- CloudShellServiceClient: The constructed client.
- """
- credentials = service_account.Credentials.from_service_account_info(info)
- kwargs["credentials"] = credentials
- return cls(*args, **kwargs)
-
- @classmethod
- def from_service_account_file(cls, filename: str, *args, **kwargs):
- """Creates an instance of this client using the provided credentials
- file.
-
- Args:
- filename (str): The path to the service account private key json
- file.
- args: Additional arguments to pass to the constructor.
- kwargs: Additional arguments to pass to the constructor.
-
- Returns:
- CloudShellServiceClient: The constructed client.
- """
- credentials = service_account.Credentials.from_service_account_file(
- filename)
- kwargs["credentials"] = credentials
- return cls(*args, **kwargs)
-
- from_service_account_json = from_service_account_file
-
- @property
- def transport(self) -> CloudShellServiceTransport:
- """Returns the transport used by the client instance.
-
- Returns:
- CloudShellServiceTransport: The transport used by the client
- instance.
- """
- return self._transport
-
- @staticmethod
- def environment_path(user: str,environment: str,) -> str:
- """Returns a fully-qualified environment string."""
- return "users/{user}/environments/{environment}".format(user=user, environment=environment, )
-
- @staticmethod
- def parse_environment_path(path: str) -> Dict[str,str]:
- """Parses a environment path into its component segments."""
- m = re.match(r"^users/(?P.+?)/environments/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- @staticmethod
- def common_billing_account_path(billing_account: str, ) -> str:
- """Returns a fully-qualified billing_account string."""
- return "billingAccounts/{billing_account}".format(billing_account=billing_account, )
-
- @staticmethod
- def parse_common_billing_account_path(path: str) -> Dict[str,str]:
- """Parse a billing_account path into its component segments."""
- m = re.match(r"^billingAccounts/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- @staticmethod
- def common_folder_path(folder: str, ) -> str:
- """Returns a fully-qualified folder string."""
- return "folders/{folder}".format(folder=folder, )
-
- @staticmethod
- def parse_common_folder_path(path: str) -> Dict[str,str]:
- """Parse a folder path into its component segments."""
- m = re.match(r"^folders/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- @staticmethod
- def common_organization_path(organization: str, ) -> str:
- """Returns a fully-qualified organization string."""
- return "organizations/{organization}".format(organization=organization, )
-
- @staticmethod
- def parse_common_organization_path(path: str) -> Dict[str,str]:
- """Parse a organization path into its component segments."""
- m = re.match(r"^organizations/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- @staticmethod
- def common_project_path(project: str, ) -> str:
- """Returns a fully-qualified project string."""
- return "projects/{project}".format(project=project, )
-
- @staticmethod
- def parse_common_project_path(path: str) -> Dict[str,str]:
- """Parse a project path into its component segments."""
- m = re.match(r"^projects/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- @staticmethod
- def common_location_path(project: str, location: str, ) -> str:
- """Returns a fully-qualified location string."""
- return "projects/{project}/locations/{location}".format(project=project, location=location, )
-
- @staticmethod
- def parse_common_location_path(path: str) -> Dict[str,str]:
- """Parse a location path into its component segments."""
- m = re.match(r"^projects/(?P.+?)/locations/(?P.+?)$", path)
- return m.groupdict() if m else {}
-
- def __init__(self, *,
- credentials: Optional[ga_credentials.Credentials] = None,
- transport: Union[str, CloudShellServiceTransport, None] = None,
- client_options: Optional[client_options_lib.ClientOptions] = None,
- client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
- ) -> None:
- """Instantiates the cloud shell service client.
-
- Args:
- credentials (Optional[google.auth.credentials.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify the application to the service; if none
- are specified, the client will attempt to ascertain the
- credentials from the environment.
- transport (Union[str, CloudShellServiceTransport]): The
- transport to use. If set to None, a transport is chosen
- automatically.
- client_options (google.api_core.client_options.ClientOptions): Custom options for the
- client. It won't take effect if a ``transport`` instance is provided.
- (1) The ``api_endpoint`` property can be used to override the
- default endpoint provided by the client. GOOGLE_API_USE_MTLS_ENDPOINT
- environment variable can also be used to override the endpoint:
- "always" (always use the default mTLS endpoint), "never" (always
- use the default regular endpoint) and "auto" (auto switch to the
- default mTLS endpoint if client certificate is present, this is
- the default value). However, the ``api_endpoint`` property takes
- precedence if provided.
- (2) If GOOGLE_API_USE_CLIENT_CERTIFICATE environment variable
- is "true", then the ``client_cert_source`` property can be used
- to provide client certificate for mutual TLS transport. If
- not provided, the default SSL client certificate will be used if
- present. If GOOGLE_API_USE_CLIENT_CERTIFICATE is "false" or not
- set, no client certificate will be used.
- client_info (google.api_core.gapic_v1.client_info.ClientInfo):
- The client info used to send a user-agent string along with
- API requests. If ``None``, then default info will be used.
- Generally, you only need to set this if you're developing
- your own client library.
-
- Raises:
- google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport
- creation failed for any reason.
- """
- if isinstance(client_options, dict):
- client_options = client_options_lib.from_dict(client_options)
- if client_options is None:
- client_options = client_options_lib.ClientOptions()
-
- # Create SSL credentials for mutual TLS if needed.
- use_client_cert = bool(util.strtobool(os.getenv("GOOGLE_API_USE_CLIENT_CERTIFICATE", "false")))
-
- client_cert_source_func = None
- is_mtls = False
- if use_client_cert:
- if client_options.client_cert_source:
- is_mtls = True
- client_cert_source_func = client_options.client_cert_source
- else:
- is_mtls = mtls.has_default_client_cert_source()
- if is_mtls:
- client_cert_source_func = mtls.default_client_cert_source()
- else:
- client_cert_source_func = None
-
- # Figure out which api endpoint to use.
- if client_options.api_endpoint is not None:
- api_endpoint = client_options.api_endpoint
- else:
- use_mtls_env = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
- if use_mtls_env == "never":
- api_endpoint = self.DEFAULT_ENDPOINT
- elif use_mtls_env == "always":
- api_endpoint = self.DEFAULT_MTLS_ENDPOINT
- elif use_mtls_env == "auto":
- if is_mtls:
- api_endpoint = self.DEFAULT_MTLS_ENDPOINT
- else:
- api_endpoint = self.DEFAULT_ENDPOINT
- else:
- raise MutualTLSChannelError(
- "Unsupported GOOGLE_API_USE_MTLS_ENDPOINT value. Accepted "
- "values: never, auto, always"
- )
-
- # Save or instantiate the transport.
- # Ordinarily, we provide the transport, but allowing a custom transport
- # instance provides an extensibility point for unusual situations.
- if isinstance(transport, CloudShellServiceTransport):
- # transport is a CloudShellServiceTransport instance.
- if credentials or client_options.credentials_file:
- raise ValueError("When providing a transport instance, "
- "provide its credentials directly.")
- if client_options.scopes:
- raise ValueError(
- "When providing a transport instance, provide its scopes "
- "directly."
- )
- self._transport = transport
- else:
- Transport = type(self).get_transport_class(transport)
- self._transport = Transport(
- credentials=credentials,
- credentials_file=client_options.credentials_file,
- host=api_endpoint,
- scopes=client_options.scopes,
- client_cert_source_for_mtls=client_cert_source_func,
- quota_project_id=client_options.quota_project_id,
- client_info=client_info,
- )
-
- def get_environment(self,
- request: cloudshell.GetEnvironmentRequest = None,
- *,
- name: str = None,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> cloudshell.Environment:
- r"""Gets an environment. Returns NOT_FOUND if the environment does
- not exist.
-
- Args:
- request (google.cloud.shell_v1.types.GetEnvironmentRequest):
- The request object. Request message for
- [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
- name (str):
- Required. Name of the requested resource, for example
- ``users/me/environments/default`` or
- ``users/someone@example.com/environments/default``.
-
- This corresponds to the ``name`` field
- on the ``request`` instance; if ``request`` is provided, this
- should not be set.
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.cloud.shell_v1.types.Environment:
- A Cloud Shell environment, which is
- defined as the combination of a Docker
- image specifying what is installed on
- the environment and a home directory
- containing the user's data that will
- remain across sessions. Each user has at
- least an environment with the ID
- "default".
-
- """
- # Create or coerce a protobuf request object.
- # Sanity check: If we got a request object, we should *not* have
- # gotten any keyword arguments that map to the request.
- has_flattened_params = any([name])
- if request is not None and has_flattened_params:
- raise ValueError('If the `request` argument is set, then none of '
- 'the individual field arguments should be set.')
-
- # Minor optimization to avoid making a copy if the user passes
- # in a cloudshell.GetEnvironmentRequest.
- # There's no risk of modifying the input as we've already verified
- # there are no flattened fields.
- if not isinstance(request, cloudshell.GetEnvironmentRequest):
- request = cloudshell.GetEnvironmentRequest(request)
- # If we have keyword arguments corresponding to fields on the
- # request, apply these.
- if name is not None:
- request.name = name
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = self._transport._wrapped_methods[self._transport.get_environment]
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Done; return the response.
- return response
-
- def start_environment(self,
- request: cloudshell.StartEnvironmentRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation.Operation:
- r"""Starts an existing environment, allowing clients to
- connect to it. The returned operation will contain an
- instance of StartEnvironmentMetadata in its metadata
- field. Users can wait for the environment to start by
- polling this operation via GetOperation. Once the
- environment has finished starting and is ready to accept
- connections, the operation will contain a
- StartEnvironmentResponse in its response field.
-
- Args:
- request (google.cloud.shell_v1.types.StartEnvironmentRequest):
- The request object. Request message for
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation.Operation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.StartEnvironmentResponse` Message included in the response field of operations returned from
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
- once the operation is complete.
-
- """
- # Create or coerce a protobuf request object.
- # Minor optimization to avoid making a copy if the user passes
- # in a cloudshell.StartEnvironmentRequest.
- # There's no risk of modifying the input as we've already verified
- # there are no flattened fields.
- if not isinstance(request, cloudshell.StartEnvironmentRequest):
- request = cloudshell.StartEnvironmentRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = self._transport._wrapped_methods[self._transport.start_environment]
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation.from_gapic(
- response,
- self._transport.operations_client,
- cloudshell.StartEnvironmentResponse,
- metadata_type=cloudshell.StartEnvironmentMetadata,
- )
-
- # Done; return the response.
- return response
-
- def authorize_environment(self,
- request: cloudshell.AuthorizeEnvironmentRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation.Operation:
- r"""Sends OAuth credentials to a running environment on
- behalf of a user. When this completes, the environment
- will be authorized to run various Google Cloud command
- line tools without requiring the user to manually
- authenticate.
-
- Args:
- request (google.cloud.shell_v1.types.AuthorizeEnvironmentRequest):
- The request object. Request message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation.Operation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.AuthorizeEnvironmentResponse` Response message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
-
- """
- # Create or coerce a protobuf request object.
- # Minor optimization to avoid making a copy if the user passes
- # in a cloudshell.AuthorizeEnvironmentRequest.
- # There's no risk of modifying the input as we've already verified
- # there are no flattened fields.
- if not isinstance(request, cloudshell.AuthorizeEnvironmentRequest):
- request = cloudshell.AuthorizeEnvironmentRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = self._transport._wrapped_methods[self._transport.authorize_environment]
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("name", request.name),
- )),
- )
-
- # Send the request.
- response = rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation.from_gapic(
- response,
- self._transport.operations_client,
- cloudshell.AuthorizeEnvironmentResponse,
- metadata_type=cloudshell.AuthorizeEnvironmentMetadata,
- )
-
- # Done; return the response.
- return response
-
- def add_public_key(self,
- request: cloudshell.AddPublicKeyRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation.Operation:
- r"""Adds a public SSH key to an environment, allowing clients with
- the corresponding private key to connect to that environment via
- SSH. If a key with the same content already exists, this will
- error with ALREADY_EXISTS.
-
- Args:
- request (google.cloud.shell_v1.types.AddPublicKeyRequest):
- The request object. Request message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation.Operation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.AddPublicKeyResponse` Response message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
-
- """
- # Create or coerce a protobuf request object.
- # Minor optimization to avoid making a copy if the user passes
- # in a cloudshell.AddPublicKeyRequest.
- # There's no risk of modifying the input as we've already verified
- # there are no flattened fields.
- if not isinstance(request, cloudshell.AddPublicKeyRequest):
- request = cloudshell.AddPublicKeyRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = self._transport._wrapped_methods[self._transport.add_public_key]
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("environment", request.environment),
- )),
- )
-
- # Send the request.
- response = rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation.from_gapic(
- response,
- self._transport.operations_client,
- cloudshell.AddPublicKeyResponse,
- metadata_type=cloudshell.AddPublicKeyMetadata,
- )
-
- # Done; return the response.
- return response
-
- def remove_public_key(self,
- request: cloudshell.RemovePublicKeyRequest = None,
- *,
- retry: retries.Retry = gapic_v1.method.DEFAULT,
- timeout: float = None,
- metadata: Sequence[Tuple[str, str]] = (),
- ) -> operation.Operation:
- r"""Removes a public SSH key from an environment. Clients will no
- longer be able to connect to the environment using the
- corresponding private key. If a key with the same content is not
- present, this will error with NOT_FOUND.
-
- Args:
- request (google.cloud.shell_v1.types.RemovePublicKeyRequest):
- The request object. Request message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
- retry (google.api_core.retry.Retry): Designation of what errors, if any,
- should be retried.
- timeout (float): The timeout for this request.
- metadata (Sequence[Tuple[str, str]]): Strings which should be
- sent along with the request as metadata.
-
- Returns:
- google.api_core.operation.Operation:
- An object representing a long-running operation.
-
- The result type for the operation will be :class:`google.cloud.shell_v1.types.RemovePublicKeyResponse` Response message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
-
- """
- # Create or coerce a protobuf request object.
- # Minor optimization to avoid making a copy if the user passes
- # in a cloudshell.RemovePublicKeyRequest.
- # There's no risk of modifying the input as we've already verified
- # there are no flattened fields.
- if not isinstance(request, cloudshell.RemovePublicKeyRequest):
- request = cloudshell.RemovePublicKeyRequest(request)
-
- # Wrap the RPC method; this adds retry and timeout information,
- # and friendly error handling.
- rpc = self._transport._wrapped_methods[self._transport.remove_public_key]
-
- # Certain fields should be provided within the metadata header;
- # add these here.
- metadata = tuple(metadata) + (
- gapic_v1.routing_header.to_grpc_metadata((
- ("environment", request.environment),
- )),
- )
-
- # Send the request.
- response = rpc(
- request,
- retry=retry,
- timeout=timeout,
- metadata=metadata,
- )
-
- # Wrap the response in an operation future.
- response = operation.from_gapic(
- response,
- self._transport.operations_client,
- cloudshell.RemovePublicKeyResponse,
- metadata_type=cloudshell.RemovePublicKeyMetadata,
- )
-
- # Done; return the response.
- return response
-
-
-
-
-
-try:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
- gapic_version=pkg_resources.get_distribution(
- "google-cloud-shell",
- ).version,
- )
-except pkg_resources.DistributionNotFound:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
-
-
-__all__ = (
- "CloudShellServiceClient",
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
deleted file mode 100644
index fef2496..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/__init__.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 collections import OrderedDict
-from typing import Dict, Type
-
-from .base import CloudShellServiceTransport
-from .grpc import CloudShellServiceGrpcTransport
-from .grpc_asyncio import CloudShellServiceGrpcAsyncIOTransport
-
-
-# Compile a registry of transports.
-_transport_registry = OrderedDict() # type: Dict[str, Type[CloudShellServiceTransport]]
-_transport_registry['grpc'] = CloudShellServiceGrpcTransport
-_transport_registry['grpc_asyncio'] = CloudShellServiceGrpcAsyncIOTransport
-
-__all__ = (
- 'CloudShellServiceTransport',
- 'CloudShellServiceGrpcTransport',
- 'CloudShellServiceGrpcAsyncIOTransport',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
deleted file mode 100644
index b65a12b..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/base.py
+++ /dev/null
@@ -1,238 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 abc
-from typing import Awaitable, Callable, Dict, Optional, Sequence, Union
-import packaging.version
-import pkg_resources
-
-import google.auth # type: ignore
-import google.api_core # type: ignore
-from google.api_core import exceptions as core_exceptions # type: ignore
-from google.api_core import gapic_v1 # type: ignore
-from google.api_core import retry as retries # type: ignore
-from google.api_core import operations_v1 # type: ignore
-from google.auth import credentials as ga_credentials # type: ignore
-from google.oauth2 import service_account # type: ignore
-
-from google.cloud.shell_v1.types import cloudshell
-from google.longrunning import operations_pb2 # type: ignore
-
-try:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo(
- gapic_version=pkg_resources.get_distribution(
- 'google-cloud-shell',
- ).version,
- )
-except pkg_resources.DistributionNotFound:
- DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo()
-
-try:
- # google.auth.__version__ was added in 1.26.0
- _GOOGLE_AUTH_VERSION = google.auth.__version__
-except AttributeError:
- try: # try pkg_resources if it is available
- _GOOGLE_AUTH_VERSION = pkg_resources.get_distribution("google-auth").version
- except pkg_resources.DistributionNotFound: # pragma: NO COVER
- _GOOGLE_AUTH_VERSION = None
-
-
-class CloudShellServiceTransport(abc.ABC):
- """Abstract transport class for CloudShellService."""
-
- AUTH_SCOPES = (
- 'https://www.googleapis.com/auth/cloud-platform',
- )
-
- DEFAULT_HOST: str = 'cloudshell.googleapis.com'
- def __init__(
- self, *,
- host: str = DEFAULT_HOST,
- credentials: ga_credentials.Credentials = None,
- credentials_file: Optional[str] = None,
- scopes: Optional[Sequence[str]] = None,
- quota_project_id: Optional[str] = None,
- client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
- always_use_jwt_access: Optional[bool] = False,
- **kwargs,
- ) -> None:
- """Instantiate the transport.
-
- Args:
- host (Optional[str]):
- The hostname to connect to.
- credentials (Optional[google.auth.credentials.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify the application to the service; if none
- are specified, the client will attempt to ascertain the
- credentials from the environment.
- credentials_file (Optional[str]): A file with credentials that can
- be loaded with :func:`google.auth.load_credentials_from_file`.
- This argument is mutually exclusive with credentials.
- scopes (Optional[Sequence[str]]): A list of scopes.
- quota_project_id (Optional[str]): An optional project to use for billing
- and quota.
- client_info (google.api_core.gapic_v1.client_info.ClientInfo):
- The client info used to send a user-agent string along with
- API requests. If ``None``, then default info will be used.
- Generally, you only need to set this if you're developing
- your own client library.
- always_use_jwt_access (Optional[bool]): Whether self signed JWT should
- be used for service account credentials.
- """
- # Save the hostname. Default to port 443 (HTTPS) if none is specified.
- if ':' not in host:
- host += ':443'
- self._host = host
-
- scopes_kwargs = self._get_scopes_kwargs(self._host, scopes)
-
- # Save the scopes.
- self._scopes = scopes
-
- # If no credentials are provided, then determine the appropriate
- # defaults.
- if credentials and credentials_file:
- raise core_exceptions.DuplicateCredentialArgs("'credentials_file' and 'credentials' are mutually exclusive")
-
- if credentials_file is not None:
- credentials, _ = google.auth.load_credentials_from_file(
- credentials_file,
- **scopes_kwargs,
- quota_project_id=quota_project_id
- )
-
- elif credentials is None:
- credentials, _ = google.auth.default(**scopes_kwargs, quota_project_id=quota_project_id)
-
- # If the credentials is service account credentials, then always try to use self signed JWT.
- if always_use_jwt_access and isinstance(credentials, service_account.Credentials) and hasattr(service_account.Credentials, "with_always_use_jwt_access"):
- credentials = credentials.with_always_use_jwt_access(True)
-
- # Save the credentials.
- self._credentials = credentials
-
- # TODO(busunkim): This method is in the base transport
- # to avoid duplicating code across the transport classes. These functions
- # should be deleted once the minimum required versions of google-auth is increased.
-
- # TODO: Remove this function once google-auth >= 1.25.0 is required
- @classmethod
- def _get_scopes_kwargs(cls, host: str, scopes: Optional[Sequence[str]]) -> Dict[str, Optional[Sequence[str]]]:
- """Returns scopes kwargs to pass to google-auth methods depending on the google-auth version"""
-
- scopes_kwargs = {}
-
- if _GOOGLE_AUTH_VERSION and (
- packaging.version.parse(_GOOGLE_AUTH_VERSION)
- >= packaging.version.parse("1.25.0")
- ):
- scopes_kwargs = {"scopes": scopes, "default_scopes": cls.AUTH_SCOPES}
- else:
- scopes_kwargs = {"scopes": scopes or cls.AUTH_SCOPES}
-
- return scopes_kwargs
-
- def _prep_wrapped_messages(self, client_info):
- # Precompute the wrapped methods.
- self._wrapped_methods = {
- self.get_environment: gapic_v1.method.wrap_method(
- self.get_environment,
- default_retry=retries.Retry(
-initial=1.0,maximum=60.0,multiplier=1.3, predicate=retries.if_exception_type(
- core_exceptions.ServiceUnavailable,
- core_exceptions.Unknown,
- ),
- deadline=60.0,
- ),
- default_timeout=60.0,
- client_info=client_info,
- ),
- self.start_environment: gapic_v1.method.wrap_method(
- self.start_environment,
- default_timeout=60.0,
- client_info=client_info,
- ),
- self.authorize_environment: gapic_v1.method.wrap_method(
- self.authorize_environment,
- default_timeout=60.0,
- client_info=client_info,
- ),
- self.add_public_key: gapic_v1.method.wrap_method(
- self.add_public_key,
- default_timeout=60.0,
- client_info=client_info,
- ),
- self.remove_public_key: gapic_v1.method.wrap_method(
- self.remove_public_key,
- default_timeout=60.0,
- client_info=client_info,
- ),
- }
-
- @property
- def operations_client(self) -> operations_v1.OperationsClient:
- """Return the client designed to process long-running operations."""
- raise NotImplementedError()
-
- @property
- def get_environment(self) -> Callable[
- [cloudshell.GetEnvironmentRequest],
- Union[
- cloudshell.Environment,
- Awaitable[cloudshell.Environment]
- ]]:
- raise NotImplementedError()
-
- @property
- def start_environment(self) -> Callable[
- [cloudshell.StartEnvironmentRequest],
- Union[
- operations_pb2.Operation,
- Awaitable[operations_pb2.Operation]
- ]]:
- raise NotImplementedError()
-
- @property
- def authorize_environment(self) -> Callable[
- [cloudshell.AuthorizeEnvironmentRequest],
- Union[
- operations_pb2.Operation,
- Awaitable[operations_pb2.Operation]
- ]]:
- raise NotImplementedError()
-
- @property
- def add_public_key(self) -> Callable[
- [cloudshell.AddPublicKeyRequest],
- Union[
- operations_pb2.Operation,
- Awaitable[operations_pb2.Operation]
- ]]:
- raise NotImplementedError()
-
- @property
- def remove_public_key(self) -> Callable[
- [cloudshell.RemovePublicKeyRequest],
- Union[
- operations_pb2.Operation,
- Awaitable[operations_pb2.Operation]
- ]]:
- raise NotImplementedError()
-
-
-__all__ = (
- 'CloudShellServiceTransport',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
deleted file mode 100644
index 3336a16..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc.py
+++ /dev/null
@@ -1,400 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 warnings
-from typing import Callable, Dict, Optional, Sequence, Tuple, Union
-
-from google.api_core import grpc_helpers # type: ignore
-from google.api_core import operations_v1 # type: ignore
-from google.api_core import gapic_v1 # type: ignore
-import google.auth # type: ignore
-from google.auth import credentials as ga_credentials # type: ignore
-from google.auth.transport.grpc import SslCredentials # type: ignore
-
-import grpc # type: ignore
-
-from google.cloud.shell_v1.types import cloudshell
-from google.longrunning import operations_pb2 # type: ignore
-from .base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
-
-
-class CloudShellServiceGrpcTransport(CloudShellServiceTransport):
- """gRPC backend transport for CloudShellService.
-
- API for interacting with Google Cloud Shell. Each user of
- Cloud Shell has at least one environment, which has the ID
- "default". Environment consists of a Docker image defining what
- is installed on the environment and a home directory containing
- the user's data that will remain across sessions. Clients use
- this API to start and fetch information about their environment,
- which can then be used to connect to that environment via a
- separate SSH client.
-
- This class defines the same methods as the primary client, so the
- primary client can load the underlying transport implementation
- and call it.
-
- It sends protocol buffers over the wire using gRPC (which is built on
- top of HTTP/2); the ``grpcio`` package must be installed.
- """
- _stubs: Dict[str, Callable]
-
- def __init__(self, *,
- host: str = 'cloudshell.googleapis.com',
- credentials: ga_credentials.Credentials = None,
- credentials_file: str = None,
- scopes: Sequence[str] = None,
- channel: grpc.Channel = None,
- api_mtls_endpoint: str = None,
- client_cert_source: Callable[[], Tuple[bytes, bytes]] = None,
- ssl_channel_credentials: grpc.ChannelCredentials = None,
- client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
- quota_project_id: Optional[str] = None,
- client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
- always_use_jwt_access: Optional[bool] = False,
- ) -> None:
- """Instantiate the transport.
-
- Args:
- host (Optional[str]):
- The hostname to connect to.
- credentials (Optional[google.auth.credentials.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify the application to the service; if none
- are specified, the client will attempt to ascertain the
- credentials from the environment.
- This argument is ignored if ``channel`` is provided.
- credentials_file (Optional[str]): A file with credentials that can
- be loaded with :func:`google.auth.load_credentials_from_file`.
- This argument is ignored if ``channel`` is provided.
- scopes (Optional(Sequence[str])): A list of scopes. This argument is
- ignored if ``channel`` is provided.
- channel (Optional[grpc.Channel]): A ``Channel`` instance through
- which to make calls.
- api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint.
- If provided, it overrides the ``host`` argument and tries to create
- a mutual TLS channel with client SSL credentials from
- ``client_cert_source`` or applicatin default SSL credentials.
- client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]):
- Deprecated. A callback to provide client SSL certificate bytes and
- private key bytes, both in PEM format. It is ignored if
- ``api_mtls_endpoint`` is None.
- ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials
- for grpc channel. It is ignored if ``channel`` is provided.
- client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]):
- A callback to provide client certificate bytes and private key bytes,
- both in PEM format. It is used to configure mutual TLS channel. It is
- ignored if ``channel`` or ``ssl_channel_credentials`` is provided.
- quota_project_id (Optional[str]): An optional project to use for billing
- and quota.
- client_info (google.api_core.gapic_v1.client_info.ClientInfo):
- The client info used to send a user-agent string along with
- API requests. If ``None``, then default info will be used.
- Generally, you only need to set this if you're developing
- your own client library.
- always_use_jwt_access (Optional[bool]): Whether self signed JWT should
- be used for service account credentials.
-
- Raises:
- google.auth.exceptions.MutualTLSChannelError: If mutual TLS transport
- creation failed for any reason.
- google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
- and ``credentials_file`` are passed.
- """
- self._grpc_channel = None
- self._ssl_channel_credentials = ssl_channel_credentials
- self._stubs: Dict[str, Callable] = {}
- self._operations_client = None
-
- if api_mtls_endpoint:
- warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning)
- if client_cert_source:
- warnings.warn("client_cert_source is deprecated", DeprecationWarning)
-
- if channel:
- # Ignore credentials if a channel was passed.
- credentials = False
- # If a channel was explicitly provided, set it.
- self._grpc_channel = channel
- self._ssl_channel_credentials = None
-
- else:
- if api_mtls_endpoint:
- host = api_mtls_endpoint
-
- # Create SSL credentials with client_cert_source or application
- # default SSL credentials.
- if client_cert_source:
- cert, key = client_cert_source()
- self._ssl_channel_credentials = grpc.ssl_channel_credentials(
- certificate_chain=cert, private_key=key
- )
- else:
- self._ssl_channel_credentials = SslCredentials().ssl_credentials
-
- else:
- if client_cert_source_for_mtls and not ssl_channel_credentials:
- cert, key = client_cert_source_for_mtls()
- self._ssl_channel_credentials = grpc.ssl_channel_credentials(
- certificate_chain=cert, private_key=key
- )
-
- # The base transport sets the host, credentials and scopes
- super().__init__(
- host=host,
- credentials=credentials,
- credentials_file=credentials_file,
- scopes=scopes,
- quota_project_id=quota_project_id,
- client_info=client_info,
- always_use_jwt_access=always_use_jwt_access,
- )
-
- if not self._grpc_channel:
- self._grpc_channel = type(self).create_channel(
- self._host,
- credentials=self._credentials,
- credentials_file=credentials_file,
- scopes=self._scopes,
- ssl_credentials=self._ssl_channel_credentials,
- quota_project_id=quota_project_id,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
- # Wrap messages. This must be done after self._grpc_channel exists
- self._prep_wrapped_messages(client_info)
-
- @classmethod
- def create_channel(cls,
- host: str = 'cloudshell.googleapis.com',
- credentials: ga_credentials.Credentials = None,
- credentials_file: str = None,
- scopes: Optional[Sequence[str]] = None,
- quota_project_id: Optional[str] = None,
- **kwargs) -> grpc.Channel:
- """Create and return a gRPC channel object.
- Args:
- host (Optional[str]): The host for the channel to use.
- credentials (Optional[~.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify this application to the service. If
- none are specified, the client will attempt to ascertain
- the credentials from the environment.
- credentials_file (Optional[str]): A file with credentials that can
- be loaded with :func:`google.auth.load_credentials_from_file`.
- This argument is mutually exclusive with credentials.
- scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
- service. These are only used when credentials are not specified and
- are passed to :func:`google.auth.default`.
- quota_project_id (Optional[str]): An optional project to use for billing
- and quota.
- kwargs (Optional[dict]): Keyword arguments, which are passed to the
- channel creation.
- Returns:
- grpc.Channel: A gRPC channel object.
-
- Raises:
- google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
- and ``credentials_file`` are passed.
- """
-
- return grpc_helpers.create_channel(
- host,
- credentials=credentials,
- credentials_file=credentials_file,
- quota_project_id=quota_project_id,
- default_scopes=cls.AUTH_SCOPES,
- scopes=scopes,
- default_host=cls.DEFAULT_HOST,
- **kwargs
- )
-
- @property
- def grpc_channel(self) -> grpc.Channel:
- """Return the channel designed to connect to this service.
- """
- return self._grpc_channel
-
- @property
- def operations_client(self) -> operations_v1.OperationsClient:
- """Create the client designed to process long-running operations.
-
- This property caches on the instance; repeated calls return the same
- client.
- """
- # Sanity check: Only create a new client if we do not already have one.
- if self._operations_client is None:
- self._operations_client = operations_v1.OperationsClient(
- self.grpc_channel
- )
-
- # Return the client from cache.
- return self._operations_client
-
- @property
- def get_environment(self) -> Callable[
- [cloudshell.GetEnvironmentRequest],
- cloudshell.Environment]:
- r"""Return a callable for the get environment method over gRPC.
-
- Gets an environment. Returns NOT_FOUND if the environment does
- not exist.
-
- Returns:
- Callable[[~.GetEnvironmentRequest],
- ~.Environment]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'get_environment' not in self._stubs:
- self._stubs['get_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/GetEnvironment',
- request_serializer=cloudshell.GetEnvironmentRequest.serialize,
- response_deserializer=cloudshell.Environment.deserialize,
- )
- return self._stubs['get_environment']
-
- @property
- def start_environment(self) -> Callable[
- [cloudshell.StartEnvironmentRequest],
- operations_pb2.Operation]:
- r"""Return a callable for the start environment method over gRPC.
-
- Starts an existing environment, allowing clients to
- connect to it. The returned operation will contain an
- instance of StartEnvironmentMetadata in its metadata
- field. Users can wait for the environment to start by
- polling this operation via GetOperation. Once the
- environment has finished starting and is ready to accept
- connections, the operation will contain a
- StartEnvironmentResponse in its response field.
-
- Returns:
- Callable[[~.StartEnvironmentRequest],
- ~.Operation]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'start_environment' not in self._stubs:
- self._stubs['start_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/StartEnvironment',
- request_serializer=cloudshell.StartEnvironmentRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['start_environment']
-
- @property
- def authorize_environment(self) -> Callable[
- [cloudshell.AuthorizeEnvironmentRequest],
- operations_pb2.Operation]:
- r"""Return a callable for the authorize environment method over gRPC.
-
- Sends OAuth credentials to a running environment on
- behalf of a user. When this completes, the environment
- will be authorized to run various Google Cloud command
- line tools without requiring the user to manually
- authenticate.
-
- Returns:
- Callable[[~.AuthorizeEnvironmentRequest],
- ~.Operation]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'authorize_environment' not in self._stubs:
- self._stubs['authorize_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/AuthorizeEnvironment',
- request_serializer=cloudshell.AuthorizeEnvironmentRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['authorize_environment']
-
- @property
- def add_public_key(self) -> Callable[
- [cloudshell.AddPublicKeyRequest],
- operations_pb2.Operation]:
- r"""Return a callable for the add public key method over gRPC.
-
- Adds a public SSH key to an environment, allowing clients with
- the corresponding private key to connect to that environment via
- SSH. If a key with the same content already exists, this will
- error with ALREADY_EXISTS.
-
- Returns:
- Callable[[~.AddPublicKeyRequest],
- ~.Operation]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'add_public_key' not in self._stubs:
- self._stubs['add_public_key'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/AddPublicKey',
- request_serializer=cloudshell.AddPublicKeyRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['add_public_key']
-
- @property
- def remove_public_key(self) -> Callable[
- [cloudshell.RemovePublicKeyRequest],
- operations_pb2.Operation]:
- r"""Return a callable for the remove public key method over gRPC.
-
- Removes a public SSH key from an environment. Clients will no
- longer be able to connect to the environment using the
- corresponding private key. If a key with the same content is not
- present, this will error with NOT_FOUND.
-
- Returns:
- Callable[[~.RemovePublicKeyRequest],
- ~.Operation]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'remove_public_key' not in self._stubs:
- self._stubs['remove_public_key'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/RemovePublicKey',
- request_serializer=cloudshell.RemovePublicKeyRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['remove_public_key']
-
-
-__all__ = (
- 'CloudShellServiceGrpcTransport',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py b/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
deleted file mode 100644
index 400db2b..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/services/cloud_shell_service/transports/grpc_asyncio.py
+++ /dev/null
@@ -1,404 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 warnings
-from typing import Awaitable, Callable, Dict, Optional, Sequence, Tuple, Union
-
-from google.api_core import gapic_v1 # type: ignore
-from google.api_core import grpc_helpers_async # type: ignore
-from google.api_core import operations_v1 # type: ignore
-from google.auth import credentials as ga_credentials # type: ignore
-from google.auth.transport.grpc import SslCredentials # type: ignore
-import packaging.version
-
-import grpc # type: ignore
-from grpc.experimental import aio # type: ignore
-
-from google.cloud.shell_v1.types import cloudshell
-from google.longrunning import operations_pb2 # type: ignore
-from .base import CloudShellServiceTransport, DEFAULT_CLIENT_INFO
-from .grpc import CloudShellServiceGrpcTransport
-
-
-class CloudShellServiceGrpcAsyncIOTransport(CloudShellServiceTransport):
- """gRPC AsyncIO backend transport for CloudShellService.
-
- API for interacting with Google Cloud Shell. Each user of
- Cloud Shell has at least one environment, which has the ID
- "default". Environment consists of a Docker image defining what
- is installed on the environment and a home directory containing
- the user's data that will remain across sessions. Clients use
- this API to start and fetch information about their environment,
- which can then be used to connect to that environment via a
- separate SSH client.
-
- This class defines the same methods as the primary client, so the
- primary client can load the underlying transport implementation
- and call it.
-
- It sends protocol buffers over the wire using gRPC (which is built on
- top of HTTP/2); the ``grpcio`` package must be installed.
- """
-
- _grpc_channel: aio.Channel
- _stubs: Dict[str, Callable] = {}
-
- @classmethod
- def create_channel(cls,
- host: str = 'cloudshell.googleapis.com',
- credentials: ga_credentials.Credentials = None,
- credentials_file: Optional[str] = None,
- scopes: Optional[Sequence[str]] = None,
- quota_project_id: Optional[str] = None,
- **kwargs) -> aio.Channel:
- """Create and return a gRPC AsyncIO channel object.
- Args:
- host (Optional[str]): The host for the channel to use.
- credentials (Optional[~.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify this application to the service. If
- none are specified, the client will attempt to ascertain
- the credentials from the environment.
- credentials_file (Optional[str]): A file with credentials that can
- be loaded with :func:`google.auth.load_credentials_from_file`.
- This argument is ignored if ``channel`` is provided.
- scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
- service. These are only used when credentials are not specified and
- are passed to :func:`google.auth.default`.
- quota_project_id (Optional[str]): An optional project to use for billing
- and quota.
- kwargs (Optional[dict]): Keyword arguments, which are passed to the
- channel creation.
- Returns:
- aio.Channel: A gRPC AsyncIO channel object.
- """
-
- return grpc_helpers_async.create_channel(
- host,
- credentials=credentials,
- credentials_file=credentials_file,
- quota_project_id=quota_project_id,
- default_scopes=cls.AUTH_SCOPES,
- scopes=scopes,
- default_host=cls.DEFAULT_HOST,
- **kwargs
- )
-
- def __init__(self, *,
- host: str = 'cloudshell.googleapis.com',
- credentials: ga_credentials.Credentials = None,
- credentials_file: Optional[str] = None,
- scopes: Optional[Sequence[str]] = None,
- channel: aio.Channel = None,
- api_mtls_endpoint: str = None,
- client_cert_source: Callable[[], Tuple[bytes, bytes]] = None,
- ssl_channel_credentials: grpc.ChannelCredentials = None,
- client_cert_source_for_mtls: Callable[[], Tuple[bytes, bytes]] = None,
- quota_project_id=None,
- client_info: gapic_v1.client_info.ClientInfo = DEFAULT_CLIENT_INFO,
- always_use_jwt_access: Optional[bool] = False,
- ) -> None:
- """Instantiate the transport.
-
- Args:
- host (Optional[str]):
- The hostname to connect to.
- credentials (Optional[google.auth.credentials.Credentials]): The
- authorization credentials to attach to requests. These
- credentials identify the application to the service; if none
- are specified, the client will attempt to ascertain the
- credentials from the environment.
- This argument is ignored if ``channel`` is provided.
- credentials_file (Optional[str]): A file with credentials that can
- be loaded with :func:`google.auth.load_credentials_from_file`.
- This argument is ignored if ``channel`` is provided.
- scopes (Optional[Sequence[str]]): A optional list of scopes needed for this
- service. These are only used when credentials are not specified and
- are passed to :func:`google.auth.default`.
- channel (Optional[aio.Channel]): A ``Channel`` instance through
- which to make calls.
- api_mtls_endpoint (Optional[str]): Deprecated. The mutual TLS endpoint.
- If provided, it overrides the ``host`` argument and tries to create
- a mutual TLS channel with client SSL credentials from
- ``client_cert_source`` or applicatin default SSL credentials.
- client_cert_source (Optional[Callable[[], Tuple[bytes, bytes]]]):
- Deprecated. A callback to provide client SSL certificate bytes and
- private key bytes, both in PEM format. It is ignored if
- ``api_mtls_endpoint`` is None.
- ssl_channel_credentials (grpc.ChannelCredentials): SSL credentials
- for grpc channel. It is ignored if ``channel`` is provided.
- client_cert_source_for_mtls (Optional[Callable[[], Tuple[bytes, bytes]]]):
- A callback to provide client certificate bytes and private key bytes,
- both in PEM format. It is used to configure mutual TLS channel. It is
- ignored if ``channel`` or ``ssl_channel_credentials`` is provided.
- quota_project_id (Optional[str]): An optional project to use for billing
- and quota.
- client_info (google.api_core.gapic_v1.client_info.ClientInfo):
- The client info used to send a user-agent string along with
- API requests. If ``None``, then default info will be used.
- Generally, you only need to set this if you're developing
- your own client library.
- always_use_jwt_access (Optional[bool]): Whether self signed JWT should
- be used for service account credentials.
-
- Raises:
- google.auth.exceptions.MutualTlsChannelError: If mutual TLS transport
- creation failed for any reason.
- google.api_core.exceptions.DuplicateCredentialArgs: If both ``credentials``
- and ``credentials_file`` are passed.
- """
- self._grpc_channel = None
- self._ssl_channel_credentials = ssl_channel_credentials
- self._stubs: Dict[str, Callable] = {}
- self._operations_client = None
-
- if api_mtls_endpoint:
- warnings.warn("api_mtls_endpoint is deprecated", DeprecationWarning)
- if client_cert_source:
- warnings.warn("client_cert_source is deprecated", DeprecationWarning)
-
- if channel:
- # Ignore credentials if a channel was passed.
- credentials = False
- # If a channel was explicitly provided, set it.
- self._grpc_channel = channel
- self._ssl_channel_credentials = None
- else:
- if api_mtls_endpoint:
- host = api_mtls_endpoint
-
- # Create SSL credentials with client_cert_source or application
- # default SSL credentials.
- if client_cert_source:
- cert, key = client_cert_source()
- self._ssl_channel_credentials = grpc.ssl_channel_credentials(
- certificate_chain=cert, private_key=key
- )
- else:
- self._ssl_channel_credentials = SslCredentials().ssl_credentials
-
- else:
- if client_cert_source_for_mtls and not ssl_channel_credentials:
- cert, key = client_cert_source_for_mtls()
- self._ssl_channel_credentials = grpc.ssl_channel_credentials(
- certificate_chain=cert, private_key=key
- )
-
- # The base transport sets the host, credentials and scopes
- super().__init__(
- host=host,
- credentials=credentials,
- credentials_file=credentials_file,
- scopes=scopes,
- quota_project_id=quota_project_id,
- client_info=client_info,
- always_use_jwt_access=always_use_jwt_access,
- )
-
- if not self._grpc_channel:
- self._grpc_channel = type(self).create_channel(
- self._host,
- credentials=self._credentials,
- credentials_file=credentials_file,
- scopes=self._scopes,
- ssl_credentials=self._ssl_channel_credentials,
- quota_project_id=quota_project_id,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
- # Wrap messages. This must be done after self._grpc_channel exists
- self._prep_wrapped_messages(client_info)
-
- @property
- def grpc_channel(self) -> aio.Channel:
- """Create the channel designed to connect to this service.
-
- This property caches on the instance; repeated calls return
- the same channel.
- """
- # Return the channel from cache.
- return self._grpc_channel
-
- @property
- def operations_client(self) -> operations_v1.OperationsAsyncClient:
- """Create the client designed to process long-running operations.
-
- This property caches on the instance; repeated calls return the same
- client.
- """
- # Sanity check: Only create a new client if we do not already have one.
- if self._operations_client is None:
- self._operations_client = operations_v1.OperationsAsyncClient(
- self.grpc_channel
- )
-
- # Return the client from cache.
- return self._operations_client
-
- @property
- def get_environment(self) -> Callable[
- [cloudshell.GetEnvironmentRequest],
- Awaitable[cloudshell.Environment]]:
- r"""Return a callable for the get environment method over gRPC.
-
- Gets an environment. Returns NOT_FOUND if the environment does
- not exist.
-
- Returns:
- Callable[[~.GetEnvironmentRequest],
- Awaitable[~.Environment]]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'get_environment' not in self._stubs:
- self._stubs['get_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/GetEnvironment',
- request_serializer=cloudshell.GetEnvironmentRequest.serialize,
- response_deserializer=cloudshell.Environment.deserialize,
- )
- return self._stubs['get_environment']
-
- @property
- def start_environment(self) -> Callable[
- [cloudshell.StartEnvironmentRequest],
- Awaitable[operations_pb2.Operation]]:
- r"""Return a callable for the start environment method over gRPC.
-
- Starts an existing environment, allowing clients to
- connect to it. The returned operation will contain an
- instance of StartEnvironmentMetadata in its metadata
- field. Users can wait for the environment to start by
- polling this operation via GetOperation. Once the
- environment has finished starting and is ready to accept
- connections, the operation will contain a
- StartEnvironmentResponse in its response field.
-
- Returns:
- Callable[[~.StartEnvironmentRequest],
- Awaitable[~.Operation]]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'start_environment' not in self._stubs:
- self._stubs['start_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/StartEnvironment',
- request_serializer=cloudshell.StartEnvironmentRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['start_environment']
-
- @property
- def authorize_environment(self) -> Callable[
- [cloudshell.AuthorizeEnvironmentRequest],
- Awaitable[operations_pb2.Operation]]:
- r"""Return a callable for the authorize environment method over gRPC.
-
- Sends OAuth credentials to a running environment on
- behalf of a user. When this completes, the environment
- will be authorized to run various Google Cloud command
- line tools without requiring the user to manually
- authenticate.
-
- Returns:
- Callable[[~.AuthorizeEnvironmentRequest],
- Awaitable[~.Operation]]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'authorize_environment' not in self._stubs:
- self._stubs['authorize_environment'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/AuthorizeEnvironment',
- request_serializer=cloudshell.AuthorizeEnvironmentRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['authorize_environment']
-
- @property
- def add_public_key(self) -> Callable[
- [cloudshell.AddPublicKeyRequest],
- Awaitable[operations_pb2.Operation]]:
- r"""Return a callable for the add public key method over gRPC.
-
- Adds a public SSH key to an environment, allowing clients with
- the corresponding private key to connect to that environment via
- SSH. If a key with the same content already exists, this will
- error with ALREADY_EXISTS.
-
- Returns:
- Callable[[~.AddPublicKeyRequest],
- Awaitable[~.Operation]]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'add_public_key' not in self._stubs:
- self._stubs['add_public_key'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/AddPublicKey',
- request_serializer=cloudshell.AddPublicKeyRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['add_public_key']
-
- @property
- def remove_public_key(self) -> Callable[
- [cloudshell.RemovePublicKeyRequest],
- Awaitable[operations_pb2.Operation]]:
- r"""Return a callable for the remove public key method over gRPC.
-
- Removes a public SSH key from an environment. Clients will no
- longer be able to connect to the environment using the
- corresponding private key. If a key with the same content is not
- present, this will error with NOT_FOUND.
-
- Returns:
- Callable[[~.RemovePublicKeyRequest],
- Awaitable[~.Operation]]:
- A function that, when called, will call the underlying RPC
- on the server.
- """
- # Generate a "stub function" on-the-fly which will actually make
- # the request.
- # gRPC handles serialization and deserialization, so we just need
- # to pass in the functions for each.
- if 'remove_public_key' not in self._stubs:
- self._stubs['remove_public_key'] = self.grpc_channel.unary_unary(
- '/google.cloud.shell.v1.CloudShellService/RemovePublicKey',
- request_serializer=cloudshell.RemovePublicKeyRequest.serialize,
- response_deserializer=operations_pb2.Operation.FromString,
- )
- return self._stubs['remove_public_key']
-
-
-__all__ = (
- 'CloudShellServiceGrpcAsyncIOTransport',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py b/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
deleted file mode 100644
index 1ed9f35..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/types/__init__.py
+++ /dev/null
@@ -1,54 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 .cloudshell import (
- AddPublicKeyMetadata,
- AddPublicKeyRequest,
- AddPublicKeyResponse,
- AuthorizeEnvironmentMetadata,
- AuthorizeEnvironmentRequest,
- AuthorizeEnvironmentResponse,
- CloudShellErrorDetails,
- CreateEnvironmentMetadata,
- DeleteEnvironmentMetadata,
- Environment,
- GetEnvironmentRequest,
- RemovePublicKeyMetadata,
- RemovePublicKeyRequest,
- RemovePublicKeyResponse,
- StartEnvironmentMetadata,
- StartEnvironmentRequest,
- StartEnvironmentResponse,
-)
-
-__all__ = (
- 'AddPublicKeyMetadata',
- 'AddPublicKeyRequest',
- 'AddPublicKeyResponse',
- 'AuthorizeEnvironmentMetadata',
- 'AuthorizeEnvironmentRequest',
- 'AuthorizeEnvironmentResponse',
- 'CloudShellErrorDetails',
- 'CreateEnvironmentMetadata',
- 'DeleteEnvironmentMetadata',
- 'Environment',
- 'GetEnvironmentRequest',
- 'RemovePublicKeyMetadata',
- 'RemovePublicKeyRequest',
- 'RemovePublicKeyResponse',
- 'StartEnvironmentMetadata',
- 'StartEnvironmentRequest',
- 'StartEnvironmentResponse',
-)
diff --git a/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py b/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
deleted file mode 100644
index cdaa562..0000000
--- a/owl-bot-staging/v1/google/cloud/shell_v1/types/cloudshell.py
+++ /dev/null
@@ -1,413 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 proto # type: ignore
-
-from google.protobuf import timestamp_pb2 # type: ignore
-
-
-__protobuf__ = proto.module(
- package='google.cloud.shell.v1',
- manifest={
- 'Environment',
- 'GetEnvironmentRequest',
- 'CreateEnvironmentMetadata',
- 'DeleteEnvironmentMetadata',
- 'StartEnvironmentRequest',
- 'AuthorizeEnvironmentRequest',
- 'AuthorizeEnvironmentResponse',
- 'AuthorizeEnvironmentMetadata',
- 'StartEnvironmentMetadata',
- 'StartEnvironmentResponse',
- 'AddPublicKeyRequest',
- 'AddPublicKeyResponse',
- 'AddPublicKeyMetadata',
- 'RemovePublicKeyRequest',
- 'RemovePublicKeyResponse',
- 'RemovePublicKeyMetadata',
- 'CloudShellErrorDetails',
- },
-)
-
-
-class Environment(proto.Message):
- r"""A Cloud Shell environment, which is defined as the
- combination of a Docker image specifying what is installed on
- the environment and a home directory containing the user's data
- that will remain across sessions. Each user has at least an
- environment with the ID "default".
-
- Attributes:
- name (str):
- Immutable. Full name of this resource, in the format
- ``users/{owner_email}/environments/{environment_id}``.
- ``{owner_email}`` is the email address of the user to whom
- this environment belongs, and ``{environment_id}`` is the
- identifier of this environment. For example,
- ``users/someone@example.com/environments/default``.
- id (str):
- Output only. The environment's identifier,
- unique among the user's environments.
- docker_image (str):
- Required. Immutable. Full path to the Docker
- image used to run this environment, e.g.
- "gcr.io/dev-con/cloud-devshell:latest".
- state (google.cloud.shell_v1.types.Environment.State):
- Output only. Current execution state of this
- environment.
- web_host (str):
- Output only. Host to which clients can
- connect to initiate HTTPS or WSS connections
- with the environment.
- ssh_username (str):
- Output only. Username that clients should use
- when initiating SSH sessions with the
- environment.
- ssh_host (str):
- Output only. Host to which clients can
- connect to initiate SSH sessions with the
- environment.
- ssh_port (int):
- Output only. Port to which clients can
- connect to initiate SSH sessions with the
- environment.
- public_keys (Sequence[str]):
- Output only. Public keys associated with the
- environment. Clients can connect to this
- environment via SSH only if they possess a
- private key corresponding to at least one of
- these public keys. Keys can be added to or
- removed from the environment using the
- AddPublicKey and RemovePublicKey methods.
- """
- class State(proto.Enum):
- r"""Possible execution states for an environment."""
- STATE_UNSPECIFIED = 0
- SUSPENDED = 1
- PENDING = 2
- RUNNING = 3
- DELETING = 4
-
- name = proto.Field(
- proto.STRING,
- number=1,
- )
- id = proto.Field(
- proto.STRING,
- number=2,
- )
- docker_image = proto.Field(
- proto.STRING,
- number=3,
- )
- state = proto.Field(
- proto.ENUM,
- number=4,
- enum=State,
- )
- web_host = proto.Field(
- proto.STRING,
- number=12,
- )
- ssh_username = proto.Field(
- proto.STRING,
- number=5,
- )
- ssh_host = proto.Field(
- proto.STRING,
- number=6,
- )
- ssh_port = proto.Field(
- proto.INT32,
- number=7,
- )
- public_keys = proto.RepeatedField(
- proto.STRING,
- number=8,
- )
-
-
-class GetEnvironmentRequest(proto.Message):
- r"""Request message for
- [GetEnvironment][google.cloud.shell.v1.CloudShellService.GetEnvironment].
-
- Attributes:
- name (str):
- Required. Name of the requested resource, for example
- ``users/me/environments/default`` or
- ``users/someone@example.com/environments/default``.
- """
-
- name = proto.Field(
- proto.STRING,
- number=1,
- )
-
-
-class CreateEnvironmentMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [CreateEnvironment][google.cloud.shell.v1.CloudShellService.CreateEnvironment].
- """
-
-
-class DeleteEnvironmentMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [DeleteEnvironment][google.cloud.shell.v1.CloudShellService.DeleteEnvironment].
- """
-
-
-class StartEnvironmentRequest(proto.Message):
- r"""Request message for
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
-
- Attributes:
- name (str):
- Name of the resource that should be started, for example
- ``users/me/environments/default`` or
- ``users/someone@example.com/environments/default``.
- access_token (str):
- The initial access token passed to the
- environment. If this is present and valid, the
- environment will be pre-authenticated with
- gcloud so that the user can run gcloud commands
- in Cloud Shell without having to log in. This
- code can be updated later by calling
- AuthorizeEnvironment.
- public_keys (Sequence[str]):
- Public keys that should be added to the
- environment before it is started.
- """
-
- name = proto.Field(
- proto.STRING,
- number=1,
- )
- access_token = proto.Field(
- proto.STRING,
- number=2,
- )
- public_keys = proto.RepeatedField(
- proto.STRING,
- number=3,
- )
-
-
-class AuthorizeEnvironmentRequest(proto.Message):
- r"""Request message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
-
- Attributes:
- name (str):
- Name of the resource that should receive the credentials,
- for example ``users/me/environments/default`` or
- ``users/someone@example.com/environments/default``.
- access_token (str):
- The OAuth access token that should be sent to
- the environment.
- id_token (str):
- The OAuth ID token that should be sent to the
- environment.
- expire_time (google.protobuf.timestamp_pb2.Timestamp):
- The time when the credentials expire. If not
- set, defaults to one hour from when the server
- received the request.
- """
-
- name = proto.Field(
- proto.STRING,
- number=1,
- )
- access_token = proto.Field(
- proto.STRING,
- number=2,
- )
- id_token = proto.Field(
- proto.STRING,
- number=4,
- )
- expire_time = proto.Field(
- proto.MESSAGE,
- number=3,
- message=timestamp_pb2.Timestamp,
- )
-
-
-class AuthorizeEnvironmentResponse(proto.Message):
- r"""Response message for
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
- """
-
-
-class AuthorizeEnvironmentMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [AuthorizeEnvironment][google.cloud.shell.v1.CloudShellService.AuthorizeEnvironment].
- """
-
-
-class StartEnvironmentMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment].
-
- Attributes:
- state (google.cloud.shell_v1.types.StartEnvironmentMetadata.State):
- Current state of the environment being
- started.
- """
- class State(proto.Enum):
- r"""Possible states an environment might transition between
- during startup. These states are not normally actionable by
- clients, but may be used to show a progress message to the user.
- An environment won't necessarily go through all of these states
- when starting. More states are likely to be added in the future.
- """
- STATE_UNSPECIFIED = 0
- STARTING = 1
- UNARCHIVING_DISK = 2
- AWAITING_COMPUTE_RESOURCES = 4
- FINISHED = 3
-
- state = proto.Field(
- proto.ENUM,
- number=1,
- enum=State,
- )
-
-
-class StartEnvironmentResponse(proto.Message):
- r"""Message included in the response field of operations returned from
- [StartEnvironment][google.cloud.shell.v1.CloudShellService.StartEnvironment]
- once the operation is complete.
-
- Attributes:
- environment (google.cloud.shell_v1.types.Environment):
- Environment that was started.
- """
-
- environment = proto.Field(
- proto.MESSAGE,
- number=1,
- message='Environment',
- )
-
-
-class AddPublicKeyRequest(proto.Message):
- r"""Request message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
-
- Attributes:
- environment (str):
- Environment this key should be added to, e.g.
- ``users/me/environments/default``.
- key (str):
- Key that should be added to the environment. Supported
- formats are ``ssh-dss`` (see RFC4253), ``ssh-rsa`` (see
- RFC4253), ``ecdsa-sha2-nistp256`` (see RFC5656),
- ``ecdsa-sha2-nistp384`` (see RFC5656) and
- ``ecdsa-sha2-nistp521`` (see RFC5656). It should be
- structured as , where part is
- encoded with Base64.
- """
-
- environment = proto.Field(
- proto.STRING,
- number=1,
- )
- key = proto.Field(
- proto.STRING,
- number=2,
- )
-
-
-class AddPublicKeyResponse(proto.Message):
- r"""Response message for
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
-
- Attributes:
- key (str):
- Key that was added to the environment.
- """
-
- key = proto.Field(
- proto.STRING,
- number=1,
- )
-
-
-class AddPublicKeyMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [AddPublicKey][google.cloud.shell.v1.CloudShellService.AddPublicKey].
- """
-
-
-class RemovePublicKeyRequest(proto.Message):
- r"""Request message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
-
- Attributes:
- environment (str):
- Environment this key should be removed from, e.g.
- ``users/me/environments/default``.
- key (str):
- Key that should be removed from the
- environment.
- """
-
- environment = proto.Field(
- proto.STRING,
- number=1,
- )
- key = proto.Field(
- proto.STRING,
- number=2,
- )
-
-
-class RemovePublicKeyResponse(proto.Message):
- r"""Response message for
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
- """
-
-
-class RemovePublicKeyMetadata(proto.Message):
- r"""Message included in the metadata field of operations returned from
- [RemovePublicKey][google.cloud.shell.v1.CloudShellService.RemovePublicKey].
- """
-
-
-class CloudShellErrorDetails(proto.Message):
- r"""Cloud-shell specific information that will be included as
- details in failure responses.
-
- Attributes:
- code (google.cloud.shell_v1.types.CloudShellErrorDetails.CloudShellErrorCode):
- Code indicating the specific error the
- occurred.
- """
- class CloudShellErrorCode(proto.Enum):
- r"""Set of possible errors returned from API calls."""
- CLOUD_SHELL_ERROR_CODE_UNSPECIFIED = 0
- IMAGE_UNAVAILABLE = 1
- CLOUD_SHELL_DISABLED = 2
- TOS_VIOLATION = 4
- QUOTA_EXCEEDED = 5
-
- code = proto.Field(
- proto.ENUM,
- number=1,
- enum=CloudShellErrorCode,
- )
-
-
-__all__ = tuple(sorted(__protobuf__.manifest))
diff --git a/owl-bot-staging/v1/mypy.ini b/owl-bot-staging/v1/mypy.ini
deleted file mode 100644
index 4505b48..0000000
--- a/owl-bot-staging/v1/mypy.ini
+++ /dev/null
@@ -1,3 +0,0 @@
-[mypy]
-python_version = 3.6
-namespace_packages = True
diff --git a/owl-bot-staging/v1/noxfile.py b/owl-bot-staging/v1/noxfile.py
deleted file mode 100644
index 696a092..0000000
--- a/owl-bot-staging/v1/noxfile.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 pathlib
-import shutil
-import subprocess
-import sys
-
-
-import nox # type: ignore
-
-CURRENT_DIRECTORY = pathlib.Path(__file__).parent.absolute()
-
-LOWER_BOUND_CONSTRAINTS_FILE = CURRENT_DIRECTORY / "constraints.txt"
-PACKAGE_NAME = subprocess.check_output([sys.executable, "setup.py", "--name"], encoding="utf-8")
-
-
-nox.sessions = [
- "unit",
- "cover",
- "mypy",
- "check_lower_bounds"
- # exclude update_lower_bounds from default
- "docs",
-]
-
-@nox.session(python=['3.6', '3.7', '3.8', '3.9'])
-def unit(session):
- """Run the unit test suite."""
-
- session.install('coverage', 'pytest', 'pytest-cov', 'asyncmock', 'pytest-asyncio')
- session.install('-e', '.')
-
- session.run(
- 'py.test',
- '--quiet',
- '--cov=google/cloud/shell_v1/',
- '--cov-config=.coveragerc',
- '--cov-report=term',
- '--cov-report=html',
- os.path.join('tests', 'unit', ''.join(session.posargs))
- )
-
-
-@nox.session(python='3.7')
-def cover(session):
- """Run the final coverage report.
- This outputs the coverage report aggregating coverage from the unit
- test runs (not system test runs), and then erases coverage data.
- """
- session.install("coverage", "pytest-cov")
- session.run("coverage", "report", "--show-missing", "--fail-under=100")
-
- session.run("coverage", "erase")
-
-
-@nox.session(python=['3.6', '3.7'])
-def mypy(session):
- """Run the type checker."""
- session.install('mypy', 'types-pkg_resources')
- session.install('.')
- session.run(
- 'mypy',
- '--explicit-package-bases',
- 'google',
- )
-
-
-@nox.session
-def update_lower_bounds(session):
- """Update lower bounds in constraints.txt to match setup.py"""
- session.install('google-cloud-testutils')
- session.install('.')
-
- session.run(
- 'lower-bound-checker',
- 'update',
- '--package-name',
- PACKAGE_NAME,
- '--constraints-file',
- str(LOWER_BOUND_CONSTRAINTS_FILE),
- )
-
-
-@nox.session
-def check_lower_bounds(session):
- """Check lower bounds in setup.py are reflected in constraints file"""
- session.install('google-cloud-testutils')
- session.install('.')
-
- session.run(
- 'lower-bound-checker',
- 'check',
- '--package-name',
- PACKAGE_NAME,
- '--constraints-file',
- str(LOWER_BOUND_CONSTRAINTS_FILE),
- )
-
-@nox.session(python='3.6')
-def docs(session):
- """Build the docs for this library."""
-
- session.install("-e", ".")
- session.install("sphinx<3.0.0", "alabaster", "recommonmark")
-
- shutil.rmtree(os.path.join("docs", "_build"), ignore_errors=True)
- session.run(
- "sphinx-build",
- "-W", # warnings as errors
- "-T", # show full traceback on exception
- "-N", # no colors
- "-b",
- "html",
- "-d",
- os.path.join("docs", "_build", "doctrees", ""),
- os.path.join("docs", ""),
- os.path.join("docs", "_build", "html", ""),
- )
diff --git a/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py b/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
deleted file mode 100644
index c4b2aa4..0000000
--- a/owl-bot-staging/v1/scripts/fixup_shell_v1_keywords.py
+++ /dev/null
@@ -1,180 +0,0 @@
-#! /usr/bin/env python3
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 argparse
-import os
-import libcst as cst
-import pathlib
-import sys
-from typing import (Any, Callable, Dict, List, Sequence, Tuple)
-
-
-def partition(
- predicate: Callable[[Any], bool],
- iterator: Sequence[Any]
-) -> Tuple[List[Any], List[Any]]:
- """A stable, out-of-place partition."""
- results = ([], [])
-
- for i in iterator:
- results[int(predicate(i))].append(i)
-
- # Returns trueList, falseList
- return results[1], results[0]
-
-
-class shellCallTransformer(cst.CSTTransformer):
- CTRL_PARAMS: Tuple[str] = ('retry', 'timeout', 'metadata')
- METHOD_TO_PARAMS: Dict[str, Tuple[str]] = {
- 'add_public_key': ('environment', 'key', ),
- 'authorize_environment': ('name', 'access_token', 'id_token', 'expire_time', ),
- 'get_environment': ('name', ),
- 'remove_public_key': ('environment', 'key', ),
- 'start_environment': ('name', 'access_token', 'public_keys', ),
- }
-
- def leave_Call(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode:
- try:
- key = original.func.attr.value
- kword_params = self.METHOD_TO_PARAMS[key]
- except (AttributeError, KeyError):
- # Either not a method from the API or too convoluted to be sure.
- return updated
-
- # If the existing code is valid, keyword args come after positional args.
- # Therefore, all positional args must map to the first parameters.
- args, kwargs = partition(lambda a: not bool(a.keyword), updated.args)
- if any(k.keyword.value == "request" for k in kwargs):
- # We've already fixed this file, don't fix it again.
- return updated
-
- kwargs, ctrl_kwargs = partition(
- lambda a: not a.keyword.value in self.CTRL_PARAMS,
- kwargs
- )
-
- args, ctrl_args = args[:len(kword_params)], args[len(kword_params):]
- ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl))
- for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS))
-
- request_arg = cst.Arg(
- value=cst.Dict([
- cst.DictElement(
- cst.SimpleString("'{}'".format(name)),
-cst.Element(value=arg.value)
- )
- # Note: the args + kwargs looks silly, but keep in mind that
- # the control parameters had to be stripped out, and that
- # those could have been passed positionally or by keyword.
- for name, arg in zip(kword_params, args + kwargs)]),
- keyword=cst.Name("request")
- )
-
- return updated.with_changes(
- args=[request_arg] + ctrl_kwargs
- )
-
-
-def fix_files(
- in_dir: pathlib.Path,
- out_dir: pathlib.Path,
- *,
- transformer=shellCallTransformer(),
-):
- """Duplicate the input dir to the output dir, fixing file method calls.
-
- Preconditions:
- * in_dir is a real directory
- * out_dir is a real, empty directory
- """
- pyfile_gen = (
- pathlib.Path(os.path.join(root, f))
- for root, _, files in os.walk(in_dir)
- for f in files if os.path.splitext(f)[1] == ".py"
- )
-
- for fpath in pyfile_gen:
- with open(fpath, 'r') as f:
- src = f.read()
-
- # Parse the code and insert method call fixes.
- tree = cst.parse_module(src)
- updated = tree.visit(transformer)
-
- # Create the path and directory structure for the new file.
- updated_path = out_dir.joinpath(fpath.relative_to(in_dir))
- updated_path.parent.mkdir(parents=True, exist_ok=True)
-
- # Generate the updated source file at the corresponding path.
- with open(updated_path, 'w') as f:
- f.write(updated.code)
-
-
-if __name__ == '__main__':
- parser = argparse.ArgumentParser(
- description="""Fix up source that uses the shell client library.
-
-The existing sources are NOT overwritten but are copied to output_dir with changes made.
-
-Note: This tool operates at a best-effort level at converting positional
- parameters in client method calls to keyword based parameters.
- Cases where it WILL FAIL include
- A) * or ** expansion in a method call.
- B) Calls via function or method alias (includes free function calls)
- C) Indirect or dispatched calls (e.g. the method is looked up dynamically)
-
- These all constitute false negatives. The tool will also detect false
- positives when an API method shares a name with another method.
-""")
- parser.add_argument(
- '-d',
- '--input-directory',
- required=True,
- dest='input_dir',
- help='the input directory to walk for python files to fix up',
- )
- parser.add_argument(
- '-o',
- '--output-directory',
- required=True,
- dest='output_dir',
- help='the directory to output files fixed via un-flattening',
- )
- args = parser.parse_args()
- input_dir = pathlib.Path(args.input_dir)
- output_dir = pathlib.Path(args.output_dir)
- if not input_dir.is_dir():
- print(
- f"input directory '{input_dir}' does not exist or is not a directory",
- file=sys.stderr,
- )
- sys.exit(-1)
-
- if not output_dir.is_dir():
- print(
- f"output directory '{output_dir}' does not exist or is not a directory",
- file=sys.stderr,
- )
- sys.exit(-1)
-
- if os.listdir(output_dir):
- print(
- f"output directory '{output_dir}' is not empty",
- file=sys.stderr,
- )
- sys.exit(-1)
-
- fix_files(input_dir, output_dir)
diff --git a/owl-bot-staging/v1/setup.py b/owl-bot-staging/v1/setup.py
deleted file mode 100644
index 0e6bd92..0000000
--- a/owl-bot-staging/v1/setup.py
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 io
-import os
-import setuptools # type: ignore
-
-version = '0.1.0'
-
-package_root = os.path.abspath(os.path.dirname(__file__))
-
-readme_filename = os.path.join(package_root, 'README.rst')
-with io.open(readme_filename, encoding='utf-8') as readme_file:
- readme = readme_file.read()
-
-setuptools.setup(
- name='google-cloud-shell',
- version=version,
- long_description=readme,
- packages=setuptools.PEP420PackageFinder.find(),
- namespace_packages=('google', 'google.cloud'),
- platforms='Posix; MacOS X; Windows',
- include_package_data=True,
- install_requires=(
- 'google-api-core[grpc] >= 1.27.0, < 2.0.0dev',
- 'libcst >= 0.2.5',
- 'proto-plus >= 1.15.0',
- 'packaging >= 14.3', ),
- python_requires='>=3.6',
- classifiers=[
- 'Development Status :: 3 - Alpha',
- 'Intended Audience :: Developers',
- 'Operating System :: OS Independent',
- 'Programming Language :: Python :: 3.6',
- 'Programming Language :: Python :: 3.7',
- 'Programming Language :: Python :: 3.8',
- 'Topic :: Internet',
- 'Topic :: Software Development :: Libraries :: Python Modules',
- ],
- zip_safe=False,
-)
diff --git a/owl-bot-staging/v1/tests/__init__.py b/owl-bot-staging/v1/tests/__init__.py
deleted file mode 100644
index b54a5fc..0000000
--- a/owl-bot-staging/v1/tests/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
diff --git a/owl-bot-staging/v1/tests/unit/__init__.py b/owl-bot-staging/v1/tests/unit/__init__.py
deleted file mode 100644
index b54a5fc..0000000
--- a/owl-bot-staging/v1/tests/unit/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/__init__.py b/owl-bot-staging/v1/tests/unit/gapic/__init__.py
deleted file mode 100644
index b54a5fc..0000000
--- a/owl-bot-staging/v1/tests/unit/gapic/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
deleted file mode 100644
index b54a5fc..0000000
--- a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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.
-#
diff --git a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py b/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
deleted file mode 100644
index 9a364f6..0000000
--- a/owl-bot-staging/v1/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
+++ /dev/null
@@ -1,1828 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright 2020 Google LLC
-#
-# 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 mock
-import packaging.version
-
-import grpc
-from grpc.experimental import aio
-import math
-import pytest
-from proto.marshal.rules.dates import DurationRule, TimestampRule
-
-
-from google.api_core import client_options
-from google.api_core import exceptions as core_exceptions
-from google.api_core import future
-from google.api_core import gapic_v1
-from google.api_core import grpc_helpers
-from google.api_core import grpc_helpers_async
-from google.api_core import operation_async # type: ignore
-from google.api_core import operations_v1
-from google.auth import credentials as ga_credentials
-from google.auth.exceptions import MutualTLSChannelError
-from google.cloud.shell_v1.services.cloud_shell_service import CloudShellServiceAsyncClient
-from google.cloud.shell_v1.services.cloud_shell_service import CloudShellServiceClient
-from google.cloud.shell_v1.services.cloud_shell_service import transports
-from google.cloud.shell_v1.services.cloud_shell_service.transports.base import _GOOGLE_AUTH_VERSION
-from google.cloud.shell_v1.types import cloudshell
-from google.longrunning import operations_pb2
-from google.oauth2 import service_account
-from google.protobuf import timestamp_pb2 # type: ignore
-import google.auth
-
-
-# TODO(busunkim): Once google-auth >= 1.25.0 is required transitively
-# through google-api-core:
-# - Delete the auth "less than" test cases
-# - Delete these pytest markers (Make the "greater than or equal to" tests the default).
-requires_google_auth_lt_1_25_0 = pytest.mark.skipif(
- packaging.version.parse(_GOOGLE_AUTH_VERSION) >= packaging.version.parse("1.25.0"),
- reason="This test requires google-auth < 1.25.0",
-)
-requires_google_auth_gte_1_25_0 = pytest.mark.skipif(
- packaging.version.parse(_GOOGLE_AUTH_VERSION) < packaging.version.parse("1.25.0"),
- reason="This test requires google-auth >= 1.25.0",
-)
-
-def client_cert_source_callback():
- return b"cert bytes", b"key bytes"
-
-
-# If default endpoint is localhost, then default mtls endpoint will be the same.
-# This method modifies the default endpoint so the client can produce a different
-# mtls endpoint for endpoint testing purposes.
-def modify_default_endpoint(client):
- return "foo.googleapis.com" if ("localhost" in client.DEFAULT_ENDPOINT) else client.DEFAULT_ENDPOINT
-
-
-def test__get_default_mtls_endpoint():
- api_endpoint = "example.googleapis.com"
- api_mtls_endpoint = "example.mtls.googleapis.com"
- sandbox_endpoint = "example.sandbox.googleapis.com"
- sandbox_mtls_endpoint = "example.mtls.sandbox.googleapis.com"
- non_googleapi = "api.example.com"
-
- assert CloudShellServiceClient._get_default_mtls_endpoint(None) is None
- assert CloudShellServiceClient._get_default_mtls_endpoint(api_endpoint) == api_mtls_endpoint
- assert CloudShellServiceClient._get_default_mtls_endpoint(api_mtls_endpoint) == api_mtls_endpoint
- assert CloudShellServiceClient._get_default_mtls_endpoint(sandbox_endpoint) == sandbox_mtls_endpoint
- assert CloudShellServiceClient._get_default_mtls_endpoint(sandbox_mtls_endpoint) == sandbox_mtls_endpoint
- assert CloudShellServiceClient._get_default_mtls_endpoint(non_googleapi) == non_googleapi
-
-
-@pytest.mark.parametrize("client_class", [
- CloudShellServiceClient,
- CloudShellServiceAsyncClient,
-])
-def test_cloud_shell_service_client_from_service_account_info(client_class):
- creds = ga_credentials.AnonymousCredentials()
- with mock.patch.object(service_account.Credentials, 'from_service_account_info') as factory:
- factory.return_value = creds
- info = {"valid": True}
- client = client_class.from_service_account_info(info)
- assert client.transport._credentials == creds
- assert isinstance(client, client_class)
-
- assert client.transport._host == 'cloudshell.googleapis.com:443'
-
-
-@pytest.mark.parametrize("client_class", [
- CloudShellServiceClient,
- CloudShellServiceAsyncClient,
-])
-def test_cloud_shell_service_client_service_account_always_use_jwt(client_class):
- with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt:
- creds = service_account.Credentials(None, None, None)
- client = client_class(credentials=creds)
- use_jwt.assert_not_called()
-
-
-@pytest.mark.parametrize("transport_class,transport_name", [
- (transports.CloudShellServiceGrpcTransport, "grpc"),
- (transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
-])
-def test_cloud_shell_service_client_service_account_always_use_jwt_true(transport_class, transport_name):
- with mock.patch.object(service_account.Credentials, 'with_always_use_jwt_access', create=True) as use_jwt:
- creds = service_account.Credentials(None, None, None)
- transport = transport_class(credentials=creds, always_use_jwt_access=True)
- use_jwt.assert_called_once_with(True)
-
-
-@pytest.mark.parametrize("client_class", [
- CloudShellServiceClient,
- CloudShellServiceAsyncClient,
-])
-def test_cloud_shell_service_client_from_service_account_file(client_class):
- creds = ga_credentials.AnonymousCredentials()
- with mock.patch.object(service_account.Credentials, 'from_service_account_file') as factory:
- factory.return_value = creds
- client = client_class.from_service_account_file("dummy/file/path.json")
- assert client.transport._credentials == creds
- assert isinstance(client, client_class)
-
- client = client_class.from_service_account_json("dummy/file/path.json")
- assert client.transport._credentials == creds
- assert isinstance(client, client_class)
-
- assert client.transport._host == 'cloudshell.googleapis.com:443'
-
-
-def test_cloud_shell_service_client_get_transport_class():
- transport = CloudShellServiceClient.get_transport_class()
- available_transports = [
- transports.CloudShellServiceGrpcTransport,
- ]
- assert transport in available_transports
-
- transport = CloudShellServiceClient.get_transport_class("grpc")
- assert transport == transports.CloudShellServiceGrpcTransport
-
-
-@pytest.mark.parametrize("client_class,transport_class,transport_name", [
- (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
- (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
-])
-@mock.patch.object(CloudShellServiceClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceClient))
-@mock.patch.object(CloudShellServiceAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceAsyncClient))
-def test_cloud_shell_service_client_client_options(client_class, transport_class, transport_name):
- # Check that if channel is provided we won't create a new one.
- with mock.patch.object(CloudShellServiceClient, 'get_transport_class') as gtc:
- transport = transport_class(
- credentials=ga_credentials.AnonymousCredentials()
- )
- client = client_class(transport=transport)
- gtc.assert_not_called()
-
- # Check that if channel is provided via str we will create a new one.
- with mock.patch.object(CloudShellServiceClient, 'get_transport_class') as gtc:
- client = client_class(transport=transport_name)
- gtc.assert_called()
-
- # Check the case api_endpoint is provided.
- options = client_options.ClientOptions(api_endpoint="squid.clam.whelk")
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class(client_options=options)
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host="squid.clam.whelk",
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
- # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is
- # "never".
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "never"}):
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class()
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=client.DEFAULT_ENDPOINT,
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
- # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT is
- # "always".
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "always"}):
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class()
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=client.DEFAULT_MTLS_ENDPOINT,
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
- # Check the case api_endpoint is not provided and GOOGLE_API_USE_MTLS_ENDPOINT has
- # unsupported value.
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "Unsupported"}):
- with pytest.raises(MutualTLSChannelError):
- client = client_class()
-
- # Check the case GOOGLE_API_USE_CLIENT_CERTIFICATE has unsupported value.
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": "Unsupported"}):
- with pytest.raises(ValueError):
- client = client_class()
-
- # Check the case quota_project_id is provided
- options = client_options.ClientOptions(quota_project_id="octopus")
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class(client_options=options)
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=client.DEFAULT_ENDPOINT,
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id="octopus",
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
-@pytest.mark.parametrize("client_class,transport_class,transport_name,use_client_cert_env", [
- (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc", "true"),
- (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio", "true"),
- (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc", "false"),
- (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio", "false"),
-])
-@mock.patch.object(CloudShellServiceClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceClient))
-@mock.patch.object(CloudShellServiceAsyncClient, "DEFAULT_ENDPOINT", modify_default_endpoint(CloudShellServiceAsyncClient))
-@mock.patch.dict(os.environ, {"GOOGLE_API_USE_MTLS_ENDPOINT": "auto"})
-def test_cloud_shell_service_client_mtls_env_auto(client_class, transport_class, transport_name, use_client_cert_env):
- # This tests the endpoint autoswitch behavior. Endpoint is autoswitched to the default
- # mtls endpoint, if GOOGLE_API_USE_CLIENT_CERTIFICATE is "true" and client cert exists.
-
- # Check the case client_cert_source is provided. Whether client cert is used depends on
- # GOOGLE_API_USE_CLIENT_CERTIFICATE value.
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
- options = client_options.ClientOptions(client_cert_source=client_cert_source_callback)
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class(client_options=options)
-
- if use_client_cert_env == "false":
- expected_client_cert_source = None
- expected_host = client.DEFAULT_ENDPOINT
- else:
- expected_client_cert_source = client_cert_source_callback
- expected_host = client.DEFAULT_MTLS_ENDPOINT
-
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=expected_host,
- scopes=None,
- client_cert_source_for_mtls=expected_client_cert_source,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
- # Check the case ADC client cert is provided. Whether client cert is used depends on
- # GOOGLE_API_USE_CLIENT_CERTIFICATE value.
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
- with mock.patch.object(transport_class, '__init__') as patched:
- with mock.patch('google.auth.transport.mtls.has_default_client_cert_source', return_value=True):
- with mock.patch('google.auth.transport.mtls.default_client_cert_source', return_value=client_cert_source_callback):
- if use_client_cert_env == "false":
- expected_host = client.DEFAULT_ENDPOINT
- expected_client_cert_source = None
- else:
- expected_host = client.DEFAULT_MTLS_ENDPOINT
- expected_client_cert_source = client_cert_source_callback
-
- patched.return_value = None
- client = client_class()
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=expected_host,
- scopes=None,
- client_cert_source_for_mtls=expected_client_cert_source,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
- # Check the case client_cert_source and ADC client cert are not provided.
- with mock.patch.dict(os.environ, {"GOOGLE_API_USE_CLIENT_CERTIFICATE": use_client_cert_env}):
- with mock.patch.object(transport_class, '__init__') as patched:
- with mock.patch("google.auth.transport.mtls.has_default_client_cert_source", return_value=False):
- patched.return_value = None
- client = client_class()
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=client.DEFAULT_ENDPOINT,
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
-
-@pytest.mark.parametrize("client_class,transport_class,transport_name", [
- (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
- (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
-])
-def test_cloud_shell_service_client_client_options_scopes(client_class, transport_class, transport_name):
- # Check the case scopes are provided.
- options = client_options.ClientOptions(
- scopes=["1", "2"],
- )
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class(client_options=options)
- patched.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host=client.DEFAULT_ENDPOINT,
- scopes=["1", "2"],
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
-@pytest.mark.parametrize("client_class,transport_class,transport_name", [
- (CloudShellServiceClient, transports.CloudShellServiceGrpcTransport, "grpc"),
- (CloudShellServiceAsyncClient, transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
-])
-def test_cloud_shell_service_client_client_options_credentials_file(client_class, transport_class, transport_name):
- # Check the case credentials file is provided.
- options = client_options.ClientOptions(
- credentials_file="credentials.json"
- )
- with mock.patch.object(transport_class, '__init__') as patched:
- patched.return_value = None
- client = client_class(client_options=options)
- patched.assert_called_once_with(
- credentials=None,
- credentials_file="credentials.json",
- host=client.DEFAULT_ENDPOINT,
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
-
-def test_cloud_shell_service_client_client_options_from_dict():
- with mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceGrpcTransport.__init__') as grpc_transport:
- grpc_transport.return_value = None
- client = CloudShellServiceClient(
- client_options={'api_endpoint': 'squid.clam.whelk'}
- )
- grpc_transport.assert_called_once_with(
- credentials=None,
- credentials_file=None,
- host="squid.clam.whelk",
- scopes=None,
- client_cert_source_for_mtls=None,
- quota_project_id=None,
- client_info=transports.base.DEFAULT_CLIENT_INFO,
- )
-
-
-def test_get_environment(transport: str = 'grpc', request_type=cloudshell.GetEnvironmentRequest):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = cloudshell.Environment(
- name='name_value',
- id='id_value',
- docker_image='docker_image_value',
- state=cloudshell.Environment.State.SUSPENDED,
- web_host='web_host_value',
- ssh_username='ssh_username_value',
- ssh_host='ssh_host_value',
- ssh_port=882,
- public_keys=['public_keys_value'],
- )
- response = client.get_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.GetEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, cloudshell.Environment)
- assert response.name == 'name_value'
- assert response.id == 'id_value'
- assert response.docker_image == 'docker_image_value'
- assert response.state == cloudshell.Environment.State.SUSPENDED
- assert response.web_host == 'web_host_value'
- assert response.ssh_username == 'ssh_username_value'
- assert response.ssh_host == 'ssh_host_value'
- assert response.ssh_port == 882
- assert response.public_keys == ['public_keys_value']
-
-
-def test_get_environment_from_dict():
- test_get_environment(request_type=dict)
-
-
-def test_get_environment_empty_call():
- # This test is a coverage failsafe to make sure that totally empty calls,
- # i.e. request == None and no flattened fields passed, work.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- client.get_environment()
- call.assert_called()
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.GetEnvironmentRequest()
-
-
-@pytest.mark.asyncio
-async def test_get_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.GetEnvironmentRequest):
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value =grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment(
- name='name_value',
- id='id_value',
- docker_image='docker_image_value',
- state=cloudshell.Environment.State.SUSPENDED,
- web_host='web_host_value',
- ssh_username='ssh_username_value',
- ssh_host='ssh_host_value',
- ssh_port=882,
- public_keys=['public_keys_value'],
- ))
- response = await client.get_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.GetEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, cloudshell.Environment)
- assert response.name == 'name_value'
- assert response.id == 'id_value'
- assert response.docker_image == 'docker_image_value'
- assert response.state == cloudshell.Environment.State.SUSPENDED
- assert response.web_host == 'web_host_value'
- assert response.ssh_username == 'ssh_username_value'
- assert response.ssh_host == 'ssh_host_value'
- assert response.ssh_port == 882
- assert response.public_keys == ['public_keys_value']
-
-
-@pytest.mark.asyncio
-async def test_get_environment_async_from_dict():
- await test_get_environment_async(request_type=dict)
-
-
-def test_get_environment_field_headers():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.GetEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- call.return_value = cloudshell.Environment()
- client.get_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-@pytest.mark.asyncio
-async def test_get_environment_field_headers_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.GetEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment())
- await client.get_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-def test_get_environment_flattened():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = cloudshell.Environment()
- # Call the method with a truthy value for each flattened field,
- # using the keyword arguments to the method.
- client.get_environment(
- name='name_value',
- )
-
- # Establish that the underlying call was made with the expected
- # request object values.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0].name == 'name_value'
-
-
-def test_get_environment_flattened_error():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Attempting to call a method with both a request object and flattened
- # fields is an error.
- with pytest.raises(ValueError):
- client.get_environment(
- cloudshell.GetEnvironmentRequest(),
- name='name_value',
- )
-
-
-@pytest.mark.asyncio
-async def test_get_environment_flattened_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.get_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = cloudshell.Environment()
-
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(cloudshell.Environment())
- # Call the method with a truthy value for each flattened field,
- # using the keyword arguments to the method.
- response = await client.get_environment(
- name='name_value',
- )
-
- # Establish that the underlying call was made with the expected
- # request object values.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0].name == 'name_value'
-
-
-@pytest.mark.asyncio
-async def test_get_environment_flattened_error_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Attempting to call a method with both a request object and flattened
- # fields is an error.
- with pytest.raises(ValueError):
- await client.get_environment(
- cloudshell.GetEnvironmentRequest(),
- name='name_value',
- )
-
-
-def test_start_environment(transport: str = 'grpc', request_type=cloudshell.StartEnvironmentRequest):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.start_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = operations_pb2.Operation(name='operations/spam')
- response = client.start_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.StartEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-def test_start_environment_from_dict():
- test_start_environment(request_type=dict)
-
-
-def test_start_environment_empty_call():
- # This test is a coverage failsafe to make sure that totally empty calls,
- # i.e. request == None and no flattened fields passed, work.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.start_environment),
- '__call__') as call:
- client.start_environment()
- call.assert_called()
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.StartEnvironmentRequest()
-
-
-@pytest.mark.asyncio
-async def test_start_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.StartEnvironmentRequest):
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.start_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
- operations_pb2.Operation(name='operations/spam')
- )
- response = await client.start_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.StartEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-@pytest.mark.asyncio
-async def test_start_environment_async_from_dict():
- await test_start_environment_async(request_type=dict)
-
-
-def test_start_environment_field_headers():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.StartEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.start_environment),
- '__call__') as call:
- call.return_value = operations_pb2.Operation(name='operations/op')
- client.start_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-@pytest.mark.asyncio
-async def test_start_environment_field_headers_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.StartEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.start_environment),
- '__call__') as call:
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
- await client.start_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-def test_authorize_environment(transport: str = 'grpc', request_type=cloudshell.AuthorizeEnvironmentRequest):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.authorize_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = operations_pb2.Operation(name='operations/spam')
- response = client.authorize_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-def test_authorize_environment_from_dict():
- test_authorize_environment(request_type=dict)
-
-
-def test_authorize_environment_empty_call():
- # This test is a coverage failsafe to make sure that totally empty calls,
- # i.e. request == None and no flattened fields passed, work.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.authorize_environment),
- '__call__') as call:
- client.authorize_environment()
- call.assert_called()
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
-
-
-@pytest.mark.asyncio
-async def test_authorize_environment_async(transport: str = 'grpc_asyncio', request_type=cloudshell.AuthorizeEnvironmentRequest):
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.authorize_environment),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
- operations_pb2.Operation(name='operations/spam')
- )
- response = await client.authorize_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AuthorizeEnvironmentRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-@pytest.mark.asyncio
-async def test_authorize_environment_async_from_dict():
- await test_authorize_environment_async(request_type=dict)
-
-
-def test_authorize_environment_field_headers():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.AuthorizeEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.authorize_environment),
- '__call__') as call:
- call.return_value = operations_pb2.Operation(name='operations/op')
- client.authorize_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-@pytest.mark.asyncio
-async def test_authorize_environment_field_headers_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.AuthorizeEnvironmentRequest()
-
- request.name = 'name/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.authorize_environment),
- '__call__') as call:
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
- await client.authorize_environment(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'name=name/value',
- ) in kw['metadata']
-
-
-def test_add_public_key(transport: str = 'grpc', request_type=cloudshell.AddPublicKeyRequest):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.add_public_key),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = operations_pb2.Operation(name='operations/spam')
- response = client.add_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AddPublicKeyRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-def test_add_public_key_from_dict():
- test_add_public_key(request_type=dict)
-
-
-def test_add_public_key_empty_call():
- # This test is a coverage failsafe to make sure that totally empty calls,
- # i.e. request == None and no flattened fields passed, work.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.add_public_key),
- '__call__') as call:
- client.add_public_key()
- call.assert_called()
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AddPublicKeyRequest()
-
-
-@pytest.mark.asyncio
-async def test_add_public_key_async(transport: str = 'grpc_asyncio', request_type=cloudshell.AddPublicKeyRequest):
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.add_public_key),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
- operations_pb2.Operation(name='operations/spam')
- )
- response = await client.add_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.AddPublicKeyRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-@pytest.mark.asyncio
-async def test_add_public_key_async_from_dict():
- await test_add_public_key_async(request_type=dict)
-
-
-def test_add_public_key_field_headers():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.AddPublicKeyRequest()
-
- request.environment = 'environment/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.add_public_key),
- '__call__') as call:
- call.return_value = operations_pb2.Operation(name='operations/op')
- client.add_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'environment=environment/value',
- ) in kw['metadata']
-
-
-@pytest.mark.asyncio
-async def test_add_public_key_field_headers_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.AddPublicKeyRequest()
-
- request.environment = 'environment/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.add_public_key),
- '__call__') as call:
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
- await client.add_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'environment=environment/value',
- ) in kw['metadata']
-
-
-def test_remove_public_key(transport: str = 'grpc', request_type=cloudshell.RemovePublicKeyRequest):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.remove_public_key),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = operations_pb2.Operation(name='operations/spam')
- response = client.remove_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.RemovePublicKeyRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-def test_remove_public_key_from_dict():
- test_remove_public_key(request_type=dict)
-
-
-def test_remove_public_key_empty_call():
- # This test is a coverage failsafe to make sure that totally empty calls,
- # i.e. request == None and no flattened fields passed, work.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.remove_public_key),
- '__call__') as call:
- client.remove_public_key()
- call.assert_called()
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.RemovePublicKeyRequest()
-
-
-@pytest.mark.asyncio
-async def test_remove_public_key_async(transport: str = 'grpc_asyncio', request_type=cloudshell.RemovePublicKeyRequest):
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # Everything is optional in proto3 as far as the runtime is concerned,
- # and we are mocking out the actual API, so just send an empty request.
- request = request_type()
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.remove_public_key),
- '__call__') as call:
- # Designate an appropriate return value for the call.
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(
- operations_pb2.Operation(name='operations/spam')
- )
- response = await client.remove_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == cloudshell.RemovePublicKeyRequest()
-
- # Establish that the response is the type that we expect.
- assert isinstance(response, future.Future)
-
-
-@pytest.mark.asyncio
-async def test_remove_public_key_async_from_dict():
- await test_remove_public_key_async(request_type=dict)
-
-
-def test_remove_public_key_field_headers():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.RemovePublicKeyRequest()
-
- request.environment = 'environment/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.remove_public_key),
- '__call__') as call:
- call.return_value = operations_pb2.Operation(name='operations/op')
- client.remove_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls) == 1
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'environment=environment/value',
- ) in kw['metadata']
-
-
-@pytest.mark.asyncio
-async def test_remove_public_key_field_headers_async():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Any value that is part of the HTTP/1.1 URI should be sent as
- # a field header. Set these to a non-empty value.
- request = cloudshell.RemovePublicKeyRequest()
-
- request.environment = 'environment/value'
-
- # Mock the actual call within the gRPC stub, and fake the request.
- with mock.patch.object(
- type(client.transport.remove_public_key),
- '__call__') as call:
- call.return_value = grpc_helpers_async.FakeUnaryUnaryCall(operations_pb2.Operation(name='operations/op'))
- await client.remove_public_key(request)
-
- # Establish that the underlying gRPC stub method was called.
- assert len(call.mock_calls)
- _, args, _ = call.mock_calls[0]
- assert args[0] == request
-
- # Establish that the field header was sent.
- _, _, kw = call.mock_calls[0]
- assert (
- 'x-goog-request-params',
- 'environment=environment/value',
- ) in kw['metadata']
-
-
-def test_credentials_transport_error():
- # It is an error to provide credentials and a transport instance.
- transport = transports.CloudShellServiceGrpcTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- with pytest.raises(ValueError):
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport=transport,
- )
-
- # It is an error to provide a credentials file and a transport instance.
- transport = transports.CloudShellServiceGrpcTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- with pytest.raises(ValueError):
- client = CloudShellServiceClient(
- client_options={"credentials_file": "credentials.json"},
- transport=transport,
- )
-
- # It is an error to provide scopes and a transport instance.
- transport = transports.CloudShellServiceGrpcTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- with pytest.raises(ValueError):
- client = CloudShellServiceClient(
- client_options={"scopes": ["1", "2"]},
- transport=transport,
- )
-
-
-def test_transport_instance():
- # A client may be instantiated with a custom transport instance.
- transport = transports.CloudShellServiceGrpcTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- client = CloudShellServiceClient(transport=transport)
- assert client.transport is transport
-
-def test_transport_get_channel():
- # A client may be instantiated with a custom transport instance.
- transport = transports.CloudShellServiceGrpcTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- channel = transport.grpc_channel
- assert channel
-
- transport = transports.CloudShellServiceGrpcAsyncIOTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- channel = transport.grpc_channel
- assert channel
-
-@pytest.mark.parametrize("transport_class", [
- transports.CloudShellServiceGrpcTransport,
- transports.CloudShellServiceGrpcAsyncIOTransport,
-])
-def test_transport_adc(transport_class):
- # Test default credentials are used if not provided.
- with mock.patch.object(google.auth, 'default') as adc:
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport_class()
- adc.assert_called_once()
-
-def test_transport_grpc_default():
- # A client should use the gRPC transport by default.
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- )
- assert isinstance(
- client.transport,
- transports.CloudShellServiceGrpcTransport,
- )
-
-def test_cloud_shell_service_base_transport_error():
- # Passing both a credentials object and credentials_file should raise an error
- with pytest.raises(core_exceptions.DuplicateCredentialArgs):
- transport = transports.CloudShellServiceTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- credentials_file="credentials.json"
- )
-
-
-def test_cloud_shell_service_base_transport():
- # Instantiate the base transport.
- with mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport.__init__') as Transport:
- Transport.return_value = None
- transport = transports.CloudShellServiceTransport(
- credentials=ga_credentials.AnonymousCredentials(),
- )
-
- # Every method on the transport should just blindly
- # raise NotImplementedError.
- methods = (
- 'get_environment',
- 'start_environment',
- 'authorize_environment',
- 'add_public_key',
- 'remove_public_key',
- )
- for method in methods:
- with pytest.raises(NotImplementedError):
- getattr(transport, method)(request=object())
-
- # Additionally, the LRO client (a property) should
- # also raise NotImplementedError
- with pytest.raises(NotImplementedError):
- transport.operations_client
-
-
-@requires_google_auth_gte_1_25_0
-def test_cloud_shell_service_base_transport_with_credentials_file():
- # Instantiate the base transport with a credentials file
- with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
- Transport.return_value = None
- load_creds.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport = transports.CloudShellServiceTransport(
- credentials_file="credentials.json",
- quota_project_id="octopus",
- )
- load_creds.assert_called_once_with("credentials.json",
- scopes=None,
- default_scopes=(
- 'https://www.googleapis.com/auth/cloud-platform',
-),
- quota_project_id="octopus",
- )
-
-
-@requires_google_auth_lt_1_25_0
-def test_cloud_shell_service_base_transport_with_credentials_file_old_google_auth():
- # Instantiate the base transport with a credentials file
- with mock.patch.object(google.auth, 'load_credentials_from_file', autospec=True) as load_creds, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
- Transport.return_value = None
- load_creds.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport = transports.CloudShellServiceTransport(
- credentials_file="credentials.json",
- quota_project_id="octopus",
- )
- load_creds.assert_called_once_with("credentials.json", scopes=(
- 'https://www.googleapis.com/auth/cloud-platform',
- ),
- quota_project_id="octopus",
- )
-
-
-def test_cloud_shell_service_base_transport_with_adc():
- # Test the default credentials are used if credentials and credentials_file are None.
- with mock.patch.object(google.auth, 'default', autospec=True) as adc, mock.patch('google.cloud.shell_v1.services.cloud_shell_service.transports.CloudShellServiceTransport._prep_wrapped_messages') as Transport:
- Transport.return_value = None
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport = transports.CloudShellServiceTransport()
- adc.assert_called_once()
-
-
-@requires_google_auth_gte_1_25_0
-def test_cloud_shell_service_auth_adc():
- # If no credentials are provided, we should use ADC credentials.
- with mock.patch.object(google.auth, 'default', autospec=True) as adc:
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- CloudShellServiceClient()
- adc.assert_called_once_with(
- scopes=None,
- default_scopes=(
- 'https://www.googleapis.com/auth/cloud-platform',
-),
- quota_project_id=None,
- )
-
-
-@requires_google_auth_lt_1_25_0
-def test_cloud_shell_service_auth_adc_old_google_auth():
- # If no credentials are provided, we should use ADC credentials.
- with mock.patch.object(google.auth, 'default', autospec=True) as adc:
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- CloudShellServiceClient()
- adc.assert_called_once_with(
- scopes=( 'https://www.googleapis.com/auth/cloud-platform',),
- quota_project_id=None,
- )
-
-
-@pytest.mark.parametrize(
- "transport_class",
- [
- transports.CloudShellServiceGrpcTransport,
- transports.CloudShellServiceGrpcAsyncIOTransport,
- ],
-)
-@requires_google_auth_gte_1_25_0
-def test_cloud_shell_service_transport_auth_adc(transport_class):
- # If credentials and host are not provided, the transport class should use
- # ADC credentials.
- with mock.patch.object(google.auth, 'default', autospec=True) as adc:
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport_class(quota_project_id="octopus", scopes=["1", "2"])
- adc.assert_called_once_with(
- scopes=["1", "2"],
- default_scopes=( 'https://www.googleapis.com/auth/cloud-platform',),
- quota_project_id="octopus",
- )
-
-
-@pytest.mark.parametrize(
- "transport_class",
- [
- transports.CloudShellServiceGrpcTransport,
- transports.CloudShellServiceGrpcAsyncIOTransport,
- ],
-)
-@requires_google_auth_lt_1_25_0
-def test_cloud_shell_service_transport_auth_adc_old_google_auth(transport_class):
- # If credentials and host are not provided, the transport class should use
- # ADC credentials.
- with mock.patch.object(google.auth, "default", autospec=True) as adc:
- adc.return_value = (ga_credentials.AnonymousCredentials(), None)
- transport_class(quota_project_id="octopus")
- adc.assert_called_once_with(scopes=(
- 'https://www.googleapis.com/auth/cloud-platform',
-),
- quota_project_id="octopus",
- )
-
-
-@pytest.mark.parametrize(
- "transport_class,grpc_helpers",
- [
- (transports.CloudShellServiceGrpcTransport, grpc_helpers),
- (transports.CloudShellServiceGrpcAsyncIOTransport, grpc_helpers_async)
- ],
-)
-def test_cloud_shell_service_transport_create_channel(transport_class, grpc_helpers):
- # If credentials and host are not provided, the transport class should use
- # ADC credentials.
- with mock.patch.object(google.auth, "default", autospec=True) as adc, mock.patch.object(
- grpc_helpers, "create_channel", autospec=True
- ) as create_channel:
- creds = ga_credentials.AnonymousCredentials()
- adc.return_value = (creds, None)
- transport_class(
- quota_project_id="octopus",
- scopes=["1", "2"]
- )
-
- create_channel.assert_called_with(
- "cloudshell.googleapis.com:443",
- credentials=creds,
- credentials_file=None,
- quota_project_id="octopus",
- default_scopes=(
- 'https://www.googleapis.com/auth/cloud-platform',
-),
- scopes=["1", "2"],
- default_host="cloudshell.googleapis.com",
- ssl_credentials=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
-
-@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
-def test_cloud_shell_service_grpc_transport_client_cert_source_for_mtls(
- transport_class
-):
- cred = ga_credentials.AnonymousCredentials()
-
- # Check ssl_channel_credentials is used if provided.
- with mock.patch.object(transport_class, "create_channel") as mock_create_channel:
- mock_ssl_channel_creds = mock.Mock()
- transport_class(
- host="squid.clam.whelk",
- credentials=cred,
- ssl_channel_credentials=mock_ssl_channel_creds
- )
- mock_create_channel.assert_called_once_with(
- "squid.clam.whelk:443",
- credentials=cred,
- credentials_file=None,
- scopes=None,
- ssl_credentials=mock_ssl_channel_creds,
- quota_project_id=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
-
- # Check if ssl_channel_credentials is not provided, then client_cert_source_for_mtls
- # is used.
- with mock.patch.object(transport_class, "create_channel", return_value=mock.Mock()):
- with mock.patch("grpc.ssl_channel_credentials") as mock_ssl_cred:
- transport_class(
- credentials=cred,
- client_cert_source_for_mtls=client_cert_source_callback
- )
- expected_cert, expected_key = client_cert_source_callback()
- mock_ssl_cred.assert_called_once_with(
- certificate_chain=expected_cert,
- private_key=expected_key
- )
-
-
-def test_cloud_shell_service_host_no_port():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- client_options=client_options.ClientOptions(api_endpoint='cloudshell.googleapis.com'),
- )
- assert client.transport._host == 'cloudshell.googleapis.com:443'
-
-
-def test_cloud_shell_service_host_with_port():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- client_options=client_options.ClientOptions(api_endpoint='cloudshell.googleapis.com:8000'),
- )
- assert client.transport._host == 'cloudshell.googleapis.com:8000'
-
-def test_cloud_shell_service_grpc_transport_channel():
- channel = grpc.secure_channel('http://localhost/', grpc.local_channel_credentials())
-
- # Check that channel is used if provided.
- transport = transports.CloudShellServiceGrpcTransport(
- host="squid.clam.whelk",
- channel=channel,
- )
- assert transport.grpc_channel == channel
- assert transport._host == "squid.clam.whelk:443"
- assert transport._ssl_channel_credentials == None
-
-
-def test_cloud_shell_service_grpc_asyncio_transport_channel():
- channel = aio.secure_channel('http://localhost/', grpc.local_channel_credentials())
-
- # Check that channel is used if provided.
- transport = transports.CloudShellServiceGrpcAsyncIOTransport(
- host="squid.clam.whelk",
- channel=channel,
- )
- assert transport.grpc_channel == channel
- assert transport._host == "squid.clam.whelk:443"
- assert transport._ssl_channel_credentials == None
-
-
-# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are
-# removed from grpc/grpc_asyncio transport constructor.
-@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
-def test_cloud_shell_service_transport_channel_mtls_with_client_cert_source(
- transport_class
-):
- with mock.patch("grpc.ssl_channel_credentials", autospec=True) as grpc_ssl_channel_cred:
- with mock.patch.object(transport_class, "create_channel") as grpc_create_channel:
- mock_ssl_cred = mock.Mock()
- grpc_ssl_channel_cred.return_value = mock_ssl_cred
-
- mock_grpc_channel = mock.Mock()
- grpc_create_channel.return_value = mock_grpc_channel
-
- cred = ga_credentials.AnonymousCredentials()
- with pytest.warns(DeprecationWarning):
- with mock.patch.object(google.auth, 'default') as adc:
- adc.return_value = (cred, None)
- transport = transport_class(
- host="squid.clam.whelk",
- api_mtls_endpoint="mtls.squid.clam.whelk",
- client_cert_source=client_cert_source_callback,
- )
- adc.assert_called_once()
-
- grpc_ssl_channel_cred.assert_called_once_with(
- certificate_chain=b"cert bytes", private_key=b"key bytes"
- )
- grpc_create_channel.assert_called_once_with(
- "mtls.squid.clam.whelk:443",
- credentials=cred,
- credentials_file=None,
- scopes=None,
- ssl_credentials=mock_ssl_cred,
- quota_project_id=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
- assert transport.grpc_channel == mock_grpc_channel
- assert transport._ssl_channel_credentials == mock_ssl_cred
-
-
-# Remove this test when deprecated arguments (api_mtls_endpoint, client_cert_source) are
-# removed from grpc/grpc_asyncio transport constructor.
-@pytest.mark.parametrize("transport_class", [transports.CloudShellServiceGrpcTransport, transports.CloudShellServiceGrpcAsyncIOTransport])
-def test_cloud_shell_service_transport_channel_mtls_with_adc(
- transport_class
-):
- mock_ssl_cred = mock.Mock()
- with mock.patch.multiple(
- "google.auth.transport.grpc.SslCredentials",
- __init__=mock.Mock(return_value=None),
- ssl_credentials=mock.PropertyMock(return_value=mock_ssl_cred),
- ):
- with mock.patch.object(transport_class, "create_channel") as grpc_create_channel:
- mock_grpc_channel = mock.Mock()
- grpc_create_channel.return_value = mock_grpc_channel
- mock_cred = mock.Mock()
-
- with pytest.warns(DeprecationWarning):
- transport = transport_class(
- host="squid.clam.whelk",
- credentials=mock_cred,
- api_mtls_endpoint="mtls.squid.clam.whelk",
- client_cert_source=None,
- )
-
- grpc_create_channel.assert_called_once_with(
- "mtls.squid.clam.whelk:443",
- credentials=mock_cred,
- credentials_file=None,
- scopes=None,
- ssl_credentials=mock_ssl_cred,
- quota_project_id=None,
- options=[
- ("grpc.max_send_message_length", -1),
- ("grpc.max_receive_message_length", -1),
- ],
- )
- assert transport.grpc_channel == mock_grpc_channel
-
-
-def test_cloud_shell_service_grpc_lro_client():
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc',
- )
- transport = client.transport
-
- # Ensure that we have a api-core operations client.
- assert isinstance(
- transport.operations_client,
- operations_v1.OperationsClient,
- )
-
- # Ensure that subsequent calls to the property send the exact same object.
- assert transport.operations_client is transport.operations_client
-
-
-def test_cloud_shell_service_grpc_lro_async_client():
- client = CloudShellServiceAsyncClient(
- credentials=ga_credentials.AnonymousCredentials(),
- transport='grpc_asyncio',
- )
- transport = client.transport
-
- # Ensure that we have a api-core operations client.
- assert isinstance(
- transport.operations_client,
- operations_v1.OperationsAsyncClient,
- )
-
- # Ensure that subsequent calls to the property send the exact same object.
- assert transport.operations_client is transport.operations_client
-
-
-def test_environment_path():
- user = "squid"
- environment = "clam"
- expected = "users/{user}/environments/{environment}".format(user=user, environment=environment, )
- actual = CloudShellServiceClient.environment_path(user, environment)
- assert expected == actual
-
-
-def test_parse_environment_path():
- expected = {
- "user": "whelk",
- "environment": "octopus",
- }
- path = CloudShellServiceClient.environment_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_environment_path(path)
- assert expected == actual
-
-def test_common_billing_account_path():
- billing_account = "oyster"
- expected = "billingAccounts/{billing_account}".format(billing_account=billing_account, )
- actual = CloudShellServiceClient.common_billing_account_path(billing_account)
- assert expected == actual
-
-
-def test_parse_common_billing_account_path():
- expected = {
- "billing_account": "nudibranch",
- }
- path = CloudShellServiceClient.common_billing_account_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_common_billing_account_path(path)
- assert expected == actual
-
-def test_common_folder_path():
- folder = "cuttlefish"
- expected = "folders/{folder}".format(folder=folder, )
- actual = CloudShellServiceClient.common_folder_path(folder)
- assert expected == actual
-
-
-def test_parse_common_folder_path():
- expected = {
- "folder": "mussel",
- }
- path = CloudShellServiceClient.common_folder_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_common_folder_path(path)
- assert expected == actual
-
-def test_common_organization_path():
- organization = "winkle"
- expected = "organizations/{organization}".format(organization=organization, )
- actual = CloudShellServiceClient.common_organization_path(organization)
- assert expected == actual
-
-
-def test_parse_common_organization_path():
- expected = {
- "organization": "nautilus",
- }
- path = CloudShellServiceClient.common_organization_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_common_organization_path(path)
- assert expected == actual
-
-def test_common_project_path():
- project = "scallop"
- expected = "projects/{project}".format(project=project, )
- actual = CloudShellServiceClient.common_project_path(project)
- assert expected == actual
-
-
-def test_parse_common_project_path():
- expected = {
- "project": "abalone",
- }
- path = CloudShellServiceClient.common_project_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_common_project_path(path)
- assert expected == actual
-
-def test_common_location_path():
- project = "squid"
- location = "clam"
- expected = "projects/{project}/locations/{location}".format(project=project, location=location, )
- actual = CloudShellServiceClient.common_location_path(project, location)
- assert expected == actual
-
-
-def test_parse_common_location_path():
- expected = {
- "project": "whelk",
- "location": "octopus",
- }
- path = CloudShellServiceClient.common_location_path(**expected)
-
- # Check that the path construction is reversible.
- actual = CloudShellServiceClient.parse_common_location_path(path)
- assert expected == actual
-
-
-def test_client_withDEFAULT_CLIENT_INFO():
- client_info = gapic_v1.client_info.ClientInfo()
-
- with mock.patch.object(transports.CloudShellServiceTransport, '_prep_wrapped_messages') as prep:
- client = CloudShellServiceClient(
- credentials=ga_credentials.AnonymousCredentials(),
- client_info=client_info,
- )
- prep.assert_called_once_with(client_info)
-
- with mock.patch.object(transports.CloudShellServiceTransport, '_prep_wrapped_messages') as prep:
- transport_class = CloudShellServiceClient.get_transport_class()
- transport = transport_class(
- credentials=ga_credentials.AnonymousCredentials(),
- client_info=client_info,
- )
- prep.assert_called_once_with(client_info)
diff --git a/setup.py b/setup.py
index 366340c..676aae5 100644
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@
name = "google-cloud-shell"
description = "Cloud Shell API client library"
-version = "0.1.0"
+version = "0.2.0"
release_status = "Development Status :: 4 - Beta"
url = "https://github.com/googleapis/python-shell"
dependencies = [
diff --git a/tests/unit/gapic/shell_v1/test_cloud_shell_service.py b/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
index d5c2a2d..0c639c0 100644
--- a/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
+++ b/tests/unit/gapic/shell_v1/test_cloud_shell_service.py
@@ -134,7 +134,25 @@ def test_cloud_shell_service_client_service_account_always_use_jwt(client_class)
) as use_jwt:
creds = service_account.Credentials(None, None, None)
client = client_class(credentials=creds)
- use_jwt.assert_called_with(True)
+ use_jwt.assert_not_called()
+
+
+@pytest.mark.parametrize(
+ "transport_class,transport_name",
+ [
+ (transports.CloudShellServiceGrpcTransport, "grpc"),
+ (transports.CloudShellServiceGrpcAsyncIOTransport, "grpc_asyncio"),
+ ],
+)
+def test_cloud_shell_service_client_service_account_always_use_jwt_true(
+ transport_class, transport_name
+):
+ with mock.patch.object(
+ service_account.Credentials, "with_always_use_jwt_access", create=True
+ ) as use_jwt:
+ creds = service_account.Credentials(None, None, None)
+ transport = transport_class(credentials=creds, always_use_jwt_access=True)
+ use_jwt.assert_called_once_with(True)
@pytest.mark.parametrize(
@@ -1574,7 +1592,7 @@ def test_cloud_shell_service_grpc_transport_client_cert_source_for_mtls(
"squid.clam.whelk:443",
credentials=cred,
credentials_file=None,
- scopes=("https://www.googleapis.com/auth/cloud-platform",),
+ scopes=None,
ssl_credentials=mock_ssl_channel_creds,
quota_project_id=None,
options=[
@@ -1683,7 +1701,7 @@ def test_cloud_shell_service_transport_channel_mtls_with_client_cert_source(
"mtls.squid.clam.whelk:443",
credentials=cred,
credentials_file=None,
- scopes=("https://www.googleapis.com/auth/cloud-platform",),
+ scopes=None,
ssl_credentials=mock_ssl_cred,
quota_project_id=None,
options=[
@@ -1730,7 +1748,7 @@ def test_cloud_shell_service_transport_channel_mtls_with_adc(transport_class):
"mtls.squid.clam.whelk:443",
credentials=mock_cred,
credentials_file=None,
- scopes=("https://www.googleapis.com/auth/cloud-platform",),
+ scopes=None,
ssl_credentials=mock_ssl_cred,
quota_project_id=None,
options=[