aboutsummaryrefslogtreecommitdiff
path: root/google/cloud/iot/v1
diff options
context:
space:
mode:
Diffstat (limited to 'google/cloud/iot/v1')
-rw-r--r--google/cloud/iot/v1/BUILD.bazel151
-rw-r--r--google/cloud/iot/v1/cloudiot_gapic.yaml514
-rw-r--r--google/cloud/iot/v1/device_manager.proto562
-rw-r--r--google/cloud/iot/v1/resources.proto474
4 files changed, 1701 insertions, 0 deletions
diff --git a/google/cloud/iot/v1/BUILD.bazel b/google/cloud/iot/v1/BUILD.bazel
new file mode 100644
index 000000000..0b149b507
--- /dev/null
+++ b/google/cloud/iot/v1/BUILD.bazel
@@ -0,0 +1,151 @@
+# This is an API workspace, having public visibility by default makes perfect sense.
+package(default_visibility = ["//visibility:public"])
+
+##############################################################################
+# Common
+##############################################################################
+load("@com_google_api_codegen//rules_gapic:gapic.bzl", "proto_library_with_info")
+
+proto_library(
+ name = "iot_proto",
+ srcs = [
+ "device_manager.proto",
+ "resources.proto",
+ ],
+ deps = [
+ "//google/api:annotations_proto",
+ "//google/iam/v1:iam_policy_proto",
+ "//google/iam/v1:policy_proto",
+ "//google/rpc:status_proto",
+ "@com_google_protobuf//:duration_proto",
+ "@com_google_protobuf//:empty_proto",
+ "@com_google_protobuf//:field_mask_proto",
+ "@com_google_protobuf//:timestamp_proto",
+ ],
+)
+
+proto_library_with_info(
+ name = "iot_proto_with_info",
+ deps = [":iot_proto"],
+)
+
+##############################################################################
+# Java
+##############################################################################
+load("@io_grpc_grpc_java//:java_grpc_library.bzl", "java_grpc_library")
+load(
+ "@com_google_api_codegen//rules_gapic/java:java_gapic.bzl",
+ "java_gapic_library",
+ "java_resource_name_proto_library",
+)
+load("@com_google_api_codegen//rules_gapic/java:java_gapic_pkg.bzl", "java_gapic_assembly_gradle_pkg")
+
+_JAVA_GRPC_DEPS = [
+ "@com_google_api_grpc_proto_google_common_protos//jar",
+ "@com_google_api_grpc_proto_google_iam_v1//jar",
+]
+
+java_proto_library(
+ name = "iot_java_proto",
+ deps = [":iot_proto"],
+)
+
+java_grpc_library(
+ name = "iot_java_grpc",
+ srcs = [":iot_proto"],
+ deps = [":iot_java_proto"] + _JAVA_GRPC_DEPS,
+)
+
+java_resource_name_proto_library(
+ name = "iot_resource_name_java_proto",
+ gapic_yaml = "cloudiot_gapic.yaml",
+ deps = [":iot_proto"],
+)
+
+java_gapic_library(
+ name = "iot_java_gapic",
+ src = ":iot_proto_with_info",
+ gapic_yaml = "cloudiot_gapic.yaml",
+ service_yaml = "//google/cloud/iot:cloudiot.yaml",
+ test_deps = [":iot_java_grpc"],
+ deps = [
+ ":iot_java_proto",
+ ":iot_resource_name_java_proto",
+ ] + _JAVA_GRPC_DEPS,
+)
+
+[java_test(
+ name = test_name,
+ test_class = test_name,
+ runtime_deps = [
+ ":iot_java_gapic_test",
+ ],
+) for test_name in [
+ "com.google.cloud.iot.v1.DeviceManagerClientTest",
+]]
+
+# Opensource Packages
+java_gapic_assembly_gradle_pkg(
+ name = "google-cloud-iot-v1-java",
+ client_deps = [":iot_java_gapic"],
+ client_group = "com.google.cloud",
+ client_test_deps = [":iot_java_gapic_test"],
+ grpc_deps = [":iot_java_grpc"],
+ grpc_group = "com.google.api.grpc",
+ proto_deps = [
+ ":iot_java_proto",
+ ":iot_proto",
+ ":iot_resource_name_java_proto",
+ ] + _JAVA_GRPC_DEPS,
+ version = "0.0.0-SNAPSHOT",
+)
+
+##############################################################################
+# Go
+##############################################################################
+load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
+load("@com_google_api_codegen//rules_gapic/go:go_gapic.bzl", "go_gapic_srcjar", "go_gapic_library")
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+load("@com_google_api_codegen//rules_gapic/go:go_gapic_pkg.bzl", "go_gapic_assembly_pkg")
+
+go_proto_library(
+ name = "iot_go_proto",
+ compilers = ["@io_bazel_rules_go//proto:go_grpc"],
+ importpath = "google.golang.org/genproto/googleapis/cloud/iot/v1",
+ protos = [":iot_proto_with_info"],
+ deps = [
+ "//google/api:annotations_go_proto",
+ "//google/iam/v1:iam_go_proto",
+ "//google/rpc:status_go_proto",
+ ],
+)
+
+go_gapic_library(
+ name = "iot_go_gapic",
+ src = ":iot_proto_with_info",
+ gapic_yaml = "cloudiot_gapic.yaml",
+ importpath = "cloud.google.com/go/iot/apiv1",
+ service_yaml = "//google/cloud/iot:cloudiot.yaml",
+ deps = [
+ ":iot_go_proto",
+ "//google/iam/v1:iam_go_proto",
+ ],
+)
+
+go_test(
+ name = "iot_go_gapic_test",
+ srcs = [":iot_go_gapic_srcjar_test"],
+ embed = [":iot_go_gapic"],
+ importpath = "cloud.google.com/go/iot/apiv1",
+)
+
+# Opensource Packages
+go_gapic_assembly_pkg(
+ name = "gapi-cloud-iot-v1-go",
+ deps = [
+ ":iot_go_gapic",
+ ":iot_go_gapic_srcjar-smoke-test.srcjar",
+ ":iot_go_gapic_srcjar-test.srcjar",
+ ":iot_go_proto",
+ ],
+)
diff --git a/google/cloud/iot/v1/cloudiot_gapic.yaml b/google/cloud/iot/v1/cloudiot_gapic.yaml
new file mode 100644
index 000000000..72ed2c09b
--- /dev/null
+++ b/google/cloud/iot/v1/cloudiot_gapic.yaml
@@ -0,0 +1,514 @@
+type: com.google.api.codegen.ConfigProto
+config_schema_version: 1.0.0
+# The settings of generated code in a specific language.
+language_settings:
+ java:
+ package_name: com.google.cloud.iot.v1
+ python:
+ package_name: google.cloud.iot_v1.gapic
+ go:
+ package_name: cloud.google.com/go/iot/apiv1
+ csharp:
+ package_name: Google.Cloud.Iot.V1
+ ruby:
+ package_name: Google::Cloud::Iot::V1
+ php:
+ package_name: Google\Cloud\Iot\V1
+ nodejs:
+ package_name: iot.v1
+ domain_layer_location: google-cloud
+# A list of API interface configurations.
+interfaces:
+ # The fully qualified name of the API interface.
+- name: google.cloud.iot.v1.DeviceManager
+ # A list of resource collection configurations.
+ # Consists of a name_pattern and an entity_name.
+ # The name_pattern is a pattern to describe the names of the resources of this
+ # collection, using the platform's conventions for URI patterns. A generator
+ # may use this to generate methods to compose and decompose such names. The
+ # pattern should use named placeholders as in `shelves/{shelf}/books/{book}`;
+ # those will be taken as hints for the parameter names of the generated
+ # methods. If empty, no name methods are generated.
+ # The entity_name is the name to be used as a basis for generated methods and
+ # classes.
+ collections:
+ - name_pattern: projects/{project}/locations/{location}
+ entity_name: location
+ - name_pattern: projects/{project}/locations/{location}/registries/{registry}
+ entity_name: registry
+ - name_pattern: projects/{project}/locations/{location}/registries/{registry}/devices/{device}
+ entity_name: device
+ # Definition for smoke test.
+ smoke_test:
+ method: ListDeviceRegistries
+ init_fields:
+ - parent%project=$PROJECT_ID
+ - parent%location="us-central1"
+ # Definition for retryable codes.
+ retry_codes_def:
+ - name: idempotent
+ retry_codes:
+ - UNAVAILABLE
+ - DEADLINE_EXCEEDED
+ - name: non_idempotent
+ retry_codes: []
+ - name: rate_limited_aware
+ retry_codes:
+ - UNAVAILABLE
+ - DEADLINE_EXCEEDED
+ - RESOURCE_EXHAUSTED
+ # Definition for retry/backoff parameters.
+ retry_params_def:
+ - name: default
+ initial_retry_delay_millis: 100
+ retry_delay_multiplier: 1.3
+ max_retry_delay_millis: 60000
+ initial_rpc_timeout_millis: 20000
+ rpc_timeout_multiplier: 1
+ max_rpc_timeout_millis: 20000
+ total_timeout_millis: 120000
+ - name: rate_limited_aware
+ initial_retry_delay_millis: 1000
+ retry_delay_multiplier: 1.3
+ max_retry_delay_millis: 60000
+ initial_rpc_timeout_millis: 20000
+ rpc_timeout_multiplier: 1
+ max_rpc_timeout_millis: 20000
+ total_timeout_millis: 120000
+ # A list of method configurations.
+ # Common properties:
+ #
+ # name - The simple name of the method.
+ #
+ # flattening - Specifies the configuration for parameter flattening.
+ # Describes the parameter groups for which a generator should produce method
+ # overloads which allow a client to directly pass request message fields as
+ # method parameters. This information may or may not be used, depending on
+ # the target language.
+ # Consists of groups, which each represent a list of parameters to be
+ # flattened. Each parameter listed must be a field of the request message.
+ #
+ # required_fields - Fields that are always required for a request to be
+ # valid.
+ #
+ # resource_name_treatment - An enum that specifies how to treat the resource
+ # name formats defined in the field_name_patterns and
+ # response_field_name_patterns fields.
+ # UNSET: default value
+ # NONE: the collection configs will not be used by the generated code.
+ # VALIDATE: string fields will be validated by the client against the
+ # specified resource name formats.
+ # STATIC_TYPES: the client will use generated types for resource names.
+ #
+ # page_streaming - Specifies the configuration for paging.
+ # Describes information for generating a method which transforms a paging
+ # list RPC into a stream of resources.
+ # Consists of a request and a response.
+ # The request specifies request information of the list method. It defines
+ # which fields match the paging pattern in the request. The request consists
+ # of a page_size_field and a token_field. The page_size_field is the name of
+ # the optional field specifying the maximum number of elements to be
+ # returned in the response. The token_field is the name of the field in the
+ # request containing the page token.
+ # The response specifies response information of the list method. It defines
+ # which fields match the paging pattern in the response. The response
+ # consists of a token_field and a resources_field. The token_field is the
+ # name of the field in the response containing the next page token. The
+ # resources_field is the name of the field in the response containing the
+ # list of resources belonging to the page.
+ #
+ # retry_codes_name - Specifies the configuration for retryable codes. The
+ # name must be defined in interfaces.retry_codes_def.
+ #
+ # retry_params_name - Specifies the configuration for retry/backoff
+ # parameters. The name must be defined in interfaces.retry_params_def.
+ #
+ # field_name_patterns - Maps the field name of the request type to
+ # entity_name of interfaces.collections.
+ # Specifies the string pattern that the field must follow.
+ #
+ # timeout_millis - Specifies the default timeout for a non-retrying call. If
+ # the call is retrying, refer to retry_params_name instead.
+ methods:
+ - name: CreateDeviceRegistry
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ - device_registry
+ required_fields:
+ - parent
+ - device_registry
+ header_request_params:
+ - parent
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: location
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: GetDeviceRegistry
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: UpdateDeviceRegistry
+ flattening:
+ groups:
+ - parameters:
+ - device_registry
+ - update_mask
+ required_fields:
+ - device_registry
+ - update_mask
+ header_request_params:
+ - device_registry.name
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ device_registry.name: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: DeleteDeviceRegistry
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: ListDeviceRegistries
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ required_fields:
+ - parent
+ header_request_params:
+ - parent
+ page_streaming:
+ request:
+ page_size_field: page_size
+ token_field: page_token
+ response:
+ token_field: next_page_token
+ resources_field: device_registries
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: location
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: CreateDevice
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ - device
+ required_fields:
+ - parent
+ - device
+ header_request_params:
+ - parent
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: GetDevice
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: UpdateDevice
+ flattening:
+ groups:
+ - parameters:
+ - device
+ - update_mask
+ required_fields:
+ - device
+ - update_mask
+ header_request_params:
+ - device.name
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ device.name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: DeleteDevice
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: ListDevices
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ required_fields:
+ - parent
+ header_request_params:
+ - parent
+ page_streaming:
+ request:
+ page_size_field: page_size
+ token_field: page_token
+ response:
+ token_field: next_page_token
+ resources_field: devices
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: ModifyCloudToDeviceConfig
+ flattening:
+ groups:
+ - parameters:
+ - name
+ - binary_data
+ required_fields:
+ - name
+ - binary_data
+ header_request_params:
+ - name
+ retry_codes_name: rate_limited_aware
+ retry_params_name: rate_limited_aware
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: ListDeviceConfigVersions
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: ListDeviceStates
+ flattening:
+ groups:
+ - parameters:
+ - name
+ required_fields:
+ - name
+ header_request_params:
+ - name
+ retry_codes_name: idempotent
+ retry_params_name: default
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: SetIamPolicy
+ flattening:
+ groups:
+ - parameters:
+ - resource
+ - policy
+ required_fields:
+ - resource
+ - policy
+ header_request_params:
+ - resource
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ resource: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: GetIamPolicy
+ flattening:
+ groups:
+ - parameters:
+ - resource
+ required_fields:
+ - resource
+ header_request_params:
+ - resource
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ resource: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: TestIamPermissions
+ flattening:
+ groups:
+ - parameters:
+ - resource
+ - permissions
+ required_fields:
+ - resource
+ - permissions
+ header_request_params:
+ - resource
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ resource: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: SendCommandToDevice
+ flattening:
+ groups:
+ - parameters:
+ - name
+ - binary_data
+ - subfolder
+ required_fields:
+ - name
+ - binary_data
+ header_request_params:
+ - name
+ retry_codes_name: rate_limited_aware
+ retry_params_name: rate_limited_aware
+ field_name_patterns:
+ name: device
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: BindDeviceToGateway
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ - gateway_id
+ - device_id
+ required_fields:
+ - parent
+ - gateway_id
+ - device_id
+ header_request_params:
+ - parent
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+ - name: UnbindDeviceFromGateway
+ flattening:
+ groups:
+ - parameters:
+ - parent
+ - gateway_id
+ - device_id
+ required_fields:
+ - parent
+ - gateway_id
+ - device_id
+ header_request_params:
+ - parent
+ retry_codes_name: non_idempotent
+ retry_params_name: default
+ field_name_patterns:
+ parent: registry
+ resource_name_treatment: STATIC_TYPES
+ timeout_millis: 60000
+resource_name_generation:
+- message_name: google.iam.v1.SetIamPolicyRequest
+ field_entity_map:
+ resource: "*"
+- message_name: google.iam.v1.GetIamPolicyRequest
+ field_entity_map:
+ resource: "*"
+- message_name: google.iam.v1.TestIamPermissionsRequest
+ field_entity_map:
+ resource: "*"
+- message_name: CreateDeviceRegistryRequest
+ field_entity_map:
+ parent: location
+- message_name: GetDeviceRegistryRequest
+ field_entity_map:
+ name: registry
+- message_name: DeleteDeviceRegistryRequest
+ field_entity_map:
+ name: registry
+- message_name: ListDeviceRegistriesRequest
+ field_entity_map:
+ parent: location
+- message_name: CreateDeviceRequest
+ field_entity_map:
+ parent: registry
+- message_name: GetDeviceRequest
+ field_entity_map:
+ name: device
+- message_name: DeleteDeviceRequest
+ field_entity_map:
+ name: device
+- message_name: ListDevicesRequest
+ field_entity_map:
+ parent: registry
+- message_name: ModifyCloudToDeviceConfigRequest
+ field_entity_map:
+ name: device
+- message_name: ListDeviceConfigVersionsRequest
+ field_entity_map:
+ name: device
+- message_name: ListDeviceStatesRequest
+ field_entity_map:
+ name: device
+- message_name: SendCommandToDeviceRequest
+ field_entity_map:
+ name: device
+- message_name: BindDeviceToGatewayRequest
+ field_entity_map:
+ parent: registry
+- message_name: UnbindDeviceFromGatewayRequest
+ field_entity_map:
+ parent: registry
+- message_name: Device
+ field_entity_map:
+ name: device
+- message_name: DeviceRegistry
+ field_entity_map:
+ name: registry
diff --git a/google/cloud/iot/v1/device_manager.proto b/google/cloud/iot/v1/device_manager.proto
new file mode 100644
index 000000000..27ec0f030
--- /dev/null
+++ b/google/cloud/iot/v1/device_manager.proto
@@ -0,0 +1,562 @@
+// Copyright 2018 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.
+//
+
+syntax = "proto3";
+
+package google.cloud.iot.v1;
+
+import "google/api/annotations.proto";
+import "google/cloud/iot/v1/resources.proto";
+import "google/iam/v1/iam_policy.proto";
+import "google/iam/v1/policy.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/field_mask.proto";
+import "google/protobuf/timestamp.proto";
+import "google/rpc/status.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/iot/v1;iot";
+option java_multiple_files = true;
+option java_outer_classname = "DeviceManagerProto";
+option java_package = "com.google.cloud.iot.v1";
+
+// Internet of Things (IoT) service. Securely connect and manage IoT devices.
+service DeviceManager {
+ // Creates a device registry that contains devices.
+ rpc CreateDeviceRegistry(CreateDeviceRegistryRequest)
+ returns (DeviceRegistry) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*/locations/*}/registries"
+ body: "device_registry"
+ };
+ }
+
+ // Gets a device registry configuration.
+ rpc GetDeviceRegistry(GetDeviceRegistryRequest) returns (DeviceRegistry) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/locations/*/registries/*}"
+ };
+ }
+
+ // Updates a device registry configuration.
+ rpc UpdateDeviceRegistry(UpdateDeviceRegistryRequest)
+ returns (DeviceRegistry) {
+ option (google.api.http) = {
+ patch: "/v1/{device_registry.name=projects/*/locations/*/registries/*}"
+ body: "device_registry"
+ };
+ }
+
+ // Deletes a device registry configuration.
+ rpc DeleteDeviceRegistry(DeleteDeviceRegistryRequest)
+ returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{name=projects/*/locations/*/registries/*}"
+ };
+ }
+
+ // Lists device registries.
+ rpc ListDeviceRegistries(ListDeviceRegistriesRequest)
+ returns (ListDeviceRegistriesResponse) {
+ option (google.api.http) = {
+ get: "/v1/{parent=projects/*/locations/*}/registries"
+ };
+ }
+
+ // Creates a device in a device registry.
+ rpc CreateDevice(CreateDeviceRequest) returns (Device) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*/locations/*/registries/*}/devices"
+ body: "device"
+ };
+ }
+
+ // Gets details about a device.
+ rpc GetDevice(GetDeviceRequest) returns (Device) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}"
+ additional_bindings {
+ get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}"
+ }
+ };
+ }
+
+ // Updates a device.
+ rpc UpdateDevice(UpdateDeviceRequest) returns (Device) {
+ option (google.api.http) = {
+ patch: "/v1/{device.name=projects/*/locations/*/registries/*/devices/*}"
+ body: "device"
+ additional_bindings {
+ patch: "/v1/{device.name=projects/*/locations/*/registries/*/groups/*/devices/*}"
+ body: "device"
+ }
+ };
+ }
+
+ // Deletes a device.
+ rpc DeleteDevice(DeleteDeviceRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{name=projects/*/locations/*/registries/*/devices/*}"
+ };
+ }
+
+ // List devices in a device registry.
+ rpc ListDevices(ListDevicesRequest) returns (ListDevicesResponse) {
+ option (google.api.http) = {
+ get: "/v1/{parent=projects/*/locations/*/registries/*}/devices"
+ additional_bindings {
+ get: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}/devices"
+ }
+ };
+ }
+
+ // Modifies the configuration for the device, which is eventually sent from
+ // the Cloud IoT Core servers. Returns the modified configuration version and
+ // its metadata.
+ rpc ModifyCloudToDeviceConfig(ModifyCloudToDeviceConfigRequest)
+ returns (DeviceConfig) {
+ option (google.api.http) = {
+ post: "/v1/{name=projects/*/locations/*/registries/*/devices/*}:modifyCloudToDeviceConfig"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:modifyCloudToDeviceConfig"
+ body: "*"
+ }
+ };
+ }
+
+ // Lists the last few versions of the device configuration in descending
+ // order (i.e.: newest first).
+ rpc ListDeviceConfigVersions(ListDeviceConfigVersionsRequest)
+ returns (ListDeviceConfigVersionsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}/configVersions"
+ additional_bindings {
+ get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/configVersions"
+ }
+ };
+ }
+
+ // Lists the last few versions of the device state in descending order (i.e.:
+ // newest first).
+ rpc ListDeviceStates(ListDeviceStatesRequest)
+ returns (ListDeviceStatesResponse) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/locations/*/registries/*/devices/*}/states"
+ additional_bindings {
+ get: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}/states"
+ }
+ };
+ }
+
+ // Sets the access control policy on the specified resource. Replaces any
+ // existing policy.
+ rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest)
+ returns (google.iam.v1.Policy) {
+ option (google.api.http) = {
+ post: "/v1/{resource=projects/*/locations/*/registries/*}:setIamPolicy"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:setIamPolicy"
+ body: "*"
+ }
+ };
+ }
+
+ // Gets the access control policy for a resource.
+ // Returns an empty policy if the resource exists and does not have a policy
+ // set.
+ rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest)
+ returns (google.iam.v1.Policy) {
+ option (google.api.http) = {
+ post: "/v1/{resource=projects/*/locations/*/registries/*}:getIamPolicy"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:getIamPolicy"
+ body: "*"
+ }
+ };
+ }
+
+ // Returns permissions that a caller has on the specified resource.
+ // If the resource does not exist, this will return an empty set of
+ // permissions, not a NOT_FOUND error.
+ rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest)
+ returns (google.iam.v1.TestIamPermissionsResponse) {
+ option (google.api.http) = {
+ post: "/v1/{resource=projects/*/locations/*/registries/*}:testIamPermissions"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{resource=projects/*/locations/*/registries/*/groups/*}:testIamPermissions"
+ body: "*"
+ }
+ };
+ }
+
+ // Sends a command to the specified device. In order for a device to be able
+ // to receive commands, it must:
+ // 1) be connected to Cloud IoT Core using the MQTT protocol, and
+ // 2) be subscribed to the group of MQTT topics specified by
+ // /devices/{device-id}/commands/#. This subscription will receive commands
+ // at the top-level topic /devices/{device-id}/commands as well as commands
+ // for subfolders, like /devices/{device-id}/commands/subfolder.
+ // Note that subscribing to specific subfolders is not supported.
+ // If the command could not be delivered to the device, this method will
+ // return an error; in particular, if the device is not subscribed, this
+ // method will return FAILED_PRECONDITION. Otherwise, this method will
+ // return OK. If the subscription is QoS 1, at least once delivery will be
+ // guaranteed; for QoS 0, no acknowledgment will be expected from the device.
+ rpc SendCommandToDevice(SendCommandToDeviceRequest)
+ returns (SendCommandToDeviceResponse) {
+ option (google.api.http) = {
+ post: "/v1/{name=projects/*/locations/*/registries/*/devices/*}:sendCommandToDevice"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{name=projects/*/locations/*/registries/*/groups/*/devices/*}:sendCommandToDevice"
+ body: "*"
+ }
+ };
+ }
+
+ // Associates the device with the gateway.
+ rpc BindDeviceToGateway(BindDeviceToGatewayRequest)
+ returns (BindDeviceToGatewayResponse) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*/locations/*/registries/*}:bindDeviceToGateway"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:bindDeviceToGateway"
+ body: "*"
+ }
+ };
+ }
+
+ // Deletes the association between the device and the gateway.
+ rpc UnbindDeviceFromGateway(UnbindDeviceFromGatewayRequest)
+ returns (UnbindDeviceFromGatewayResponse) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*/locations/*/registries/*}:unbindDeviceFromGateway"
+ body: "*"
+ additional_bindings {
+ post: "/v1/{parent=projects/*/locations/*/registries/*/groups/*}:unbindDeviceFromGateway"
+ body: "*"
+ }
+ };
+ }
+}
+
+// Request for `CreateDeviceRegistry`.
+message CreateDeviceRegistryRequest {
+ // The project and cloud region where this device registry must be created.
+ // For example, `projects/example-project/locations/us-central1`.
+ string parent = 1;
+
+ // The device registry. The field `name` must be empty. The server will
+ // generate that field from the device registry `id` provided and the
+ // `parent` field.
+ DeviceRegistry device_registry = 2;
+}
+
+// Request for `GetDeviceRegistry`.
+message GetDeviceRegistryRequest {
+ // The name of the device registry. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string name = 1;
+}
+
+// Request for `DeleteDeviceRegistry`.
+message DeleteDeviceRegistryRequest {
+ // The name of the device registry. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string name = 1;
+}
+
+// Request for `UpdateDeviceRegistry`.
+message UpdateDeviceRegistryRequest {
+ // The new values for the device registry. The `id` field must be empty, and
+ // the `name` field must indicate the path of the resource. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ DeviceRegistry device_registry = 1;
+
+ // Only updates the `device_registry` fields indicated by this mask.
+ // The field mask must not be empty, and it must not contain fields that
+ // are immutable or only set by the server.
+ // Mutable top-level fields: `event_notification_config`, `http_config`,
+ // `mqtt_config`, and `state_notification_config`.
+ google.protobuf.FieldMask update_mask = 2;
+}
+
+// Request for `ListDeviceRegistries`.
+message ListDeviceRegistriesRequest {
+ // The project and cloud region path. For example,
+ // `projects/example-project/locations/us-central1`.
+ string parent = 1;
+
+ // The maximum number of registries to return in the response. If this value
+ // is zero, the service will select a default size. A call may return fewer
+ // objects than requested. A non-empty `next_page_token` in the response
+ // indicates that more data is available.
+ int32 page_size = 2;
+
+ // The value returned by the last `ListDeviceRegistriesResponse`; indicates
+ // that this is a continuation of a prior `ListDeviceRegistries` call and
+ // the system should return the next page of data.
+ string page_token = 3;
+}
+
+// Response for `ListDeviceRegistries`.
+message ListDeviceRegistriesResponse {
+ // The registries that matched the query.
+ repeated DeviceRegistry device_registries = 1;
+
+ // If not empty, indicates that there may be more registries that match the
+ // request; this value should be passed in a new
+ // `ListDeviceRegistriesRequest`.
+ string next_page_token = 2;
+}
+
+// Request for `CreateDevice`.
+message CreateDeviceRequest {
+ // The name of the device registry where this device should be created.
+ // For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string parent = 1;
+
+ // The device registration details. The field `name` must be empty. The server
+ // generates `name` from the device registry `id` and the
+ // `parent` field.
+ Device device = 2;
+}
+
+// Request for `GetDevice`.
+message GetDeviceRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+
+ // The fields of the `Device` resource to be returned in the response. If the
+ // field mask is unset or empty, all fields are returned.
+ google.protobuf.FieldMask field_mask = 2;
+}
+
+// Request for `UpdateDevice`.
+message UpdateDeviceRequest {
+ // The new values for the device. The `id` and `num_id` fields must
+ // be empty, and the field `name` must specify the name path. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0`or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ Device device = 2;
+
+ // Only updates the `device` fields indicated by this mask.
+ // The field mask must not be empty, and it must not contain fields that
+ // are immutable or only set by the server.
+ // Mutable top-level fields: `credentials`, `blocked`, and `metadata`
+ google.protobuf.FieldMask update_mask = 3;
+}
+
+// Request for `DeleteDevice`.
+message DeleteDeviceRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+}
+
+// Request for `ListDevices`.
+message ListDevicesRequest {
+ // The device registry path. Required. For example,
+ // `projects/my-project/locations/us-central1/registries/my-registry`.
+ string parent = 1;
+
+ // A list of device numeric IDs. If empty, this field is ignored. Maximum
+ // IDs: 10,000.
+ repeated uint64 device_num_ids = 2;
+
+ // A list of device string IDs. For example, `['device0', 'device12']`.
+ // If empty, this field is ignored. Maximum IDs: 10,000
+ repeated string device_ids = 3;
+
+ // The fields of the `Device` resource to be returned in the response. The
+ // fields `id` and `num_id` are always returned, along with any
+ // other fields specified.
+ google.protobuf.FieldMask field_mask = 4;
+
+ // Options related to gateways.
+ GatewayListOptions gateway_list_options = 6;
+
+ // The maximum number of devices to return in the response. If this value
+ // is zero, the service will select a default size. A call may return fewer
+ // objects than requested. A non-empty `next_page_token` in the response
+ // indicates that more data is available.
+ int32 page_size = 100;
+
+ // The value returned by the last `ListDevicesResponse`; indicates
+ // that this is a continuation of a prior `ListDevices` call and
+ // the system should return the next page of data.
+ string page_token = 101;
+}
+
+// Options for limiting the list based on gateway type and associations.
+message GatewayListOptions {
+ // If not set, all devices and gateways are returned. If set, the list is
+ // filtered based on gateway type and associations.
+ oneof filter {
+ // If `GATEWAY` is specified, only gateways are returned. If `NON_GATEWAY`
+ // is specified, only non-gateway devices are returned. If
+ // `GATEWAY_TYPE_UNSPECIFIED` is specified, all devices are returned.
+ GatewayType gateway_type = 1;
+
+ // If set, only devices associated with the specified gateway are returned.
+ // The gateway ID can be numeric (`num_id`) or the user-defined string
+ // (`id`). For example, if `123` is specified, only devices bound to the
+ // gateway with `num_id` 123 are returned.
+ string associations_gateway_id = 2;
+
+ // If set, returns only the gateways with which the specified device is
+ // associated. The device ID can be numeric (`num_id`) or the user-defined
+ // string (`id`). For example, if `456` is specified, returns only the
+ // gateways to which the device with `num_id` 456 is bound.
+ string associations_device_id = 3;
+ }
+}
+
+// Response for `ListDevices`.
+message ListDevicesResponse {
+ // The devices that match the request.
+ repeated Device devices = 1;
+
+ // If not empty, indicates that there may be more devices that match the
+ // request; this value should be passed in a new `ListDevicesRequest`.
+ string next_page_token = 2;
+}
+
+// Request for `ModifyCloudToDeviceConfig`.
+message ModifyCloudToDeviceConfigRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+
+ // The version number to update. If this value is zero, it will not check the
+ // version number of the server and will always update the current version;
+ // otherwise, this update will fail if the version number found on the server
+ // does not match this version number. This is used to support multiple
+ // simultaneous updates without losing data.
+ int64 version_to_update = 2;
+
+ // The configuration data for the device.
+ bytes binary_data = 3;
+}
+
+// Request for `ListDeviceConfigVersions`.
+message ListDeviceConfigVersionsRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+
+ // The number of versions to list. Versions are listed in decreasing order of
+ // the version number. The maximum number of versions retained is 10. If this
+ // value is zero, it will return all the versions available.
+ int32 num_versions = 2;
+}
+
+// Response for `ListDeviceConfigVersions`.
+message ListDeviceConfigVersionsResponse {
+ // The device configuration for the last few versions. Versions are listed
+ // in decreasing order, starting from the most recent one.
+ repeated DeviceConfig device_configs = 1;
+}
+
+// Request for `ListDeviceStates`.
+message ListDeviceStatesRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+
+ // The number of states to list. States are listed in descending order of
+ // update time. The maximum number of states retained is 10. If this
+ // value is zero, it will return all the states available.
+ int32 num_states = 2;
+}
+
+// Response for `ListDeviceStates`.
+message ListDeviceStatesResponse {
+ // The last few device states. States are listed in descending order of server
+ // update time, starting from the most recent one.
+ repeated DeviceState device_states = 1;
+}
+
+// Request for `SendCommandToDevice`.
+message SendCommandToDeviceRequest {
+ // The name of the device. For example,
+ // `projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+ // `projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`.
+ string name = 1;
+
+ // The command data to send to the device.
+ bytes binary_data = 2;
+
+ // Optional subfolder for the command. If empty, the command will be delivered
+ // to the /devices/{device-id}/commands topic, otherwise it will be delivered
+ // to the /devices/{device-id}/commands/{subfolder} topic. Multi-level
+ // subfolders are allowed. This field must not have more than 256 characters,
+ // and must not contain any MQTT wildcards ("+" or "#") or null characters.
+ string subfolder = 3;
+}
+
+// Response for `SendCommandToDevice`.
+message SendCommandToDeviceResponse {}
+
+// Request for `BindDeviceToGateway`.
+message BindDeviceToGatewayRequest {
+ // The name of the registry. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string parent = 1;
+
+ // The value of `gateway_id` can be either the device numeric ID or the
+ // user-defined device identifier.
+ string gateway_id = 2;
+
+ // The device to associate with the specified gateway. The value of
+ // `device_id` can be either the device numeric ID or the user-defined device
+ // identifier.
+ string device_id = 3;
+}
+
+// Response for `BindDeviceToGateway`.
+message BindDeviceToGatewayResponse {}
+
+// Request for `UnbindDeviceFromGateway`.
+message UnbindDeviceFromGatewayRequest {
+ // The name of the registry. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string parent = 1;
+
+ // The value of `gateway_id` can be either the device numeric ID or the
+ // user-defined device identifier.
+ string gateway_id = 2;
+
+ // The device to disassociate from the specified gateway. The value of
+ // `device_id` can be either the device numeric ID or the user-defined device
+ // identifier.
+ string device_id = 3;
+}
+
+// Response for `UnbindDeviceFromGateway`.
+message UnbindDeviceFromGatewayResponse {}
diff --git a/google/cloud/iot/v1/resources.proto b/google/cloud/iot/v1/resources.proto
new file mode 100644
index 000000000..2a91e989e
--- /dev/null
+++ b/google/cloud/iot/v1/resources.proto
@@ -0,0 +1,474 @@
+// Copyright 2018 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.
+//
+
+syntax = "proto3";
+
+package google.cloud.iot.v1;
+
+import "google/api/annotations.proto";
+import "google/protobuf/timestamp.proto";
+import "google/rpc/status.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/cloud/iot/v1;iot";
+option java_multiple_files = true;
+option java_outer_classname = "ResourcesProto";
+option java_package = "com.google.cloud.iot.v1";
+
+// The device resource.
+message Device {
+ // The user-defined device identifier. The device ID must be unique
+ // within a device registry.
+ string id = 1;
+
+ // The resource path name. For example,
+ // `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+ // `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+ // When `name` is populated as a response from the service, it always ends
+ // in the device numeric ID.
+ string name = 2;
+
+ // [Output only] A server-defined unique numeric ID for the device. This is a
+ // more compact way to identify devices, and it is globally unique.
+ uint64 num_id = 3;
+
+ // The credentials used to authenticate this device. To allow credential
+ // rotation without interruption, multiple device credentials can be bound to
+ // this device. No more than 3 credentials can be bound to a single device at
+ // a time. When new credentials are added to a device, they are verified
+ // against the registry credentials. For details, see the description of the
+ // `DeviceRegistry.credentials` field.
+ repeated DeviceCredential credentials = 12;
+
+ // [Output only] The last time an MQTT `PINGREQ` was received. This field
+ // applies only to devices connecting through MQTT. MQTT clients usually only
+ // send `PINGREQ` messages if the connection is idle, and no other messages
+ // have been sent. Timestamps are periodically collected and written to
+ // storage; they may be stale by a few minutes.
+ google.protobuf.Timestamp last_heartbeat_time = 7;
+
+ // [Output only] The last time a telemetry event was received. Timestamps are
+ // periodically collected and written to storage; they may be stale by a few
+ // minutes.
+ google.protobuf.Timestamp last_event_time = 8;
+
+ // [Output only] The last time a state event was received. Timestamps are
+ // periodically collected and written to storage; they may be stale by a few
+ // minutes.
+ google.protobuf.Timestamp last_state_time = 20;
+
+ // [Output only] The last time a cloud-to-device config version acknowledgment
+ // was received from the device. This field is only for configurations
+ // sent through MQTT.
+ google.protobuf.Timestamp last_config_ack_time = 14;
+
+ // [Output only] The last time a cloud-to-device config version was sent to
+ // the device.
+ google.protobuf.Timestamp last_config_send_time = 18;
+
+ // If a device is blocked, connections or requests from this device will fail.
+ // Can be used to temporarily prevent the device from connecting if, for
+ // example, the sensor is generating bad data and needs maintenance.
+ bool blocked = 19;
+
+ // [Output only] The time the most recent error occurred, such as a failure to
+ // publish to Cloud Pub/Sub. This field is the timestamp of
+ // 'last_error_status'.
+ google.protobuf.Timestamp last_error_time = 10;
+
+ // [Output only] The error message of the most recent error, such as a failure
+ // to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+ // field. If no errors have occurred, this field has an empty message
+ // and the status code 0 == OK. Otherwise, this field is expected to have a
+ // status code other than OK.
+ google.rpc.Status last_error_status = 11;
+
+ // The most recent device configuration, which is eventually sent from
+ // Cloud IoT Core to the device. If not present on creation, the
+ // configuration will be initialized with an empty payload and version value
+ // of `1`. To update this field after creation, use the
+ // `DeviceManager.ModifyCloudToDeviceConfig` method.
+ DeviceConfig config = 13;
+
+ // [Output only] The state most recently received from the device. If no state
+ // has been reported, this field is not present.
+ DeviceState state = 16;
+
+ // **Beta Feature**
+ //
+ // The logging verbosity for device activity. If unspecified,
+ // DeviceRegistry.log_level will be used.
+ LogLevel log_level = 21;
+
+ // The metadata key-value pairs assigned to the device. This metadata is not
+ // interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+ // information for the device.
+ //
+ // Keys must conform to the regular expression [a-zA-Z][a-zA-Z0-9-_.+~%]+ and
+ // be less than 128 bytes in length.
+ //
+ // Values are free-form strings. Each value must be less than or equal to 32
+ // KB in size.
+ //
+ // The total size of all keys and values must be less than 256 KB, and the
+ // maximum number of key-value pairs is 500.
+ map<string, string> metadata = 17;
+
+ // Gateway-related configuration and state.
+ GatewayConfig gateway_config = 24;
+}
+
+// Gateway-related configuration and state.
+message GatewayConfig {
+ // Indicates whether the device is a gateway.
+ GatewayType gateway_type = 1;
+
+ // Indicates how to authorize and/or authenticate devices to access the
+ // gateway.
+ GatewayAuthMethod gateway_auth_method = 2;
+
+ // [Output only] The ID of the gateway the device accessed most recently.
+ string last_accessed_gateway_id = 3;
+
+ // [Output only] The most recent time at which the device accessed the gateway
+ // specified in `last_accessed_gateway`.
+ google.protobuf.Timestamp last_accessed_gateway_time = 4;
+}
+
+// A container for a group of devices.
+message DeviceRegistry {
+ // The identifier of this device registry. For example, `myRegistry`.
+ string id = 1;
+
+ // The resource path name. For example,
+ // `projects/example-project/locations/us-central1/registries/my-registry`.
+ string name = 2;
+
+ // The configuration for notification of telemetry events received from the
+ // device. All telemetry events that were successfully published by the
+ // device and acknowledged by Cloud IoT Core are guaranteed to be
+ // delivered to Cloud Pub/Sub. If multiple configurations match a message,
+ // only the first matching configuration is used. If you try to publish a
+ // device telemetry event using MQTT without specifying a Cloud Pub/Sub topic
+ // for the device's registry, the connection closes automatically. If you try
+ // to do so using an HTTP connection, an error is returned. Up to 10
+ // configurations may be provided.
+ repeated EventNotificationConfig event_notification_configs = 10;
+
+ // The configuration for notification of new states received from the device.
+ // State updates are guaranteed to be stored in the state history, but
+ // notifications to Cloud Pub/Sub are not guaranteed. For example, if
+ // permissions are misconfigured or the specified topic doesn't exist, no
+ // notification will be published but the state will still be stored in Cloud
+ // IoT Core.
+ StateNotificationConfig state_notification_config = 7;
+
+ // The MQTT configuration for this device registry.
+ MqttConfig mqtt_config = 4;
+
+ // The DeviceService (HTTP) configuration for this device registry.
+ HttpConfig http_config = 9;
+
+ // **Beta Feature**
+ //
+ // The default logging verbosity for activity from devices in this registry.
+ // The verbosity level can be overridden by Device.log_level.
+ LogLevel log_level = 11;
+
+ // The credentials used to verify the device credentials. No more than 10
+ // credentials can be bound to a single registry at a time. The verification
+ // process occurs at the time of device creation or update. If this field is
+ // empty, no verification is performed. Otherwise, the credentials of a newly
+ // created device or added credentials of an updated device should be signed
+ // with one of these registry credentials.
+ //
+ // Note, however, that existing devices will never be affected by
+ // modifications to this list of credentials: after a device has been
+ // successfully created in a registry, it should be able to connect even if
+ // its registry credentials are revoked, deleted, or modified.
+ repeated RegistryCredential credentials = 8;
+}
+
+// The configuration of MQTT for a device registry.
+message MqttConfig {
+ // If enabled, allows connections using the MQTT protocol. Otherwise, MQTT
+ // connections to this registry will fail.
+ MqttState mqtt_enabled_state = 1;
+}
+
+// The configuration of the HTTP bridge for a device registry.
+message HttpConfig {
+ // If enabled, allows devices to use DeviceService via the HTTP protocol.
+ // Otherwise, any requests to DeviceService will fail for this registry.
+ HttpState http_enabled_state = 1;
+}
+
+// The configuration for forwarding telemetry events.
+message EventNotificationConfig {
+ // If the subfolder name matches this string exactly, this configuration will
+ // be used. The string must not include the leading '/' character. If empty,
+ // all strings are matched. This field is used only for telemetry events;
+ // subfolders are not supported for state changes.
+ string subfolder_matches = 2;
+
+ // A Cloud Pub/Sub topic name. For example,
+ // `projects/myProject/topics/deviceEvents`.
+ string pubsub_topic_name = 1;
+}
+
+// The configuration for notification of new states received from the device.
+message StateNotificationConfig {
+ // A Cloud Pub/Sub topic name. For example,
+ // `projects/myProject/topics/deviceEvents`.
+ string pubsub_topic_name = 1;
+}
+
+// A server-stored registry credential used to validate device credentials.
+message RegistryCredential {
+ // The credential data. Reserved for expansion in the future.
+ oneof credential {
+ // A public key certificate used to verify the device credentials.
+ PublicKeyCertificate public_key_certificate = 1;
+ }
+}
+
+// Details of an X.509 certificate. For informational purposes only.
+message X509CertificateDetails {
+ // The entity that signed the certificate.
+ string issuer = 1;
+
+ // The entity the certificate and public key belong to.
+ string subject = 2;
+
+ // The time the certificate becomes valid.
+ google.protobuf.Timestamp start_time = 3;
+
+ // The time the certificate becomes invalid.
+ google.protobuf.Timestamp expiry_time = 4;
+
+ // The algorithm used to sign the certificate.
+ string signature_algorithm = 5;
+
+ // The type of public key in the certificate.
+ string public_key_type = 6;
+}
+
+// A public key certificate format and data.
+message PublicKeyCertificate {
+ // The certificate format.
+ PublicKeyCertificateFormat format = 1;
+
+ // The certificate data.
+ string certificate = 2;
+
+ // [Output only] The certificate details. Used only for X.509 certificates.
+ X509CertificateDetails x509_details = 3;
+}
+
+// A server-stored device credential used for authentication.
+message DeviceCredential {
+ // The credential data. Reserved for expansion in the future.
+ oneof credential {
+ // A public key used to verify the signature of JSON Web Tokens (JWTs).
+ // When adding a new device credential, either via device creation or via
+ // modifications, this public key credential may be required to be signed by
+ // one of the registry level certificates. More specifically, if the
+ // registry contains at least one certificate, any new device credential
+ // must be signed by one of the registry certificates. As a result,
+ // when the registry contains certificates, only X.509 certificates are
+ // accepted as device credentials. However, if the registry does
+ // not contain a certificate, self-signed certificates and public keys will
+ // be accepted. New device credentials must be different from every
+ // registry-level certificate.
+ PublicKeyCredential public_key = 2;
+ }
+
+ // [Optional] The time at which this credential becomes invalid. This
+ // credential will be ignored for new client authentication requests after
+ // this timestamp; however, it will not be automatically deleted.
+ google.protobuf.Timestamp expiration_time = 6;
+}
+
+// A public key format and data.
+message PublicKeyCredential {
+ // The format of the key.
+ PublicKeyFormat format = 1;
+
+ // The key data.
+ string key = 2;
+}
+
+// The device configuration. Eventually delivered to devices.
+message DeviceConfig {
+ // [Output only] The version of this update. The version number is assigned by
+ // the server, and is always greater than 0 after device creation. The
+ // version must be 0 on the `CreateDevice` request if a `config` is
+ // specified; the response of `CreateDevice` will always have a value of 1.
+ int64 version = 1;
+
+ // [Output only] The time at which this configuration version was updated in
+ // Cloud IoT Core. This timestamp is set by the server.
+ google.protobuf.Timestamp cloud_update_time = 2;
+
+ // [Output only] The time at which Cloud IoT Core received the
+ // acknowledgment from the device, indicating that the device has received
+ // this configuration version. If this field is not present, the device has
+ // not yet acknowledged that it received this version. Note that when
+ // the config was sent to the device, many config versions may have been
+ // available in Cloud IoT Core while the device was disconnected, and on
+ // connection, only the latest version is sent to the device. Some
+ // versions may never be sent to the device, and therefore are never
+ // acknowledged. This timestamp is set by Cloud IoT Core.
+ google.protobuf.Timestamp device_ack_time = 3;
+
+ // The device configuration data.
+ bytes binary_data = 4;
+}
+
+// The device state, as reported by the device.
+message DeviceState {
+ // [Output only] The time at which this state version was updated in Cloud
+ // IoT Core.
+ google.protobuf.Timestamp update_time = 1;
+
+ // The device state data.
+ bytes binary_data = 2;
+}
+
+// Indicates whether an MQTT connection is enabled or disabled. See the field
+// description for details.
+enum MqttState {
+ // No MQTT state specified. If not specified, MQTT will be enabled by default.
+ MQTT_STATE_UNSPECIFIED = 0;
+
+ // Enables a MQTT connection.
+ MQTT_ENABLED = 1;
+
+ // Disables a MQTT connection.
+ MQTT_DISABLED = 2;
+}
+
+// Indicates whether DeviceService (HTTP) is enabled or disabled for the
+// registry. See the field description for details.
+enum HttpState {
+ // No HTTP state specified. If not specified, DeviceService will be
+ // enabled by default.
+ HTTP_STATE_UNSPECIFIED = 0;
+
+ // Enables DeviceService (HTTP) service for the registry.
+ HTTP_ENABLED = 1;
+
+ // Disables DeviceService (HTTP) service for the registry.
+ HTTP_DISABLED = 2;
+}
+
+// **Beta Feature**
+//
+// The logging verbosity for device activity. Specifies which events should be
+// written to logs. For example, if the LogLevel is ERROR, only events that
+// terminate in errors will be logged. LogLevel is inclusive; enabling INFO
+// logging will also enable ERROR logging.
+enum LogLevel {
+ // No logging specified. If not specified, logging will be disabled.
+ LOG_LEVEL_UNSPECIFIED = 0;
+
+ // Disables logging.
+ NONE = 10;
+
+ // Error events will be logged.
+ ERROR = 20;
+
+ // Informational events will be logged, such as connections and
+ // disconnections.
+ INFO = 30;
+
+ // All events will be logged.
+ DEBUG = 40;
+}
+
+// Gateway type.
+enum GatewayType {
+ // If unspecified, the device is considered a non-gateway device.
+ GATEWAY_TYPE_UNSPECIFIED = 0;
+
+ // The device is a gateway.
+ GATEWAY = 1;
+
+ // The device is not a gateway.
+ NON_GATEWAY = 2;
+}
+
+// The gateway authorization/authentication method. This setting determines how
+// Cloud IoT Core authorizes/authenticate devices to access the gateway.
+enum GatewayAuthMethod {
+ // No authentication/authorization method specified. No devices are allowed to
+ // access the gateway.
+ GATEWAY_AUTH_METHOD_UNSPECIFIED = 0;
+
+ // The device is authenticated through the gateway association only. Device
+ // credentials are ignored even if provided.
+ ASSOCIATION_ONLY = 1;
+
+ // The device is authenticated through its own credentials. Gateway
+ // association is not checked.
+ DEVICE_AUTH_TOKEN_ONLY = 2;
+
+ // The device is authenticated through both device credentials and gateway
+ // association. The device must be bound to the gateway and must provide its
+ // own credentials.
+ ASSOCIATION_AND_DEVICE_AUTH_TOKEN = 3;
+}
+
+// The supported formats for the public key.
+enum PublicKeyCertificateFormat {
+ // The format has not been specified. This is an invalid default value and
+ // must not be used.
+ UNSPECIFIED_PUBLIC_KEY_CERTIFICATE_FORMAT = 0;
+
+ // An X.509v3 certificate ([RFC5280](https://www.ietf.org/rfc/rfc5280.txt)),
+ // encoded in base64, and wrapped by `-----BEGIN CERTIFICATE-----` and
+ // `-----END CERTIFICATE-----`.
+ X509_CERTIFICATE_PEM = 1;
+}
+
+// The supported formats for the public key.
+enum PublicKeyFormat {
+ // The format has not been specified. This is an invalid default value and
+ // must not be used.
+ UNSPECIFIED_PUBLIC_KEY_FORMAT = 0;
+
+ // An RSA public key encoded in base64, and wrapped by
+ // `-----BEGIN PUBLIC KEY-----` and `-----END PUBLIC KEY-----`. This can be
+ // used to verify `RS256` signatures in JWT tokens ([RFC7518](
+ // https://www.ietf.org/rfc/rfc7518.txt)).
+ RSA_PEM = 3;
+
+ // As RSA_PEM, but wrapped in an X.509v3 certificate ([RFC5280](
+ // https://www.ietf.org/rfc/rfc5280.txt)), encoded in base64, and wrapped by
+ // `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`.
+ RSA_X509_PEM = 1;
+
+ // Public key for the ECDSA algorithm using P-256 and SHA-256, encoded in
+ // base64, and wrapped by `-----BEGIN PUBLIC KEY-----` and `-----END
+ // PUBLIC KEY-----`. This can be used to verify JWT tokens with the `ES256`
+ // algorithm ([RFC7518](https://www.ietf.org/rfc/rfc7518.txt)). This curve is
+ // defined in [OpenSSL](https://www.openssl.org/) as the `prime256v1` curve.
+ ES256_PEM = 2;
+
+ // As ES256_PEM, but wrapped in an X.509v3 certificate ([RFC5280](
+ // https://www.ietf.org/rfc/rfc5280.txt)), encoded in base64, and wrapped by
+ // `-----BEGIN CERTIFICATE-----` and `-----END CERTIFICATE-----`.
+ ES256_X509_PEM = 4;
+}