<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="cloudshell_v1alpha1.html">Cloud Shell API</a> . <a href="cloudshell_v1alpha1.users.html">users</a> . <a href="cloudshell_v1alpha1.users.environments.html">environments</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="cloudshell_v1alpha1.users.environments.publicKeys.html">publicKeys()</a></code>
</p>
<p class="firstline">Returns the publicKeys Resource.</p>

<p class="toc_element">
  <code><a href="#authorize">authorize(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Sends OAuth credentials to a running environment on behalf of a user. When</p>
<p class="toc_element">
  <code><a href="#get">get(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets an environment. Returns NOT_FOUND if the environment does not exist.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates an existing environment.</p>
<p class="toc_element">
  <code><a href="#start">start(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Starts an existing environment, allowing clients to connect to it. The</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="authorize">authorize(name, body=None, x__xgafv=None)</code>
  <pre>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:
  name: string, Name of the resource that should receive the credentials, for example
`users/me/environments/default` or
`users/someone@example.com/environments/default`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for AuthorizeEnvironment.
    &quot;expireTime&quot;: &quot;A String&quot;, # The time when the credentials expire. If not set, defaults to one hour from
        # when the server received the request.
    &quot;accessToken&quot;: &quot;A String&quot;, # The OAuth access token that should be sent to the environment.
    &quot;idToken&quot;: &quot;A String&quot;, # The OAuth ID token that should be sent to the environment.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(name, x__xgafv=None)</code>
  <pre>Gets an environment. Returns NOT_FOUND if the environment does not exist.

Args:
  name: string, Name of the requested resource, for example `users/me/environments/default`
or `users/someone@example.com/environments/default`. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # 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&#x27;s data that will remain across sessions. Each user has a
        # single environment with the ID &quot;default&quot;.
      &quot;sshPort&quot;: 42, # Output only. Port to which clients can connect to initiate SSH sessions
          # with the environment.
      &quot;webHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate HTTPS or WSS
          # connections with the environment.
      &quot;webPorts&quot;: [ # Output only. Ports to which clients can connect to initiate HTTPS or WSS
          # connections with the environment.
        42,
      ],
      &quot;id&quot;: &quot;A String&quot;, # Output only. The environment&#x27;s identifier, unique among the user&#x27;s
          # environments.
      &quot;size&quot;: &quot;A String&quot;, # Indicates the size of the backing VM running the environment.  If set to
          # something other than DEFAULT, it will be reverted to the default VM size
          # after vm_size_expire_time.
      &quot;sshHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate SSH sessions
          # with the environment.
      &quot;publicKeys&quot;: [ # 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 CreatePublicKey and DeletePublicKey
          # methods.
        { # A public SSH key, corresponding to a private SSH key held by the client.
          &quot;format&quot;: &quot;A String&quot;, # Required. Format of this key&#x27;s content.
          &quot;name&quot;: &quot;A String&quot;, # Output only. Full name of this resource, in the format
              # `users/{owner_email}/environments/{environment_id}/publicKeys/{key_id}`.
              # `{owner_email}` is the email address of the user to whom the key belongs.
              # `{environment_id}` is the identifier of the environment to which the key
              # grants access. `{key_id}` is the unique identifier of the key. For example,
              # `users/someone@example.com/environments/default/publicKeys/myKey`.
          &quot;key&quot;: &quot;A String&quot;, # Required. Content of this key.
        },
      ],
      &quot;vmSizeExpireTime&quot;: &quot;A String&quot;, # Output only. The time when the Environment will expire back to the default
          # VM size.
      &quot;sshUsername&quot;: &quot;A String&quot;, # Output only. Username that clients should use when initiating SSH sessions
          # with the environment.
      &quot;state&quot;: &quot;A String&quot;, # Output only. Current execution state of this environment.
      &quot;name&quot;: &quot;A String&quot;, # Output only. 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`.
      &quot;dockerImage&quot;: &quot;A String&quot;, # Required. Full path to the Docker image used to run this environment, e.g.
          # &quot;gcr.io/dev-con/cloud-devshell:latest&quot;.
    }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>Updates an existing environment.

Args:
  name: string, Name of the resource to be updated, for example
`users/me/environments/default` or
`users/someone@example.com/environments/default`. (required)
  body: object, The request body.
    The object takes the form of:

{ # 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&#x27;s data that will remain across sessions. Each user has a
      # single environment with the ID &quot;default&quot;.
    &quot;sshPort&quot;: 42, # Output only. Port to which clients can connect to initiate SSH sessions
        # with the environment.
    &quot;webHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate HTTPS or WSS
        # connections with the environment.
    &quot;webPorts&quot;: [ # Output only. Ports to which clients can connect to initiate HTTPS or WSS
        # connections with the environment.
      42,
    ],
    &quot;id&quot;: &quot;A String&quot;, # Output only. The environment&#x27;s identifier, unique among the user&#x27;s
        # environments.
    &quot;size&quot;: &quot;A String&quot;, # Indicates the size of the backing VM running the environment.  If set to
        # something other than DEFAULT, it will be reverted to the default VM size
        # after vm_size_expire_time.
    &quot;sshHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate SSH sessions
        # with the environment.
    &quot;publicKeys&quot;: [ # 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 CreatePublicKey and DeletePublicKey
        # methods.
      { # A public SSH key, corresponding to a private SSH key held by the client.
        &quot;format&quot;: &quot;A String&quot;, # Required. Format of this key&#x27;s content.
        &quot;name&quot;: &quot;A String&quot;, # Output only. Full name of this resource, in the format
            # `users/{owner_email}/environments/{environment_id}/publicKeys/{key_id}`.
            # `{owner_email}` is the email address of the user to whom the key belongs.
            # `{environment_id}` is the identifier of the environment to which the key
            # grants access. `{key_id}` is the unique identifier of the key. For example,
            # `users/someone@example.com/environments/default/publicKeys/myKey`.
        &quot;key&quot;: &quot;A String&quot;, # Required. Content of this key.
      },
    ],
    &quot;vmSizeExpireTime&quot;: &quot;A String&quot;, # Output only. The time when the Environment will expire back to the default
        # VM size.
    &quot;sshUsername&quot;: &quot;A String&quot;, # Output only. Username that clients should use when initiating SSH sessions
        # with the environment.
    &quot;state&quot;: &quot;A String&quot;, # Output only. Current execution state of this environment.
    &quot;name&quot;: &quot;A String&quot;, # Output only. 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`.
    &quot;dockerImage&quot;: &quot;A String&quot;, # Required. Full path to the Docker image used to run this environment, e.g.
        # &quot;gcr.io/dev-con/cloud-devshell:latest&quot;.
  }

  updateMask: string, Mask specifying which fields in the environment should be updated.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # 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&#x27;s data that will remain across sessions. Each user has a
        # single environment with the ID &quot;default&quot;.
      &quot;sshPort&quot;: 42, # Output only. Port to which clients can connect to initiate SSH sessions
          # with the environment.
      &quot;webHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate HTTPS or WSS
          # connections with the environment.
      &quot;webPorts&quot;: [ # Output only. Ports to which clients can connect to initiate HTTPS or WSS
          # connections with the environment.
        42,
      ],
      &quot;id&quot;: &quot;A String&quot;, # Output only. The environment&#x27;s identifier, unique among the user&#x27;s
          # environments.
      &quot;size&quot;: &quot;A String&quot;, # Indicates the size of the backing VM running the environment.  If set to
          # something other than DEFAULT, it will be reverted to the default VM size
          # after vm_size_expire_time.
      &quot;sshHost&quot;: &quot;A String&quot;, # Output only. Host to which clients can connect to initiate SSH sessions
          # with the environment.
      &quot;publicKeys&quot;: [ # 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 CreatePublicKey and DeletePublicKey
          # methods.
        { # A public SSH key, corresponding to a private SSH key held by the client.
          &quot;format&quot;: &quot;A String&quot;, # Required. Format of this key&#x27;s content.
          &quot;name&quot;: &quot;A String&quot;, # Output only. Full name of this resource, in the format
              # `users/{owner_email}/environments/{environment_id}/publicKeys/{key_id}`.
              # `{owner_email}` is the email address of the user to whom the key belongs.
              # `{environment_id}` is the identifier of the environment to which the key
              # grants access. `{key_id}` is the unique identifier of the key. For example,
              # `users/someone@example.com/environments/default/publicKeys/myKey`.
          &quot;key&quot;: &quot;A String&quot;, # Required. Content of this key.
        },
      ],
      &quot;vmSizeExpireTime&quot;: &quot;A String&quot;, # Output only. The time when the Environment will expire back to the default
          # VM size.
      &quot;sshUsername&quot;: &quot;A String&quot;, # Output only. Username that clients should use when initiating SSH sessions
          # with the environment.
      &quot;state&quot;: &quot;A String&quot;, # Output only. Current execution state of this environment.
      &quot;name&quot;: &quot;A String&quot;, # Output only. 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`.
      &quot;dockerImage&quot;: &quot;A String&quot;, # Required. Full path to the Docker image used to run this environment, e.g.
          # &quot;gcr.io/dev-con/cloud-devshell:latest&quot;.
    }</pre>
</div>

<div class="method">
    <code class="details" id="start">start(name, body=None, x__xgafv=None)</code>
  <pre>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:
  name: string, Name of the resource that should be started, for example
`users/me/environments/default` or
`users/someone@example.com/environments/default`. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for StartEnvironment.
    &quot;publicKeys&quot;: [ # Public keys that should be added to the environment before it is started.
      { # A public SSH key, corresponding to a private SSH key held by the client.
        &quot;format&quot;: &quot;A String&quot;, # Required. Format of this key&#x27;s content.
        &quot;name&quot;: &quot;A String&quot;, # Output only. Full name of this resource, in the format
            # `users/{owner_email}/environments/{environment_id}/publicKeys/{key_id}`.
            # `{owner_email}` is the email address of the user to whom the key belongs.
            # `{environment_id}` is the identifier of the environment to which the key
            # grants access. `{key_id}` is the unique identifier of the key. For example,
            # `users/someone@example.com/environments/default/publicKeys/myKey`.
        &quot;key&quot;: &quot;A String&quot;, # Required. Content of this key.
      },
    ],
    &quot;accessToken&quot;: &quot;A String&quot;, # 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.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
  }</pre>
</div>

</body></html>