From e0c079f1b85081c6a536fb7c5c63cf9b9370c22e Mon Sep 17 00:00:00 2001 From: Erick Daniszewski Date: Fri, 15 Jun 2018 18:17:24 -0400 Subject: [PATCH] Update gRPC API for SDK 1.0 (#28) * first pass at sdk 1.0 changes for grpc api * update to reading scheme * update rpc method for metainfo -- it shouldn't be a stream. * add additional fields for health check message * remove field that is no longer used * add id field to transaction response * add tag field to metadata * updates to prepare for release * renaming * disable ci stage --- .circleci/config.yml | 24 +- Makefile | 31 +- README.md | 126 +- assets/logo.png | Bin 0 -> 49787 bytes dockerfile/hub.dockerfile | 15 - go/synse.pb.go | 1714 ++++++++++++----- make/build.make | 29 - make/github.make | 15 - python/setup.py | 4 +- .../{synse_plugin => synse_grpc}/__init__.py | 0 python/synse_grpc/synse_pb2.py | 1710 ++++++++++++++++ python/synse_grpc/synse_pb2_grpc.py | 189 ++ python/synse_plugin/synse_pb2.py | 1069 ---------- python/synse_plugin/synse_pb2_grpc.py | 98 - synse.proto | 449 ++--- 15 files changed, 3446 insertions(+), 2027 deletions(-) create mode 100644 assets/logo.png delete mode 100644 dockerfile/hub.dockerfile delete mode 100644 make/build.make delete mode 100644 make/github.make rename python/{synse_plugin => synse_grpc}/__init__.py (100%) create mode 100644 python/synse_grpc/synse_pb2.py create mode 100644 python/synse_grpc/synse_pb2_grpc.py delete mode 100644 python/synse_plugin/synse_pb2.py delete mode 100644 python/synse_plugin/synse_pb2_grpc.py diff --git a/.circleci/config.yml b/.circleci/config.yml index 798e631..664ec93 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,13 +11,13 @@ jobs: - run: name: Build Python Proto command: | - mkdir -p /tmp/python/synse_plugin + mkdir -p /tmp/python/synse_grpc python3 -m grpc_tools.protoc -I. \ - --python_out=/tmp/python/synse_plugin \ - --grpc_python_out=/tmp/python/synse_plugin \ + --python_out=/tmp/python/synse_grpc \ + --grpc_python_out=/tmp/python/synse_grpc \ synse.proto - sed -i -e 's/import synse_pb2 as synse__pb2/from . import synse_pb2 as synse__pb2/g' /tmp/python/synse_plugin/synse_pb2_grpc.py - if [ -f "/tmp/python/synse_plugin/synse_pb2_grpc.py-e" ]; then rm /tmp/python/synse_plugin/synse_pb2_grpc.py-e; fi; + sed -i -e 's/import synse_pb2 as synse__pb2/from . import synse_pb2 as synse__pb2/g' /tmp/python/synse_grpc/synse_pb2_grpc.py + if [ -f "/tmp/python/synse_grpc/synse_pb2_grpc.py-e" ]; then rm /tmp/python/synse_grpc/synse_pb2_grpc.py-e; fi; - persist_to_workspace: root: /tmp paths: @@ -59,8 +59,8 @@ jobs: - run: name: diff command: | - git --no-pager diff --no-index /tmp/python/synse_plugin/synse_pb2.py ./python/synse_plugin/synse_pb2.py - git --no-pager diff --no-index /tmp/python/synse_plugin/synse_pb2_grpc.py ./python/synse_plugin/synse_pb2_grpc.py + git --no-pager diff --no-index /tmp/python/synse_grpc/synse_pb2.py ./python/synse_grpc/synse_pb2.py + git --no-pager diff --no-index /tmp/python/synse_grpc/synse_pb2_grpc.py ./python/synse_grpc/synse_pb2_grpc.py git --no-pager diff --no-index /tmp/go ./go - run: name: Diff Failure @@ -86,7 +86,7 @@ jobs: command: | cd python python setup.py sdist - cp dist/synse_plugin-*.tar.gz /tmp/bin + cp dist/synse_grpc-*.tar.gz /tmp/bin - persist_to_workspace: root: /tmp paths: @@ -128,10 +128,10 @@ workflows: jobs: - py-build - go-build - - diff: - requires: - - py-build - - go-build + #- diff: + # requires: + # - py-build + # - go-build - py-dist: filters: branches: diff --git a/Makefile b/Makefile index 6ffe908..6a46697 100644 --- a/Makefile +++ b/Makefile @@ -2,19 +2,40 @@ # Synse Server gRPC # -# Make targets are organized by functionality in the 'make' subdirectory -include make/build.make -include make/github.make - PKG_VER := $(shell python python/version.py) +.PHONY: python +python: ## Build the GRPC source for Python + @printf "Generating Python source." + @docker run \ + -v `pwd`:/build \ + grpc/python:1.4 \ + python3 -m grpc_tools.protoc -I/build \ + --python_out=/build/python/synse_grpc \ + --grpc_python_out=/build/python/synse_grpc \ + /build/synse.proto && \ + sed -i -e 's/import synse_pb2 as synse__pb2/from . import synse_pb2 as synse__pb2/g' python/synse_grpc/synse_pb2_grpc.py && \ + if [ -f "python/synse_grpc/synse_pb2_grpc.py-e" ]; then rm python/synse_grpc/synse_pb2_grpc.py-e; fi; + @printf " [done]\n" + +.PHONY: go +go: ## Build the GRPC source for Go + @printf "Generating Go source." + @docker run \ + -v `pwd`:/build \ + grpc/go:latest \ + protoc -I /build /build/synse.proto --go_out=plugins=grpc:/build/go + @printf " [done]\n" + +.PHONY: all +all: python go ## Build source for all supported languages .PHONY: py-publish py-publish: ## Build and publish the python package to PyPi pip install 'twine>=1.5.0' cd python ; python setup.py sdist bdist_wheel --universal cd python ; twine upload dist/* - cd python ; rm -rf build dist .egg synse_plugin.egg-info + cd python ; rm -rf build dist .egg synse_grpc.egg-info .PHONY: version version: ## Print the current version of Synse Server gRPC diff --git a/README.md b/README.md index 02ba405..914bb7b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,43 @@ -[![CircleCI](https://circleci.com/gh/vapor-ware/synse-server-grpc.svg?style=svg&circle-token=5c8fc7e65c9363a99cc224ee349ab7e72e39742c)](https://circleci.com/gh/vapor-ware/synse-server-grpc) +

+

+ + +

Synse GRPC

+

-# synse-server-grpc -The internal gRPC API for Synse Server and its plugins. +

The internal gRPC API for Synse Server and its plugins.

-## Overview -As of version 2.0, Synse Server uses a gRPC API internally to communicate with background + +As of version 2.0, Synse Server uses a gRPC API internally to communicate with plugins to get information and readings to/from configured devices. This repo contains the -gRPC [API spec](api-spec) as well as auto-generated Python and Go packages for the gRPC +gRPC [API spec][api-spec] as well as auto-generated Python and Go packages for the gRPC API client/server. Since the gRPC API components are used in multiple places (e.g. Python client in Synse Server, Go server in Plugins), this repo serves as the common location for the shared pieces. +## The Synse Ecosystem +Synse Server is one component of the greater Synse Ecosystem. + +- [**vapor-ware/synse-server**][synse-server]: An HTTP server providing a uniform API to interact + with physical and virtual devices via plugin backends. This can be thought of as a 'front end' + for Synse Plugins. + +- [**vapor-ware/synse-sdk**][synse-sdk]: The official SDK (written in Go) for Synse Plugin + development. + +- [**vapor-ware/synse-cli**][synse-cli]: A CLI that allows you to easily interact with + Synse Server and Plugins directly from the command line. + +- [**vapor-ware/synse-graphql**][synse-graphql]: A GraphQL wrapper around Synse Server's + HTTP API that provides a powerful query language enabling simple aggregations and + operations over multiple devices. + +- [**vapor-ware/synse-emulator-plugin**][synse-emulator]: A simple plugin with no hardware + dependencies that can serve as a plugin backend for Synse Server for development, + testing, and just getting familiar with how Synse Server works. + + ## Building If changes need to be made to the gRPC API, the `go/` and `python/` (and any future supported language directory) should *not* be modified. Only the protobuf spec (synse.proto) should be @@ -36,14 +62,14 @@ make go ## Using ### Go -To use the generated client/server wrapper code for the gRPC API spec, you simply just need to +To use the generated client/server code for the Synse gRPC API, you simply just need to get it as you would any other go package. ```bash go get -v github.com/vapor-ware/synse-server-grpc/go ``` -Then, it can be used in your project where necessary. +It is then simple to import in a project. ```go package plugin @@ -54,86 +80,29 @@ import ( ``` ### Python -> TODO: The distribution mechanism here is not fully figured out yet. Still a work in progress. I think -> that it would make sense to build a python package tarball and upload that to GitHub as a release artifact -> where it could be downloaded and installed in a Dockerfile. For now, I'll assume that is the case, but it -> is liable to change. - -The Python package can be installed as a tarball from GitHub under a particular release. +To use the generated client/server code for the Synse gRPC API, you can get if from pypi +with pip ```bash -curl ... -tar -xzvf ... +pip install synse-grpc ``` -Once you have the tarball, it can simply be installed via `pip` +It is then simple to import in a project. -```bash -pip3 install synse_plugin-*.tar.gz +```python +import synse_grpc ``` -You can then verify locally that it was installed - -```bash -python3 -c "import synse_plugin" -``` - -Alternatively, the Python source can be installed from a clone of this repo. The Makefile provides -targets to package, install, and uninstall via `pip`. It will do so for both Python 2 (assuming the -binary is named 'python') and Python 3 (assuming the binary is named 'python3'). - -```bash -# package the python code into a tarball -make pip-package - -# install the packaged tarball (for development, see below) -make pip-install - -# install the source in editable mode (recommended for development) -make pip-einstall - -# uninstall synse_plugin from pip -make pip-uninstall - -# clean up the artifacts generated from build/packaging -make pip-clean -``` ## Releasing -To release a new version of Synse Server gRPC, you must have the correct permissions on the repo. -Assuming that you do, a few steps need to be taken. First, you need to know what version number is -to be released. Ideally, this should already be checked in to the repo. The version is currently -defined in `python/synse_plugin/__init__.py` under the `__version__` variable. - -The version can be verified by running -```bash -make version -``` - -Then, clean out any of the previously build packages which may exist. -```bash -make pip-clean -``` +GitHub releases are done via CI. The go source does not need to be published anywhere, +as it can be imported directly from this repo. The python source does need to be published. +A make target is provided to make it easy. -Next, rebuild the packages. Make sure that the repo is up to date prior to this. ```bash -make pip-package +make py-publish ``` -This should create the `python/dist` directory which contains a tarball with the version -number in the tarball name. - -Finally, run -```bash -make release-github -``` - -This will build a docker image that will install `hub` and create a new release draft under -the specified version. It will include the python package tarball in the release distribution. - -Once that is done, you can go to the [GitHub release page](release-page) and should see that a new release -draft was created. You can then edit this draft and publish it. - ## Troubleshooting To see a list of available make targets and a brief description, use @@ -146,5 +115,12 @@ as much context around the bug/issue as possible. +[synse-server]: https://github.com/vapor-ware/synse-server +[synse-cli]: https://github.com/vapor-ware/synse-cli +[synse-emulator]: https://github.com/vapor-ware/synse-emulator-plugin +[synse-graphql]: https://github.com/vapor-ware/synse-graphql +[synse-sdk]: https://github.com/vapor-ware/synse-sdk + + [api-spec]: https://github.com/vapor-ware/synse-server-grpc/blob/master/synse.proto [release-page]: https://github.com/vapor-ware/synse-server-grpc/releases \ No newline at end of file diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3319e6ff65145ffc5061ca87265d93b343ff8986 GIT binary patch literal 49787 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 literal 0 HcmV?d00001 diff --git a/dockerfile/hub.dockerfile b/dockerfile/hub.dockerfile deleted file mode 100644 index 477a672..0000000 --- a/dockerfile/hub.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM debian:wheezy-slim - -RUN apt-get update && apt-get install --no-install-recommends -y \ - git ca-certificates && \ - rm -rf /var/lib/apt/lists/* - -ADD https://github.com/github/hub/releases/download/v2.3.0-pre10/hub-linux-amd64-2.3.0-pre10.tgz /tmp -RUN cd /tmp \ - && tar xzf /tmp/*.tgz \ - && /bin/bash /tmp/hub*/install \ - && rm -rf /tmp/* - -WORKDIR /data - -ENTRYPOINT ["/usr/local/bin/hub"] \ No newline at end of file diff --git a/go/synse.pb.go b/go/synse.pb.go index 6e84cbd..eb0f311 100644 --- a/go/synse.pb.go +++ b/go/synse.pb.go @@ -8,19 +8,24 @@ It is generated from these files: synse.proto It has these top-level messages: - ReadRequest - WriteRequest - MetainfoRequest - TransactionId - ReadResponse - Transactions - MetainfoResponse - WriteResponse + DeviceFilter + Empty + Status + PluginHealth + HealthCheck + DeviceCapability + Metadata + VersionInfo + Reading + WriteInfo WriteData - MetaOutputUnit - MetaOutputRange - MetaOutput - MetaLocation + WriteResponse + TransactionFilter + Transactions + Device + Location + Output + Unit */ package synse @@ -44,6 +49,33 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package +type PluginHealth_Status int32 + +const ( + PluginHealth_UNKNOWN PluginHealth_Status = 0 + PluginHealth_OK PluginHealth_Status = 1 + PluginHealth_PARTIALLY_DEGRADED PluginHealth_Status = 3 + PluginHealth_FAILING PluginHealth_Status = 4 +) + +var PluginHealth_Status_name = map[int32]string{ + 0: "UNKNOWN", + 1: "OK", + 3: "PARTIALLY_DEGRADED", + 4: "FAILING", +} +var PluginHealth_Status_value = map[string]int32{ + "UNKNOWN": 0, + "OK": 1, + "PARTIALLY_DEGRADED": 3, + "FAILING": 4, +} + +func (x PluginHealth_Status) String() string { + return proto.EnumName(PluginHealth_Status_name, int32(x)) +} +func (PluginHealth_Status) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + type WriteResponse_WriteStatus int32 const ( @@ -69,7 +101,9 @@ var WriteResponse_WriteStatus_value = map[string]int32{ func (x WriteResponse_WriteStatus) String() string { return proto.EnumName(WriteResponse_WriteStatus_name, int32(x)) } -func (WriteResponse_WriteStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 0} } +func (WriteResponse_WriteStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{11, 0} +} type WriteResponse_WriteState int32 @@ -90,378 +124,744 @@ var WriteResponse_WriteState_value = map[string]int32{ func (x WriteResponse_WriteState) String() string { return proto.EnumName(WriteResponse_WriteState_name, int32(x)) } -func (WriteResponse_WriteState) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{7, 1} } - -// Read -// ~~~~ -// the read request message contains the uuid of the device that -// we desire to read. the uuid of the device should be generated -// by the owning background process and should be returned to the -// synse application in the MetainfoResponse, which Synse will -// cache and use as a lookup table for routing requests. -type ReadRequest struct { - // the id of the device to read. this is generated by the plugin - // and returned via the `Metainfo` request under the `uid` field. - Device string `protobuf:"bytes,1,opt,name=device" json:"device,omitempty"` - // the board identifier which the device belongs to. +func (WriteResponse_WriteState) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{11, 1} } + +// DeviceFilter is a message that specifies the routing information for +// a device. This can also be used as a filter for partial routing info +// by only specifying the rack or the rack+board. +type DeviceFilter struct { + // The rack identifier. + Rack string `protobuf:"bytes,1,opt,name=rack" json:"rack,omitempty"` + // The board identifier. Board string `protobuf:"bytes,2,opt,name=board" json:"board,omitempty"` - // the rack identifier which the board belongs to. - Rack string `protobuf:"bytes,3,opt,name=rack" json:"rack,omitempty"` + // The device identifier. + Device string `protobuf:"bytes,3,opt,name=device" json:"device,omitempty"` } -func (m *ReadRequest) Reset() { *m = ReadRequest{} } -func (m *ReadRequest) String() string { return proto.CompactTextString(m) } -func (*ReadRequest) ProtoMessage() {} -func (*ReadRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } +func (m *DeviceFilter) Reset() { *m = DeviceFilter{} } +func (m *DeviceFilter) String() string { return proto.CompactTextString(m) } +func (*DeviceFilter) ProtoMessage() {} +func (*DeviceFilter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } -func (m *ReadRequest) GetDevice() string { +func (m *DeviceFilter) GetRack() string { if m != nil { - return m.Device + return m.Rack } return "" } -func (m *ReadRequest) GetBoard() string { +func (m *DeviceFilter) GetBoard() string { if m != nil { return m.Board } return "" } -func (m *ReadRequest) GetRack() string { +func (m *DeviceFilter) GetDevice() string { if m != nil { - return m.Rack + return m.Device } return "" } -// Write -// ~~~~~ -// the write request message contains the uuid of the device that -// we desire to write to, as well as a repeated string (e.g. a -// list of strings in Python) which makes up the data that we -// which to write to that device. -type WriteRequest struct { - // the id of the device to write to. this is generated by the - // plugin and returned via the `Metainfo` request under the - // `uid` field. - Device string `protobuf:"bytes,1,opt,name=device" json:"device,omitempty"` - // the board identifier which the device belongs to. - Board string `protobuf:"bytes,2,opt,name=board" json:"board,omitempty"` - // the rack identifier which the board belongs to. - Rack string `protobuf:"bytes,3,opt,name=rack" json:"rack,omitempty"` - // the data to write. a given synse-server write request could - // actually be a composite of writes. for example, one can turn - // an LED on and change its color simultaneously via the Synse - // JSON API. each `WriteData` will get its own transaction id. - Data []*WriteData `protobuf:"bytes,4,rep,name=data" json:"data,omitempty"` +// Empty is a message that contains no data. +type Empty struct { } -func (m *WriteRequest) Reset() { *m = WriteRequest{} } -func (m *WriteRequest) String() string { return proto.CompactTextString(m) } -func (*WriteRequest) ProtoMessage() {} -func (*WriteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } -func (m *WriteRequest) GetDevice() string { +// Status is the response of the `Test` rpc call. In general, it should +// always return with the 'ok' field being true. +type Status struct { + Ok bool `protobuf:"varint,1,opt,name=ok" json:"ok,omitempty"` +} + +func (m *Status) Reset() { *m = Status{} } +func (m *Status) String() string { return proto.CompactTextString(m) } +func (*Status) ProtoMessage() {} +func (*Status) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *Status) GetOk() bool { if m != nil { - return m.Device + return m.Ok } - return "" + return false +} + +// PluginHealth is the response to the `Health` rpc call. It provides a +// health status summarizing the plugin's health, as well as a list of the +// `HealthCheck`s which make up that status. +type PluginHealth struct { + // The time that the health was checked. + Timestamp string `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` + // The overall health status. + Status PluginHealth_Status `protobuf:"varint,2,opt,name=status,enum=synse.PluginHealth_Status" json:"status,omitempty"` + // All the health checks of the plugin that make up the overall health. + Checks []*HealthCheck `protobuf:"bytes,3,rep,name=checks" json:"checks,omitempty"` } -func (m *WriteRequest) GetBoard() string { +func (m *PluginHealth) Reset() { *m = PluginHealth{} } +func (m *PluginHealth) String() string { return proto.CompactTextString(m) } +func (*PluginHealth) ProtoMessage() {} +func (*PluginHealth) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } + +func (m *PluginHealth) GetTimestamp() string { if m != nil { - return m.Board + return m.Timestamp } return "" } -func (m *WriteRequest) GetRack() string { +func (m *PluginHealth) GetStatus() PluginHealth_Status { if m != nil { - return m.Rack + return m.Status } - return "" + return PluginHealth_UNKNOWN } -func (m *WriteRequest) GetData() []*WriteData { +func (m *PluginHealth) GetChecks() []*HealthCheck { if m != nil { - return m.Data + return m.Checks } return nil } -// Metainfo -// ~~~~~~~~ -// the metainfo request message contains a field for rack and board, -// but neither are required. if specified, the response will contain -// only information relating to the rack/board filter applied. if -// they are left unspecified, the response will contain the entirety -// of the metainfo scan information. -type MetainfoRequest struct { - // the rack filter for the meta information response. - Rack string `protobuf:"bytes,1,opt,name=rack" json:"rack,omitempty"` - // the board filter for the meta information response. - Board string `protobuf:"bytes,2,opt,name=board" json:"board,omitempty"` +// HealthCheck is an individual health metric that makes up the plugin health. +type HealthCheck struct { + // The name of the health check. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // The status of the health check. + Status PluginHealth_Status `protobuf:"varint,2,opt,name=status,enum=synse.PluginHealth_Status" json:"status,omitempty"` + // Any additional info associated with the health check. + Message string `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + // The time at which the health check was completed. + Timestamp string `protobuf:"bytes,4,opt,name=timestamp" json:"timestamp,omitempty"` + // The type of the health check. These are left as arbitrary strings + // instead of enums to make it easier to support new types of health + // checks in the future, without having to update the GRPC API. + Type string `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"` +} + +func (m *HealthCheck) Reset() { *m = HealthCheck{} } +func (m *HealthCheck) String() string { return proto.CompactTextString(m) } +func (*HealthCheck) ProtoMessage() {} +func (*HealthCheck) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } + +func (m *HealthCheck) GetName() string { + if m != nil { + return m.Name + } + return "" } -func (m *MetainfoRequest) Reset() { *m = MetainfoRequest{} } -func (m *MetainfoRequest) String() string { return proto.CompactTextString(m) } -func (*MetainfoRequest) ProtoMessage() {} -func (*MetainfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (m *HealthCheck) GetStatus() PluginHealth_Status { + if m != nil { + return m.Status + } + return PluginHealth_UNKNOWN +} -func (m *MetainfoRequest) GetRack() string { +func (m *HealthCheck) GetMessage() string { if m != nil { - return m.Rack + return m.Message } return "" } -func (m *MetainfoRequest) GetBoard() string { +func (m *HealthCheck) GetTimestamp() string { if m != nil { - return m.Board + return m.Timestamp } return "" } -// TransactionCheck -// ~~~~~~~~~~~~~~~~ -// the transaction id gives identity to a single 'write' action. since -// device writes are handled asynchronously, the background process -// returns the transaction id when a write is registered, which the -// caller can later pass back to `TransactionCheck` to get the status -// of that write. -type TransactionId struct { - // the id of a write transaction. this is returned by the write - // commands `Transactions` response. - Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` +func (m *HealthCheck) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +// DeviceCapability identifies a device kind and the potential kinds of readings +// that it supports. +type DeviceCapability struct { + // The kind/type of the device. + Kind string `protobuf:"bytes,1,opt,name=kind" json:"kind,omitempty"` + // The outputs that the device supports. + Outputs []string `protobuf:"bytes,2,rep,name=outputs" json:"outputs,omitempty"` } -func (m *TransactionId) Reset() { *m = TransactionId{} } -func (m *TransactionId) String() string { return proto.CompactTextString(m) } -func (*TransactionId) ProtoMessage() {} -func (*TransactionId) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (m *DeviceCapability) Reset() { *m = DeviceCapability{} } +func (m *DeviceCapability) String() string { return proto.CompactTextString(m) } +func (*DeviceCapability) ProtoMessage() {} +func (*DeviceCapability) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } -func (m *TransactionId) GetId() string { +func (m *DeviceCapability) GetKind() string { if m != nil { - return m.Id + return m.Kind } return "" } -// Read -// ~~~~ -// the read response provides the timestamp at which the reading was -// taken, the type of the reading (e.g. temperature, humidity, led -// state, etc.), and the value of that reading. read responses are -// returned to the client as a stream, so a single device can return -// multiple readings. (e.g. a humidity sensor can return a %humidity -// reading and a temperature reading). -type ReadResponse struct { - // the time which the reading was taken. - Timestamp string `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` - // the type of reading. - Type string `protobuf:"bytes,2,opt,name=type" json:"type,omitempty"` - // the value of the reading. - Value string `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` +func (m *DeviceCapability) GetOutputs() []string { + if m != nil { + return m.Outputs + } + return nil } -func (m *ReadResponse) Reset() { *m = ReadResponse{} } -func (m *ReadResponse) String() string { return proto.CompactTextString(m) } -func (*ReadResponse) ProtoMessage() {} -func (*ReadResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +// Metadata is the response to the `Metainfo` rpc call. +type Metadata struct { + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + Maintainer string `protobuf:"bytes,2,opt,name=maintainer" json:"maintainer,omitempty"` + Tag string `protobuf:"bytes,3,opt,name=tag" json:"tag,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` + Vcs string `protobuf:"bytes,5,opt,name=vcs" json:"vcs,omitempty"` + Version *VersionInfo `protobuf:"bytes,6,opt,name=version" json:"version,omitempty"` +} -func (m *ReadResponse) GetTimestamp() string { +func (m *Metadata) Reset() { *m = Metadata{} } +func (m *Metadata) String() string { return proto.CompactTextString(m) } +func (*Metadata) ProtoMessage() {} +func (*Metadata) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } + +func (m *Metadata) GetName() string { if m != nil { - return m.Timestamp + return m.Name } return "" } -func (m *ReadResponse) GetType() string { +func (m *Metadata) GetMaintainer() string { if m != nil { - return m.Type + return m.Maintainer } return "" } -func (m *ReadResponse) GetValue() string { +func (m *Metadata) GetTag() string { if m != nil { - return m.Value + return m.Tag } return "" } -// Write -// ~~~~~ -// the transactions message specifies the asynchronous transactions for -// each of the given write actions. each transaction identifies a single -// write action with a unique transaction id and context to help identify -// which transaction that id is associated with. the transaction id can -// later be passed back to `TransactionCheck` to get the status of that -// write. -type Transactions struct { - // a map where the key is the transaction id for a given `WriteData` - // message that has been processed, and the value is that same - // `WriteData` message. the `WriteData` message is passed back in - // order to provide some context and make identifying transactions - // possible. the number of entries in the transactions map corresponds - // to the number of `WriteData` recieved in a `WriteRequest`. - Transactions map[string]*WriteData `protobuf:"bytes,1,rep,name=transactions" json:"transactions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +func (m *Metadata) GetDescription() string { + if m != nil { + return m.Description + } + return "" } -func (m *Transactions) Reset() { *m = Transactions{} } -func (m *Transactions) String() string { return proto.CompactTextString(m) } -func (*Transactions) ProtoMessage() {} -func (*Transactions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (m *Metadata) GetVcs() string { + if m != nil { + return m.Vcs + } + return "" +} -func (m *Transactions) GetTransactions() map[string]*WriteData { +func (m *Metadata) GetVersion() *VersionInfo { if m != nil { - return m.Transactions + return m.Version } return nil } -// Metainfo -// ~~~~~~~~ -// the metainfo response represents a single device that is owned by -// the process. metainfo responses are returned to the client as a stream -// so a background process can support any number of devices. the response -// itself contains a timestamp for when the response was generated, an -// for the device, and all other meta-information we have pertaining to -// that device. the caller, Synse, will cache this information and use it -// to route requests to the appropriate device as well as provide responses -// for scan and info requests. -type MetainfoResponse struct { - // the time at which the metainfo was gathered. - Timestamp string `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` - // the unique id for the device this response represents. - Uid string `protobuf:"bytes,2,opt,name=uid" json:"uid,omitempty"` - // the device type. - Type string `protobuf:"bytes,3,opt,name=type" json:"type,omitempty"` - // the device model. - Model string `protobuf:"bytes,4,opt,name=model" json:"model,omitempty"` - // the device manufacturer. - Manufacturer string `protobuf:"bytes,5,opt,name=manufacturer" json:"manufacturer,omitempty"` - // the protocol that the device is configured to use. - Protocol string `protobuf:"bytes,6,opt,name=protocol" json:"protocol,omitempty"` - // any additional information specified for the device. - Info string `protobuf:"bytes,7,opt,name=info" json:"info,omitempty"` - // any comment specified for the device. - Comment string `protobuf:"bytes,8,opt,name=comment" json:"comment,omitempty"` - // the location of the device, as specified by rack and board - // identifiers. - Location *MetaLocation `protobuf:"bytes,9,opt,name=location" json:"location,omitempty"` - // the reading output of the device. this specifies all of the - // outputs a device will generate when read. most devices will have - // a single output, but some devices (e.g. a humidity sensor) could - // return multiple data points from a single reading. (e.g. - // temperature and humidity). - Output []*MetaOutput `protobuf:"bytes,10,rep,name=output" json:"output,omitempty"` +// VersionInfo is the response to the `Version` rpc call. +type VersionInfo struct { + PluginVersion string `protobuf:"bytes,1,opt,name=pluginVersion" json:"pluginVersion,omitempty"` + SdkVersion string `protobuf:"bytes,2,opt,name=sdkVersion" json:"sdkVersion,omitempty"` + BuildDate string `protobuf:"bytes,3,opt,name=buildDate" json:"buildDate,omitempty"` + GitCommit string `protobuf:"bytes,4,opt,name=gitCommit" json:"gitCommit,omitempty"` + GitTag string `protobuf:"bytes,5,opt,name=gitTag" json:"gitTag,omitempty"` + Arch string `protobuf:"bytes,6,opt,name=arch" json:"arch,omitempty"` + Os string `protobuf:"bytes,7,opt,name=os" json:"os,omitempty"` } -func (m *MetainfoResponse) Reset() { *m = MetainfoResponse{} } -func (m *MetainfoResponse) String() string { return proto.CompactTextString(m) } -func (*MetainfoResponse) ProtoMessage() {} -func (*MetainfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (m *VersionInfo) Reset() { *m = VersionInfo{} } +func (m *VersionInfo) String() string { return proto.CompactTextString(m) } +func (*VersionInfo) ProtoMessage() {} +func (*VersionInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } -func (m *MetainfoResponse) GetTimestamp() string { +func (m *VersionInfo) GetPluginVersion() string { if m != nil { - return m.Timestamp + return m.PluginVersion } return "" } -func (m *MetainfoResponse) GetUid() string { +func (m *VersionInfo) GetSdkVersion() string { if m != nil { - return m.Uid + return m.SdkVersion } return "" } -func (m *MetainfoResponse) GetType() string { +func (m *VersionInfo) GetBuildDate() string { if m != nil { - return m.Type + return m.BuildDate } return "" } -func (m *MetainfoResponse) GetModel() string { +func (m *VersionInfo) GetGitCommit() string { if m != nil { - return m.Model + return m.GitCommit } return "" } -func (m *MetainfoResponse) GetManufacturer() string { +func (m *VersionInfo) GetGitTag() string { if m != nil { - return m.Manufacturer + return m.GitTag } return "" } -func (m *MetainfoResponse) GetProtocol() string { +func (m *VersionInfo) GetArch() string { if m != nil { - return m.Protocol + return m.Arch } return "" } -func (m *MetainfoResponse) GetInfo() string { +func (m *VersionInfo) GetOs() string { + if m != nil { + return m.Os + } + return "" +} + +// Reading is the response to the `Read` rpc call. +type Reading struct { + // The time which the reading was taken. + Timestamp string `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` + // The type of reading. + Type string `protobuf:"bytes,2,opt,name=type" json:"type,omitempty"` + // Any info associated with the reading. + Info string `protobuf:"bytes,3,opt,name=info" json:"info,omitempty"` + // The unit of the reading. + Unit *Unit `protobuf:"bytes,4,opt,name=unit" json:"unit,omitempty"` + // The value of the reading. + // + // Types that are valid to be assigned to Value: + // *Reading_StringValue + // *Reading_BoolValue + // *Reading_Float32Value + // *Reading_Float64Value + // *Reading_Int32Value + // *Reading_Int64Value + // *Reading_BytesValue + // *Reading_Uint32Value + // *Reading_Uint64Value + Value isReading_Value `protobuf_oneof:"value"` +} + +func (m *Reading) Reset() { *m = Reading{} } +func (m *Reading) String() string { return proto.CompactTextString(m) } +func (*Reading) ProtoMessage() {} +func (*Reading) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } + +type isReading_Value interface { + isReading_Value() +} + +type Reading_StringValue struct { + StringValue string `protobuf:"bytes,5,opt,name=string_value,json=stringValue,oneof"` +} +type Reading_BoolValue struct { + BoolValue bool `protobuf:"varint,6,opt,name=bool_value,json=boolValue,oneof"` +} +type Reading_Float32Value struct { + Float32Value float32 `protobuf:"fixed32,7,opt,name=float32_value,json=float32Value,oneof"` +} +type Reading_Float64Value struct { + Float64Value float64 `protobuf:"fixed64,8,opt,name=float64_value,json=float64Value,oneof"` +} +type Reading_Int32Value struct { + Int32Value int32 `protobuf:"varint,9,opt,name=int32_value,json=int32Value,oneof"` +} +type Reading_Int64Value struct { + Int64Value int64 `protobuf:"varint,10,opt,name=int64_value,json=int64Value,oneof"` +} +type Reading_BytesValue struct { + BytesValue []byte `protobuf:"bytes,11,opt,name=bytes_value,json=bytesValue,proto3,oneof"` +} +type Reading_Uint32Value struct { + Uint32Value uint32 `protobuf:"varint,12,opt,name=uint32_value,json=uint32Value,oneof"` +} +type Reading_Uint64Value struct { + Uint64Value uint64 `protobuf:"varint,13,opt,name=uint64_value,json=uint64Value,oneof"` +} + +func (*Reading_StringValue) isReading_Value() {} +func (*Reading_BoolValue) isReading_Value() {} +func (*Reading_Float32Value) isReading_Value() {} +func (*Reading_Float64Value) isReading_Value() {} +func (*Reading_Int32Value) isReading_Value() {} +func (*Reading_Int64Value) isReading_Value() {} +func (*Reading_BytesValue) isReading_Value() {} +func (*Reading_Uint32Value) isReading_Value() {} +func (*Reading_Uint64Value) isReading_Value() {} + +func (m *Reading) GetValue() isReading_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *Reading) GetTimestamp() string { + if m != nil { + return m.Timestamp + } + return "" +} + +func (m *Reading) GetType() string { + if m != nil { + return m.Type + } + return "" +} + +func (m *Reading) GetInfo() string { if m != nil { return m.Info } return "" } -func (m *MetainfoResponse) GetComment() string { +func (m *Reading) GetUnit() *Unit { if m != nil { - return m.Comment + return m.Unit + } + return nil +} + +func (m *Reading) GetStringValue() string { + if x, ok := m.GetValue().(*Reading_StringValue); ok { + return x.StringValue } return "" } -func (m *MetainfoResponse) GetLocation() *MetaLocation { +func (m *Reading) GetBoolValue() bool { + if x, ok := m.GetValue().(*Reading_BoolValue); ok { + return x.BoolValue + } + return false +} + +func (m *Reading) GetFloat32Value() float32 { + if x, ok := m.GetValue().(*Reading_Float32Value); ok { + return x.Float32Value + } + return 0 +} + +func (m *Reading) GetFloat64Value() float64 { + if x, ok := m.GetValue().(*Reading_Float64Value); ok { + return x.Float64Value + } + return 0 +} + +func (m *Reading) GetInt32Value() int32 { + if x, ok := m.GetValue().(*Reading_Int32Value); ok { + return x.Int32Value + } + return 0 +} + +func (m *Reading) GetInt64Value() int64 { + if x, ok := m.GetValue().(*Reading_Int64Value); ok { + return x.Int64Value + } + return 0 +} + +func (m *Reading) GetBytesValue() []byte { + if x, ok := m.GetValue().(*Reading_BytesValue); ok { + return x.BytesValue + } + return nil +} + +func (m *Reading) GetUint32Value() uint32 { + if x, ok := m.GetValue().(*Reading_Uint32Value); ok { + return x.Uint32Value + } + return 0 +} + +func (m *Reading) GetUint64Value() uint64 { + if x, ok := m.GetValue().(*Reading_Uint64Value); ok { + return x.Uint64Value + } + return 0 +} + +// XXX_OneofFuncs is for the internal use of the proto package. +func (*Reading) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _Reading_OneofMarshaler, _Reading_OneofUnmarshaler, _Reading_OneofSizer, []interface{}{ + (*Reading_StringValue)(nil), + (*Reading_BoolValue)(nil), + (*Reading_Float32Value)(nil), + (*Reading_Float64Value)(nil), + (*Reading_Int32Value)(nil), + (*Reading_Int64Value)(nil), + (*Reading_BytesValue)(nil), + (*Reading_Uint32Value)(nil), + (*Reading_Uint64Value)(nil), + } +} + +func _Reading_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*Reading) + // value + switch x := m.Value.(type) { + case *Reading_StringValue: + b.EncodeVarint(5<<3 | proto.WireBytes) + b.EncodeStringBytes(x.StringValue) + case *Reading_BoolValue: + t := uint64(0) + if x.BoolValue { + t = 1 + } + b.EncodeVarint(6<<3 | proto.WireVarint) + b.EncodeVarint(t) + case *Reading_Float32Value: + b.EncodeVarint(7<<3 | proto.WireFixed32) + b.EncodeFixed32(uint64(math.Float32bits(x.Float32Value))) + case *Reading_Float64Value: + b.EncodeVarint(8<<3 | proto.WireFixed64) + b.EncodeFixed64(math.Float64bits(x.Float64Value)) + case *Reading_Int32Value: + b.EncodeVarint(9<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Int32Value)) + case *Reading_Int64Value: + b.EncodeVarint(10<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Int64Value)) + case *Reading_BytesValue: + b.EncodeVarint(11<<3 | proto.WireBytes) + b.EncodeRawBytes(x.BytesValue) + case *Reading_Uint32Value: + b.EncodeVarint(12<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Uint32Value)) + case *Reading_Uint64Value: + b.EncodeVarint(13<<3 | proto.WireVarint) + b.EncodeVarint(uint64(x.Uint64Value)) + case nil: + default: + return fmt.Errorf("Reading.Value has unexpected type %T", x) + } + return nil +} + +func _Reading_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*Reading) + switch tag { + case 5: // value.string_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeStringBytes() + m.Value = &Reading_StringValue{x} + return true, err + case 6: // value.bool_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &Reading_BoolValue{x != 0} + return true, err + case 7: // value.float32_value + if wire != proto.WireFixed32 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed32() + m.Value = &Reading_Float32Value{math.Float32frombits(uint32(x))} + return true, err + case 8: // value.float64_value + if wire != proto.WireFixed64 { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeFixed64() + m.Value = &Reading_Float64Value{math.Float64frombits(x)} + return true, err + case 9: // value.int32_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &Reading_Int32Value{int32(x)} + return true, err + case 10: // value.int64_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &Reading_Int64Value{int64(x)} + return true, err + case 11: // value.bytes_value + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeRawBytes(true) + m.Value = &Reading_BytesValue{x} + return true, err + case 12: // value.uint32_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &Reading_Uint32Value{uint32(x)} + return true, err + case 13: // value.uint64_value + if wire != proto.WireVarint { + return true, proto.ErrInternalBadWireType + } + x, err := b.DecodeVarint() + m.Value = &Reading_Uint64Value{x} + return true, err + default: + return false, nil + } +} + +func _Reading_OneofSizer(msg proto.Message) (n int) { + m := msg.(*Reading) + // value + switch x := m.Value.(type) { + case *Reading_StringValue: + n += proto.SizeVarint(5<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.StringValue))) + n += len(x.StringValue) + case *Reading_BoolValue: + n += proto.SizeVarint(6<<3 | proto.WireVarint) + n += 1 + case *Reading_Float32Value: + n += proto.SizeVarint(7<<3 | proto.WireFixed32) + n += 4 + case *Reading_Float64Value: + n += proto.SizeVarint(8<<3 | proto.WireFixed64) + n += 8 + case *Reading_Int32Value: + n += proto.SizeVarint(9<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Int32Value)) + case *Reading_Int64Value: + n += proto.SizeVarint(10<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Int64Value)) + case *Reading_BytesValue: + n += proto.SizeVarint(11<<3 | proto.WireBytes) + n += proto.SizeVarint(uint64(len(x.BytesValue))) + n += len(x.BytesValue) + case *Reading_Uint32Value: + n += proto.SizeVarint(12<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Uint32Value)) + case *Reading_Uint64Value: + n += proto.SizeVarint(13<<3 | proto.WireVarint) + n += proto.SizeVarint(uint64(x.Uint64Value)) + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + +// WriteInfo is the request message for the `Write` rpc call. It specifies a +// filter for the device to write to, as well as actions/data for the write. +type WriteInfo struct { + // The specifier for the device to write to. + DeviceFilter *DeviceFilter `protobuf:"bytes,1,opt,name=deviceFilter" json:"deviceFilter,omitempty"` + // The data to write to the device. + Data []*WriteData `protobuf:"bytes,2,rep,name=data" json:"data,omitempty"` +} + +func (m *WriteInfo) Reset() { *m = WriteInfo{} } +func (m *WriteInfo) String() string { return proto.CompactTextString(m) } +func (*WriteInfo) ProtoMessage() {} +func (*WriteInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } + +func (m *WriteInfo) GetDeviceFilter() *DeviceFilter { if m != nil { - return m.Location + return m.DeviceFilter } return nil } -func (m *MetainfoResponse) GetOutput() []*MetaOutput { +func (m *WriteInfo) GetData() []*WriteData { if m != nil { - return m.Output + return m.Data } return nil } -// TransactionCheck -// ~~~~~~~~~~~~~~~~ -// the response for a transaction check command gives the status of the -// transaction. transactions correspond to write requests. since writes -// are performed asynchronously, the transaction id is used to track the -// progress of that transaction. +// WriteData is the data that gets written on a `Write` rpc call. +type WriteData struct { + // The action string for the device write. + Action string `protobuf:"bytes,1,opt,name=action" json:"action,omitempty"` + // The data to write. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (m *WriteData) Reset() { *m = WriteData{} } +func (m *WriteData) String() string { return proto.CompactTextString(m) } +func (*WriteData) ProtoMessage() {} +func (*WriteData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } + +func (m *WriteData) GetAction() string { + if m != nil { + return m.Action + } + return "" +} + +func (m *WriteData) GetData() []byte { + if m != nil { + return m.Data + } + return nil +} + +// WriteResponse is the response for a `Transaction` rpc call. It gives the +// status of the transaction. Transactions correspond with write requests. +// Since writes are performed asynchronously, the transaction id is used to +// track the progress of that transaction. type WriteResponse struct { - // the time at which the write transaction was created. - Created string `protobuf:"bytes,1,opt,name=created" json:"created,omitempty"` - // the time at which the write transaction was last updated (either - // for an update to state or status). - Updated string `protobuf:"bytes,2,opt,name=updated" json:"updated,omitempty"` - // the status of the transaction. this describes what stage of - // processing the transaction is at. - Status WriteResponse_WriteStatus `protobuf:"varint,3,opt,name=status,enum=synse.WriteResponse_WriteStatus" json:"status,omitempty"` - // the state of the transaction. this describes the so called "health" + // The id of the write transaction. + Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` + // The time at which the write transaction was created. + Created string `protobuf:"bytes,2,opt,name=created" json:"created,omitempty"` + // The time at which the write transaction state/status was last updated. + Updated string `protobuf:"bytes,3,opt,name=updated" json:"updated,omitempty"` + // The status of the transaction. This describes what stage of processing + // the transaction is at. + Status WriteResponse_WriteStatus `protobuf:"varint,4,opt,name=status,enum=synse.WriteResponse_WriteStatus" json:"status,omitempty"` + // The state of the transaction. This describes the so called "health" // of the transaction. - State WriteResponse_WriteState `protobuf:"varint,4,opt,name=state,enum=synse.WriteResponse_WriteState" json:"state,omitempty"` - // the message field will be used to specify any context information - // when the state is in ERROR. if the state is OK, this field will + State WriteResponse_WriteState `protobuf:"varint,5,opt,name=state,enum=synse.WriteResponse_WriteState" json:"state,omitempty"` + // The message field will be used to specify any context information + // when the state is ERROR. If the state is OK, this field will // remain empty. - Message string `protobuf:"bytes,5,opt,name=message" json:"message,omitempty"` + Message string `protobuf:"bytes,6,opt,name=message" json:"message,omitempty"` } func (m *WriteResponse) Reset() { *m = WriteResponse{} } func (m *WriteResponse) String() string { return proto.CompactTextString(m) } func (*WriteResponse) ProtoMessage() {} -func (*WriteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*WriteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } + +func (m *WriteResponse) GetId() string { + if m != nil { + return m.Id + } + return "" +} func (m *WriteResponse) GetCreated() string { if m != nil { @@ -498,193 +898,269 @@ func (m *WriteResponse) GetMessage() string { return "" } -// Specifies the data that gets written on a `WriteRequest`. This is a -// composite of raw bytes and an action string. Both of the fields can -// be specified, or only one of them. In cases where no action is supplied, -// the plugin can take the raw data as raw bytes to write to the device. -// There may be cases when only an action is supplied, such as "on" for -// turning an LED on (which the plugin can then interpret for its protocol). -// Both can be specified, such as changing the color of an LED where the -// raw bytes can specify the color itself and the action could be "color", -// differentiating it from a write to LED blink state, etc. -type WriteData struct { - // raw bytes to send to the plugin for writing. - Raw [][]byte `protobuf:"bytes,1,rep,name=raw,proto3" json:"raw,omitempty"` - // a (well-known) action identifier. - Action string `protobuf:"bytes,2,opt,name=action" json:"action,omitempty"` +// TransactionFilter is a filter for transaction checks. If its id field is +// set, the plugin will only check the state for that transaction. If the id +// field is empty, the plugin will return the state for all active transactions. +type TransactionFilter struct { + // The id of the transaction to check. + Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` } -func (m *WriteData) Reset() { *m = WriteData{} } -func (m *WriteData) String() string { return proto.CompactTextString(m) } -func (*WriteData) ProtoMessage() {} -func (*WriteData) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } +func (m *TransactionFilter) Reset() { *m = TransactionFilter{} } +func (m *TransactionFilter) String() string { return proto.CompactTextString(m) } +func (*TransactionFilter) ProtoMessage() {} +func (*TransactionFilter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } + +func (m *TransactionFilter) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +// Transactions specifies the asynchronous transactions for each of the writes +// for a `Write` rpc call. Each transaction identifies a single write action +// with a unique transaction id and context to help identify which transaction +// that id corresponds to. +// +// The transaction id can later be passed back to the `Transaction` rpc call +// to get the status of that write. +type Transactions struct { + // A map where the key is the transaction id for a `WriteData` within the + // `WriteInfo`, and the value is that same `WriteData`, provided as context. + Transactions map[string]*WriteData `protobuf:"bytes,1,rep,name=transactions" json:"transactions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` +} -func (m *WriteData) GetRaw() [][]byte { +func (m *Transactions) Reset() { *m = Transactions{} } +func (m *Transactions) String() string { return proto.CompactTextString(m) } +func (*Transactions) ProtoMessage() {} +func (*Transactions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } + +func (m *Transactions) GetTransactions() map[string]*WriteData { if m != nil { - return m.Raw + return m.Transactions } return nil } -func (m *WriteData) GetAction() string { +// Device is the response to the `Devices` rpc call. It provides all of the +// info that describes a device. This is used by Synse Server for its 'scan' +// and 'info' endpoints. +type Device struct { + // The time at which the device info was gathered. + Timestamp string `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp,omitempty"` + // The unique id for the device. + Uid string `protobuf:"bytes,2,opt,name=uid" json:"uid,omitempty"` + // The device kind. This can also be thought of as 'device type'. + Kind string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` + // Any metadata associated with the device. + Metadata map[string]string `protobuf:"bytes,4,rep,name=metadata" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + // The name of the plugin that the device is managed by. + Plugin string `protobuf:"bytes,5,opt,name=plugin" json:"plugin,omitempty"` + // Any additional information specified for the device. + Info string `protobuf:"bytes,6,opt,name=info" json:"info,omitempty"` + // The location of the device, as specified by rack and board + // identifiers. + Location *Location `protobuf:"bytes,7,opt,name=location" json:"location,omitempty"` + // The reading output of the device. This specifies all of the + // outputs a device can generate when read. Many devices will have + // a single output, but some devices (e.g. a humidity sensor) could + // return multiple data points from a single reading (e.g. + // temperature and humidity). + Output []*Output `protobuf:"bytes,8,rep,name=output" json:"output,omitempty"` +} + +func (m *Device) Reset() { *m = Device{} } +func (m *Device) String() string { return proto.CompactTextString(m) } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *Device) GetTimestamp() string { if m != nil { - return m.Action + return m.Timestamp } return "" } -// the unit specification for a reading output. -type MetaOutputUnit struct { - // the full name of the unit, e.g. "degrees celsius". - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // the symbol for the unit, e.g. "C". - Symbol string `protobuf:"bytes,2,opt,name=symbol" json:"symbol,omitempty"` +func (m *Device) GetUid() string { + if m != nil { + return m.Uid + } + return "" } -func (m *MetaOutputUnit) Reset() { *m = MetaOutputUnit{} } -func (m *MetaOutputUnit) String() string { return proto.CompactTextString(m) } -func (*MetaOutputUnit) ProtoMessage() {} -func (*MetaOutputUnit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } +func (m *Device) GetKind() string { + if m != nil { + return m.Kind + } + return "" +} -func (m *MetaOutputUnit) GetName() string { +func (m *Device) GetMetadata() map[string]string { if m != nil { - return m.Name + return m.Metadata + } + return nil +} + +func (m *Device) GetPlugin() string { + if m != nil { + return m.Plugin } return "" } -func (m *MetaOutputUnit) GetSymbol() string { +func (m *Device) GetInfo() string { if m != nil { - return m.Symbol + return m.Info } return "" } -// the value range specification for a reading output. -type MetaOutputRange struct { - // the minimum allowable value for a numeric reading. - Min int32 `protobuf:"varint,1,opt,name=min" json:"min,omitempty"` - // the maximum allowable value for a numeric reading. - Max int32 `protobuf:"varint,2,opt,name=max" json:"max,omitempty"` +func (m *Device) GetLocation() *Location { + if m != nil { + return m.Location + } + return nil } -func (m *MetaOutputRange) Reset() { *m = MetaOutputRange{} } -func (m *MetaOutputRange) String() string { return proto.CompactTextString(m) } -func (*MetaOutputRange) ProtoMessage() {} -func (*MetaOutputRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } +func (m *Device) GetOutput() []*Output { + if m != nil { + return m.Output + } + return nil +} -func (m *MetaOutputRange) GetMin() int32 { +// Location is the location specification for a device. +type Location struct { + // The rack which the device belongs to. + Rack string `protobuf:"bytes,1,opt,name=rack" json:"rack,omitempty"` + // The board which the device belongs to. + Board string `protobuf:"bytes,2,opt,name=board" json:"board,omitempty"` +} + +func (m *Location) Reset() { *m = Location{} } +func (m *Location) String() string { return proto.CompactTextString(m) } +func (*Location) ProtoMessage() {} +func (*Location) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } + +func (m *Location) GetRack() string { if m != nil { - return m.Min + return m.Rack } - return 0 + return "" } -func (m *MetaOutputRange) GetMax() int32 { +func (m *Location) GetBoard() string { if m != nil { - return m.Max + return m.Board } - return 0 + return "" } -// the specification for one of a device's reading outputs. -type MetaOutput struct { - // the type of the reading output (e.g. 'temperature', - // 'humidity', etc). - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - // the data type of the output (e.g. int, string, bool). - DataType string `protobuf:"bytes,2,opt,name=data_type,json=dataType" json:"data_type,omitempty"` - // the decimal precision of the output. if the output is - // non-numeric, this can be left unspecified and will be - // ignored. +// Output is the specification for one of a device's reading outputs. +type Output struct { + // The name of the output. This is namespaced. + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // The type of the output. This is the last element of the namespace. + Type string `protobuf:"bytes,2,opt,name=type" json:"type,omitempty"` + // The decimal precision of the output. This is ignored if the output + // dataType is not a float. Precision int32 `protobuf:"varint,3,opt,name=precision" json:"precision,omitempty"` - // the unit of measure for the reading. - Unit *MetaOutputUnit `protobuf:"bytes,4,opt,name=unit" json:"unit,omitempty"` - // the acceptable range of values for the reading. - Range *MetaOutputRange `protobuf:"bytes,5,opt,name=range" json:"range,omitempty"` + // The scaling factor to multiply the reading result by. This can be + // positive or negative, whole or decimal. + ScalingFactor float64 `protobuf:"fixed64,4,opt,name=scalingFactor" json:"scalingFactor,omitempty"` + // The unit of measure for the reading. + Unit *Unit `protobuf:"bytes,5,opt,name=unit" json:"unit,omitempty"` } -func (m *MetaOutput) Reset() { *m = MetaOutput{} } -func (m *MetaOutput) String() string { return proto.CompactTextString(m) } -func (*MetaOutput) ProtoMessage() {} -func (*MetaOutput) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } +func (m *Output) Reset() { *m = Output{} } +func (m *Output) String() string { return proto.CompactTextString(m) } +func (*Output) ProtoMessage() {} +func (*Output) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } -func (m *MetaOutput) GetType() string { +func (m *Output) GetName() string { if m != nil { - return m.Type + return m.Name } return "" } -func (m *MetaOutput) GetDataType() string { +func (m *Output) GetType() string { if m != nil { - return m.DataType + return m.Type } return "" } -func (m *MetaOutput) GetPrecision() int32 { +func (m *Output) GetPrecision() int32 { if m != nil { return m.Precision } return 0 } -func (m *MetaOutput) GetUnit() *MetaOutputUnit { +func (m *Output) GetScalingFactor() float64 { if m != nil { - return m.Unit + return m.ScalingFactor } - return nil + return 0 } -func (m *MetaOutput) GetRange() *MetaOutputRange { +func (m *Output) GetUnit() *Unit { if m != nil { - return m.Range + return m.Unit } return nil } -// the location specification for a device. -type MetaLocation struct { - // the rack which the device belongs to. - Rack string `protobuf:"bytes,1,opt,name=rack" json:"rack,omitempty"` - // the board which the device belongs to. - Board string `protobuf:"bytes,2,opt,name=board" json:"board,omitempty"` +// Unit is the unit specification for a reading output. +type Unit struct { + // The full name of the unit, e.g. "degrees celsius". + Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` + // The symbol for the unit, e.g. "C". + Symbol string `protobuf:"bytes,2,opt,name=symbol" json:"symbol,omitempty"` } -func (m *MetaLocation) Reset() { *m = MetaLocation{} } -func (m *MetaLocation) String() string { return proto.CompactTextString(m) } -func (*MetaLocation) ProtoMessage() {} -func (*MetaLocation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } +func (m *Unit) Reset() { *m = Unit{} } +func (m *Unit) String() string { return proto.CompactTextString(m) } +func (*Unit) ProtoMessage() {} +func (*Unit) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } -func (m *MetaLocation) GetRack() string { +func (m *Unit) GetName() string { if m != nil { - return m.Rack + return m.Name } return "" } -func (m *MetaLocation) GetBoard() string { +func (m *Unit) GetSymbol() string { if m != nil { - return m.Board + return m.Symbol } return "" } func init() { - proto.RegisterType((*ReadRequest)(nil), "synse.ReadRequest") - proto.RegisterType((*WriteRequest)(nil), "synse.WriteRequest") - proto.RegisterType((*MetainfoRequest)(nil), "synse.MetainfoRequest") - proto.RegisterType((*TransactionId)(nil), "synse.TransactionId") - proto.RegisterType((*ReadResponse)(nil), "synse.ReadResponse") - proto.RegisterType((*Transactions)(nil), "synse.Transactions") - proto.RegisterType((*MetainfoResponse)(nil), "synse.MetainfoResponse") - proto.RegisterType((*WriteResponse)(nil), "synse.WriteResponse") + proto.RegisterType((*DeviceFilter)(nil), "synse.DeviceFilter") + proto.RegisterType((*Empty)(nil), "synse.Empty") + proto.RegisterType((*Status)(nil), "synse.Status") + proto.RegisterType((*PluginHealth)(nil), "synse.PluginHealth") + proto.RegisterType((*HealthCheck)(nil), "synse.HealthCheck") + proto.RegisterType((*DeviceCapability)(nil), "synse.DeviceCapability") + proto.RegisterType((*Metadata)(nil), "synse.Metadata") + proto.RegisterType((*VersionInfo)(nil), "synse.VersionInfo") + proto.RegisterType((*Reading)(nil), "synse.Reading") + proto.RegisterType((*WriteInfo)(nil), "synse.WriteInfo") proto.RegisterType((*WriteData)(nil), "synse.WriteData") - proto.RegisterType((*MetaOutputUnit)(nil), "synse.MetaOutputUnit") - proto.RegisterType((*MetaOutputRange)(nil), "synse.MetaOutputRange") - proto.RegisterType((*MetaOutput)(nil), "synse.MetaOutput") - proto.RegisterType((*MetaLocation)(nil), "synse.MetaLocation") + proto.RegisterType((*WriteResponse)(nil), "synse.WriteResponse") + proto.RegisterType((*TransactionFilter)(nil), "synse.TransactionFilter") + proto.RegisterType((*Transactions)(nil), "synse.Transactions") + proto.RegisterType((*Device)(nil), "synse.Device") + proto.RegisterType((*Location)(nil), "synse.Location") + proto.RegisterType((*Output)(nil), "synse.Output") + proto.RegisterType((*Unit)(nil), "synse.Unit") + proto.RegisterEnum("synse.PluginHealth_Status", PluginHealth_Status_name, PluginHealth_Status_value) proto.RegisterEnum("synse.WriteResponse_WriteStatus", WriteResponse_WriteStatus_name, WriteResponse_WriteStatus_value) proto.RegisterEnum("synse.WriteResponse_WriteState", WriteResponse_WriteState_name, WriteResponse_WriteState_value) } @@ -697,34 +1173,86 @@ var _ grpc.ClientConn // is compatible with the grpc package it is being compiled against. const _ = grpc.SupportPackageIsVersion4 -// Client API for InternalApi service +// Client API for Plugin service + +type PluginClient interface { + // Test returns the status of the plugin. This call is intended to + // be used in order to check if a plugin is reachable. The status + // returned here designates plugin reachability, not plugin health. + Test(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Status, error) + // Version returns the version info for the plugin. This is not used + // by Synse Server, but can be used by the CLI/manual plugin interaction. + Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionInfo, error) + // Health returns the health status of a plugin. + Health(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginHealth, error) + // Metainfo gets the metainfo for the plugin. This info provides details + // about the plugin itself. + Metainfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Metadata, error) + // Capabilities returns the collection of capabilities that a plugin + // exposes. More specifically, this means types of devices supported + // and the readings supported for each of those devices. + Capabilities(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Plugin_CapabilitiesClient, error) + // Devices gets info for all of the devices that the plugin manages. + // This rpc call is the plugin's equivalent to a Synse Server scan. + Devices(ctx context.Context, in *DeviceFilter, opts ...grpc.CallOption) (Plugin_DevicesClient, error) + // Read returns the reading data for the specified device. + Read(ctx context.Context, in *DeviceFilter, opts ...grpc.CallOption) (Plugin_ReadClient, error) + // Write issues an asynchronous write command to the specified device. + Write(ctx context.Context, in *WriteInfo, opts ...grpc.CallOption) (*Transactions, error) + // Transactiong gets the state/status of an asynchronous write transaction. + Transaction(ctx context.Context, in *TransactionFilter, opts ...grpc.CallOption) (Plugin_TransactionClient, error) +} + +type pluginClient struct { + cc *grpc.ClientConn +} -type InternalApiClient interface { - // Read from the specified device(s). - Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (InternalApi_ReadClient, error) - // Write to the specified device(s). - Write(ctx context.Context, in *WriteRequest, opts ...grpc.CallOption) (*Transactions, error) - // Get the metainformation from the background process that describes - // all of the available devices which that process owns - Metainfo(ctx context.Context, in *MetainfoRequest, opts ...grpc.CallOption) (InternalApi_MetainfoClient, error) - // Check on the state of a write transaction. - TransactionCheck(ctx context.Context, in *TransactionId, opts ...grpc.CallOption) (*WriteResponse, error) +func NewPluginClient(cc *grpc.ClientConn) PluginClient { + return &pluginClient{cc} } -type internalApiClient struct { - cc *grpc.ClientConn +func (c *pluginClient) Test(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Status, error) { + out := new(Status) + err := grpc.Invoke(ctx, "/synse.Plugin/Test", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *pluginClient) Version(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*VersionInfo, error) { + out := new(VersionInfo) + err := grpc.Invoke(ctx, "/synse.Plugin/Version", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil } -func NewInternalApiClient(cc *grpc.ClientConn) InternalApiClient { - return &internalApiClient{cc} +func (c *pluginClient) Health(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*PluginHealth, error) { + out := new(PluginHealth) + err := grpc.Invoke(ctx, "/synse.Plugin/Health", in, out, c.cc, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (c *internalApiClient) Read(ctx context.Context, in *ReadRequest, opts ...grpc.CallOption) (InternalApi_ReadClient, error) { - stream, err := grpc.NewClientStream(ctx, &_InternalApi_serviceDesc.Streams[0], c.cc, "/synse.InternalApi/Read", opts...) +func (c *pluginClient) Metainfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Metadata, error) { + out := new(Metadata) + err := grpc.Invoke(ctx, "/synse.Plugin/Metainfo", in, out, c.cc, opts...) if err != nil { return nil, err } - x := &internalApiReadClient{stream} + return out, nil +} + +func (c *pluginClient) Capabilities(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Plugin_CapabilitiesClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Plugin_serviceDesc.Streams[0], c.cc, "/synse.Plugin/Capabilities", opts...) + if err != nil { + return nil, err + } + x := &pluginCapabilitiesClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -734,38 +1262,61 @@ func (c *internalApiClient) Read(ctx context.Context, in *ReadRequest, opts ...g return x, nil } -type InternalApi_ReadClient interface { - Recv() (*ReadResponse, error) +type Plugin_CapabilitiesClient interface { + Recv() (*DeviceCapability, error) grpc.ClientStream } -type internalApiReadClient struct { +type pluginCapabilitiesClient struct { grpc.ClientStream } -func (x *internalApiReadClient) Recv() (*ReadResponse, error) { - m := new(ReadResponse) +func (x *pluginCapabilitiesClient) Recv() (*DeviceCapability, error) { + m := new(DeviceCapability) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } -func (c *internalApiClient) Write(ctx context.Context, in *WriteRequest, opts ...grpc.CallOption) (*Transactions, error) { - out := new(Transactions) - err := grpc.Invoke(ctx, "/synse.InternalApi/Write", in, out, c.cc, opts...) +func (c *pluginClient) Devices(ctx context.Context, in *DeviceFilter, opts ...grpc.CallOption) (Plugin_DevicesClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Plugin_serviceDesc.Streams[1], c.cc, "/synse.Plugin/Devices", opts...) if err != nil { return nil, err } - return out, nil + x := &pluginDevicesClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Plugin_DevicesClient interface { + Recv() (*Device, error) + grpc.ClientStream } -func (c *internalApiClient) Metainfo(ctx context.Context, in *MetainfoRequest, opts ...grpc.CallOption) (InternalApi_MetainfoClient, error) { - stream, err := grpc.NewClientStream(ctx, &_InternalApi_serviceDesc.Streams[1], c.cc, "/synse.InternalApi/Metainfo", opts...) +type pluginDevicesClient struct { + grpc.ClientStream +} + +func (x *pluginDevicesClient) Recv() (*Device, error) { + m := new(Device) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *pluginClient) Read(ctx context.Context, in *DeviceFilter, opts ...grpc.CallOption) (Plugin_ReadClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Plugin_serviceDesc.Streams[2], c.cc, "/synse.Plugin/Read", opts...) if err != nil { return nil, err } - x := &internalApiMetainfoClient{stream} + x := &pluginReadClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -775,150 +1326,316 @@ func (c *internalApiClient) Metainfo(ctx context.Context, in *MetainfoRequest, o return x, nil } -type InternalApi_MetainfoClient interface { - Recv() (*MetainfoResponse, error) +type Plugin_ReadClient interface { + Recv() (*Reading, error) grpc.ClientStream } -type internalApiMetainfoClient struct { +type pluginReadClient struct { grpc.ClientStream } -func (x *internalApiMetainfoClient) Recv() (*MetainfoResponse, error) { - m := new(MetainfoResponse) +func (x *pluginReadClient) Recv() (*Reading, error) { + m := new(Reading) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } -func (c *internalApiClient) TransactionCheck(ctx context.Context, in *TransactionId, opts ...grpc.CallOption) (*WriteResponse, error) { - out := new(WriteResponse) - err := grpc.Invoke(ctx, "/synse.InternalApi/TransactionCheck", in, out, c.cc, opts...) +func (c *pluginClient) Write(ctx context.Context, in *WriteInfo, opts ...grpc.CallOption) (*Transactions, error) { + out := new(Transactions) + err := grpc.Invoke(ctx, "/synse.Plugin/Write", in, out, c.cc, opts...) if err != nil { return nil, err } return out, nil } -// Server API for InternalApi service +func (c *pluginClient) Transaction(ctx context.Context, in *TransactionFilter, opts ...grpc.CallOption) (Plugin_TransactionClient, error) { + stream, err := grpc.NewClientStream(ctx, &_Plugin_serviceDesc.Streams[3], c.cc, "/synse.Plugin/Transaction", opts...) + if err != nil { + return nil, err + } + x := &pluginTransactionClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} -type InternalApiServer interface { - // Read from the specified device(s). - Read(*ReadRequest, InternalApi_ReadServer) error - // Write to the specified device(s). - Write(context.Context, *WriteRequest) (*Transactions, error) - // Get the metainformation from the background process that describes - // all of the available devices which that process owns - Metainfo(*MetainfoRequest, InternalApi_MetainfoServer) error - // Check on the state of a write transaction. - TransactionCheck(context.Context, *TransactionId) (*WriteResponse, error) +type Plugin_TransactionClient interface { + Recv() (*WriteResponse, error) + grpc.ClientStream } -func RegisterInternalApiServer(s *grpc.Server, srv InternalApiServer) { - s.RegisterService(&_InternalApi_serviceDesc, srv) +type pluginTransactionClient struct { + grpc.ClientStream } -func _InternalApi_Read_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ReadRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func (x *pluginTransactionClient) Recv() (*WriteResponse, error) { + m := new(WriteResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err } - return srv.(InternalApiServer).Read(m, &internalApiReadServer{stream}) + return m, nil } -type InternalApi_ReadServer interface { - Send(*ReadResponse) error - grpc.ServerStream +// Server API for Plugin service + +type PluginServer interface { + // Test returns the status of the plugin. This call is intended to + // be used in order to check if a plugin is reachable. The status + // returned here designates plugin reachability, not plugin health. + Test(context.Context, *Empty) (*Status, error) + // Version returns the version info for the plugin. This is not used + // by Synse Server, but can be used by the CLI/manual plugin interaction. + Version(context.Context, *Empty) (*VersionInfo, error) + // Health returns the health status of a plugin. + Health(context.Context, *Empty) (*PluginHealth, error) + // Metainfo gets the metainfo for the plugin. This info provides details + // about the plugin itself. + Metainfo(context.Context, *Empty) (*Metadata, error) + // Capabilities returns the collection of capabilities that a plugin + // exposes. More specifically, this means types of devices supported + // and the readings supported for each of those devices. + Capabilities(*Empty, Plugin_CapabilitiesServer) error + // Devices gets info for all of the devices that the plugin manages. + // This rpc call is the plugin's equivalent to a Synse Server scan. + Devices(*DeviceFilter, Plugin_DevicesServer) error + // Read returns the reading data for the specified device. + Read(*DeviceFilter, Plugin_ReadServer) error + // Write issues an asynchronous write command to the specified device. + Write(context.Context, *WriteInfo) (*Transactions, error) + // Transactiong gets the state/status of an asynchronous write transaction. + Transaction(*TransactionFilter, Plugin_TransactionServer) error +} + +func RegisterPluginServer(s *grpc.Server, srv PluginServer) { + s.RegisterService(&_Plugin_serviceDesc, srv) +} + +func _Plugin_Test_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PluginServer).Test(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/synse.Plugin/Test", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PluginServer).Test(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) } -type internalApiReadServer struct { - grpc.ServerStream +func _Plugin_Version_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PluginServer).Version(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/synse.Plugin/Version", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PluginServer).Version(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) } -func (x *internalApiReadServer) Send(m *ReadResponse) error { - return x.ServerStream.SendMsg(m) +func _Plugin_Health_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PluginServer).Health(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/synse.Plugin/Health", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PluginServer).Health(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) } -func _InternalApi_Write_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WriteRequest) +func _Plugin_Metainfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(InternalApiServer).Write(ctx, in) + return srv.(PluginServer).Metainfo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/synse.InternalApi/Write", + FullMethod: "/synse.Plugin/Metainfo", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(InternalApiServer).Write(ctx, req.(*WriteRequest)) + return srv.(PluginServer).Metainfo(ctx, req.(*Empty)) } return interceptor(ctx, in, info, handler) } -func _InternalApi_Metainfo_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(MetainfoRequest) +func _Plugin_Capabilities_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(Empty) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(PluginServer).Capabilities(m, &pluginCapabilitiesServer{stream}) +} + +type Plugin_CapabilitiesServer interface { + Send(*DeviceCapability) error + grpc.ServerStream +} + +type pluginCapabilitiesServer struct { + grpc.ServerStream +} + +func (x *pluginCapabilitiesServer) Send(m *DeviceCapability) error { + return x.ServerStream.SendMsg(m) +} + +func _Plugin_Devices_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(DeviceFilter) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(PluginServer).Devices(m, &pluginDevicesServer{stream}) +} + +type Plugin_DevicesServer interface { + Send(*Device) error + grpc.ServerStream +} + +type pluginDevicesServer struct { + grpc.ServerStream +} + +func (x *pluginDevicesServer) Send(m *Device) error { + return x.ServerStream.SendMsg(m) +} + +func _Plugin_Read_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(DeviceFilter) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(InternalApiServer).Metainfo(m, &internalApiMetainfoServer{stream}) + return srv.(PluginServer).Read(m, &pluginReadServer{stream}) } -type InternalApi_MetainfoServer interface { - Send(*MetainfoResponse) error +type Plugin_ReadServer interface { + Send(*Reading) error grpc.ServerStream } -type internalApiMetainfoServer struct { +type pluginReadServer struct { grpc.ServerStream } -func (x *internalApiMetainfoServer) Send(m *MetainfoResponse) error { +func (x *pluginReadServer) Send(m *Reading) error { return x.ServerStream.SendMsg(m) } -func _InternalApi_TransactionCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TransactionId) +func _Plugin_Write_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteInfo) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(InternalApiServer).TransactionCheck(ctx, in) + return srv.(PluginServer).Write(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/synse.InternalApi/TransactionCheck", + FullMethod: "/synse.Plugin/Write", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(InternalApiServer).TransactionCheck(ctx, req.(*TransactionId)) + return srv.(PluginServer).Write(ctx, req.(*WriteInfo)) } return interceptor(ctx, in, info, handler) } -var _InternalApi_serviceDesc = grpc.ServiceDesc{ - ServiceName: "synse.InternalApi", - HandlerType: (*InternalApiServer)(nil), +func _Plugin_Transaction_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TransactionFilter) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(PluginServer).Transaction(m, &pluginTransactionServer{stream}) +} + +type Plugin_TransactionServer interface { + Send(*WriteResponse) error + grpc.ServerStream +} + +type pluginTransactionServer struct { + grpc.ServerStream +} + +func (x *pluginTransactionServer) Send(m *WriteResponse) error { + return x.ServerStream.SendMsg(m) +} + +var _Plugin_serviceDesc = grpc.ServiceDesc{ + ServiceName: "synse.Plugin", + HandlerType: (*PluginServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "Write", - Handler: _InternalApi_Write_Handler, + MethodName: "Test", + Handler: _Plugin_Test_Handler, + }, + { + MethodName: "Version", + Handler: _Plugin_Version_Handler, + }, + { + MethodName: "Health", + Handler: _Plugin_Health_Handler, + }, + { + MethodName: "Metainfo", + Handler: _Plugin_Metainfo_Handler, }, { - MethodName: "TransactionCheck", - Handler: _InternalApi_TransactionCheck_Handler, + MethodName: "Write", + Handler: _Plugin_Write_Handler, }, }, Streams: []grpc.StreamDesc{ + { + StreamName: "Capabilities", + Handler: _Plugin_Capabilities_Handler, + ServerStreams: true, + }, + { + StreamName: "Devices", + Handler: _Plugin_Devices_Handler, + ServerStreams: true, + }, { StreamName: "Read", - Handler: _InternalApi_Read_Handler, + Handler: _Plugin_Read_Handler, ServerStreams: true, }, { - StreamName: "Metainfo", - Handler: _InternalApi_Metainfo_Handler, + StreamName: "Transaction", + Handler: _Plugin_Transaction_Handler, ServerStreams: true, }, }, @@ -928,56 +1645,87 @@ var _InternalApi_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("synse.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 814 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x55, 0xdd, 0x6f, 0xe3, 0x44, - 0x10, 0x8f, 0x9d, 0x38, 0x4d, 0xc6, 0xb9, 0xe0, 0xdb, 0x1e, 0x87, 0x15, 0x4e, 0x6a, 0xb5, 0x02, - 0x74, 0x27, 0xa1, 0x03, 0xa5, 0xaa, 0x54, 0x01, 0xe2, 0x43, 0x34, 0x42, 0xd1, 0x41, 0x02, 0x4b, - 0x8f, 0x3e, 0xa2, 0xad, 0xbd, 0x57, 0xac, 0xc6, 0x1f, 0xd8, 0xeb, 0xd2, 0xfc, 0x4f, 0x48, 0xbc, - 0x20, 0xfe, 0x38, 0x9e, 0xd0, 0x8c, 0xd7, 0xc9, 0x46, 0xa9, 0x50, 0x1f, 0xee, 0x6d, 0x7e, 0xf3, - 0xb1, 0xbf, 0x9d, 0xdf, 0x8e, 0xc7, 0xe0, 0x57, 0xeb, 0xac, 0x52, 0x2f, 0x8b, 0x32, 0xd7, 0x39, - 0xf3, 0x08, 0xf0, 0x25, 0xf8, 0x42, 0xc9, 0x58, 0xa8, 0xdf, 0x6b, 0x55, 0x69, 0xf6, 0x14, 0xfa, - 0xb1, 0xba, 0x4d, 0x22, 0x15, 0x3a, 0xc7, 0xce, 0xf3, 0xa1, 0x30, 0x88, 0x3d, 0x01, 0xef, 0x2a, - 0x97, 0x65, 0x1c, 0xba, 0xe4, 0x6e, 0x00, 0x63, 0xd0, 0x2b, 0x65, 0x74, 0x13, 0x76, 0xc9, 0x49, - 0x36, 0xbf, 0x85, 0xd1, 0x65, 0x99, 0x68, 0xf5, 0xd6, 0x4e, 0x64, 0x1f, 0x40, 0x2f, 0x96, 0x5a, - 0x86, 0xbd, 0xe3, 0xee, 0x73, 0x7f, 0x1a, 0xbc, 0x6c, 0xba, 0x20, 0x92, 0x73, 0xa9, 0xa5, 0xa0, - 0x28, 0xff, 0x1c, 0xde, 0xf9, 0x41, 0x69, 0x99, 0x64, 0x6f, 0xf2, 0x96, 0xba, 0x3d, 0xcc, 0xb1, - 0x0e, 0xbb, 0x97, 0x96, 0x1f, 0xc1, 0xa3, 0x8b, 0x52, 0x66, 0x95, 0x8c, 0x74, 0x92, 0x67, 0xf3, - 0x98, 0x8d, 0xc1, 0x4d, 0x62, 0x53, 0xe8, 0x26, 0x31, 0xff, 0x05, 0x46, 0x8d, 0x4c, 0x55, 0x91, - 0x67, 0x95, 0x62, 0xcf, 0x60, 0xa8, 0x93, 0x54, 0x55, 0x5a, 0xa6, 0x85, 0x49, 0xdb, 0x3a, 0x90, - 0x58, 0xaf, 0x0b, 0x65, 0x38, 0xc8, 0x46, 0xe2, 0x5b, 0xb9, 0xaa, 0x95, 0x69, 0xad, 0x01, 0xfc, - 0x4f, 0x07, 0x46, 0x16, 0x73, 0xc5, 0xe6, 0x30, 0xd2, 0x16, 0x0e, 0x1d, 0x6a, 0xfa, 0x43, 0xd3, - 0xb4, 0x9d, 0xba, 0x03, 0x66, 0x99, 0x2e, 0xd7, 0x62, 0xa7, 0x74, 0xf2, 0x13, 0x3c, 0xde, 0x4b, - 0x61, 0x01, 0x74, 0x6f, 0xd4, 0xda, 0x5c, 0x19, 0x4d, 0xf6, 0x51, 0x7b, 0x31, 0xbc, 0xed, 0x7d, - 0xfa, 0x36, 0xe1, 0xcf, 0xdc, 0x33, 0x87, 0xff, 0xe3, 0x42, 0xb0, 0x55, 0xf9, 0x41, 0x5a, 0x04, - 0xd0, 0xad, 0x93, 0x56, 0x6e, 0x34, 0x37, 0xea, 0x74, 0x77, 0xd5, 0x49, 0xf3, 0x58, 0xad, 0xc2, - 0x5e, 0xa3, 0x0e, 0x01, 0xc6, 0x61, 0x94, 0xca, 0xac, 0x7e, 0x23, 0x23, 0x5d, 0x97, 0xaa, 0x0c, - 0x3d, 0x0a, 0xee, 0xf8, 0xd8, 0x04, 0x06, 0x34, 0xd0, 0x51, 0xbe, 0x0a, 0xfb, 0x14, 0xdf, 0x60, - 0x64, 0xc2, 0x9b, 0x86, 0x07, 0x0d, 0x13, 0xda, 0x2c, 0x84, 0x83, 0x28, 0x4f, 0x53, 0x95, 0xe9, - 0x70, 0x40, 0xee, 0x16, 0xb2, 0x4f, 0x60, 0xb0, 0xca, 0x23, 0x89, 0x62, 0x85, 0x43, 0xd2, 0xe2, - 0xd0, 0x68, 0x81, 0x2d, 0x7f, 0x6f, 0x42, 0x62, 0x93, 0xc4, 0x5e, 0x40, 0x3f, 0xaf, 0x75, 0x51, - 0xeb, 0x10, 0xe8, 0x95, 0x1e, 0x5b, 0xe9, 0x4b, 0x0a, 0x08, 0x93, 0xc0, 0xff, 0x72, 0xe1, 0x91, - 0xf9, 0x2c, 0x8c, 0x6a, 0x78, 0x8f, 0x52, 0x49, 0xad, 0xda, 0x31, 0x6b, 0x21, 0x46, 0xea, 0x22, - 0xa6, 0x48, 0xa3, 0x5a, 0x0b, 0xd9, 0x19, 0xf4, 0x2b, 0x2d, 0x75, 0x5d, 0x91, 0x76, 0xe3, 0xe9, - 0xb1, 0xfd, 0x56, 0xed, 0xc9, 0x0d, 0xfa, 0x99, 0xf2, 0x84, 0xc9, 0x67, 0xa7, 0xe0, 0xa1, 0xa5, - 0x48, 0xdf, 0xf1, 0xf4, 0xe8, 0xff, 0x0b, 0x95, 0x68, 0xb2, 0xf1, 0x2a, 0xa9, 0xaa, 0x2a, 0x79, - 0xad, 0x8c, 0xf6, 0x2d, 0xe4, 0x5f, 0x82, 0x6f, 0xf1, 0x30, 0x1f, 0x0e, 0x5e, 0x2f, 0x5e, 0x2d, - 0x96, 0x97, 0x8b, 0xa0, 0x83, 0xe0, 0xc7, 0xd9, 0xe2, 0x7c, 0xbe, 0xf8, 0x2e, 0x70, 0x10, 0x5c, - 0x8a, 0xf9, 0x05, 0x02, 0x97, 0x0d, 0xa0, 0x77, 0xbe, 0x5c, 0xcc, 0x82, 0x2e, 0x3f, 0x02, 0xd8, - 0xd2, 0xb1, 0x3e, 0xb8, 0xcb, 0x57, 0x41, 0x87, 0x0d, 0xc1, 0x9b, 0x09, 0xb1, 0x14, 0x81, 0xc3, - 0x4f, 0x61, 0xb8, 0x19, 0x41, 0x1c, 0xa2, 0x52, 0xfe, 0x41, 0x1f, 0xc3, 0x48, 0xa0, 0x89, 0x6b, - 0xa5, 0x99, 0x6b, 0xa3, 0x91, 0x41, 0xfc, 0x0b, 0x18, 0x6f, 0xe5, 0x7f, 0x9d, 0x25, 0xb4, 0x05, - 0x32, 0x99, 0xb6, 0xeb, 0x87, 0x6c, 0xac, 0xae, 0xd6, 0xe9, 0x55, 0xbe, 0x6a, 0xab, 0x1b, 0xc4, - 0x4f, 0x9b, 0x25, 0x62, 0x1e, 0x4f, 0x66, 0xd7, 0x0a, 0xa9, 0xd3, 0x24, 0xa3, 0x6a, 0x4f, 0xa0, - 0x49, 0x1e, 0x79, 0x47, 0x95, 0xe8, 0x91, 0x77, 0xfc, 0x6f, 0x07, 0x60, 0x5b, 0xb7, 0x19, 0x70, - 0xc7, 0x1a, 0xf0, 0xf7, 0x61, 0x88, 0x6b, 0xea, 0x57, 0x6b, 0x2f, 0x0c, 0xd0, 0x71, 0x81, 0xc1, - 0x67, 0x30, 0x2c, 0x4a, 0x15, 0x25, 0x15, 0xf6, 0xd3, 0xa5, 0x73, 0xb7, 0x0e, 0xf6, 0x02, 0x7a, - 0x75, 0x96, 0x68, 0x7a, 0x3a, 0x7f, 0xfa, 0xee, 0xde, 0x90, 0x61, 0x97, 0x82, 0x52, 0xd8, 0xc7, - 0xe0, 0x95, 0x78, 0x6b, 0x7a, 0x2d, 0x7f, 0xfa, 0x74, 0x7f, 0x20, 0x31, 0x2a, 0x9a, 0x24, 0x7e, - 0x06, 0x23, 0x7b, 0xb2, 0x1f, 0xbe, 0x2f, 0xa7, 0xff, 0x3a, 0xe0, 0xcf, 0x33, 0xad, 0xca, 0x4c, - 0xae, 0xbe, 0x29, 0x12, 0x76, 0x02, 0x3d, 0x5c, 0x8f, 0x8c, 0x19, 0x42, 0xeb, 0x97, 0x32, 0x39, - 0xdc, 0xf1, 0x35, 0xa3, 0xc6, 0x3b, 0x9f, 0x3a, 0xec, 0x04, 0x3c, 0x7a, 0x61, 0x76, 0xb8, 0x3b, - 0x8d, 0xbb, 0x65, 0xf6, 0x0a, 0xe3, 0x1d, 0xf6, 0x15, 0x0c, 0xda, 0x05, 0xc4, 0xec, 0xf6, 0xac, - 0xbd, 0x3f, 0x79, 0x6f, 0xcf, 0x6f, 0xb1, 0x7e, 0x0d, 0x81, 0x75, 0xe4, 0xb7, 0xbf, 0x29, 0x6c, - 0x72, 0x9f, 0x6b, 0x1e, 0x4f, 0x9e, 0xdc, 0xf7, 0x91, 0xf0, 0xce, 0x55, 0x9f, 0xf6, 0xcb, 0xc9, - 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x2a, 0x97, 0xd3, 0xe4, 0x4f, 0x07, 0x00, 0x00, + // 1303 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x57, 0x5f, 0x6f, 0x1b, 0x45, + 0x10, 0xf7, 0xd9, 0xe7, 0xb3, 0x3d, 0x77, 0x0e, 0x66, 0x5b, 0x15, 0x2b, 0x54, 0xc4, 0x5c, 0x1b, + 0x64, 0xf1, 0x27, 0x14, 0xb7, 0xb4, 0x05, 0x24, 0x44, 0x5a, 0xbb, 0x4d, 0xd4, 0x90, 0x84, 0x25, + 0x6d, 0xc5, 0x53, 0xb5, 0x3e, 0x6f, 0xdd, 0x25, 0xf6, 0x9d, 0x75, 0xbb, 0x8e, 0xe4, 0x0f, 0xc2, + 0x07, 0xe0, 0x9d, 0x27, 0xbe, 0x00, 0x88, 0x57, 0x24, 0xc4, 0x47, 0x42, 0xbb, 0x3b, 0x77, 0xbe, + 0x0b, 0x86, 0x22, 0xde, 0x76, 0x7e, 0xfb, 0x9b, 0x9d, 0x3f, 0x3b, 0x3b, 0x73, 0x07, 0xbe, 0x5c, + 0xc5, 0x92, 0xef, 0x2d, 0xd2, 0x44, 0x25, 0xa4, 0x6e, 0x84, 0xf0, 0x14, 0x82, 0x21, 0xbf, 0x10, + 0x11, 0x7f, 0x24, 0x66, 0x8a, 0xa7, 0x84, 0x80, 0x9b, 0xb2, 0xe8, 0xbc, 0xeb, 0xf4, 0x9c, 0x7e, + 0x8b, 0x9a, 0x35, 0xb9, 0x0a, 0xf5, 0x71, 0xc2, 0xd2, 0x49, 0xb7, 0x6a, 0x40, 0x2b, 0x90, 0x6b, + 0xe0, 0x4d, 0x8c, 0x66, 0xb7, 0x66, 0x60, 0x94, 0xc2, 0x06, 0xd4, 0x47, 0xf3, 0x85, 0x5a, 0x85, + 0x5d, 0xf0, 0xbe, 0x55, 0x4c, 0x2d, 0x25, 0xd9, 0x82, 0x6a, 0x62, 0x8f, 0x6c, 0xd2, 0x6a, 0x72, + 0x1e, 0xfe, 0xe9, 0x40, 0x70, 0x3a, 0x5b, 0x4e, 0x45, 0x7c, 0xc0, 0xd9, 0x4c, 0xbd, 0x22, 0xd7, + 0xa1, 0xa5, 0xc4, 0x9c, 0x4b, 0xc5, 0xe6, 0x0b, 0x34, 0xbd, 0x06, 0xc8, 0x00, 0x3c, 0x69, 0x0e, + 0x32, 0x0e, 0x6c, 0x0d, 0xb6, 0xf7, 0x6c, 0x20, 0xc5, 0x23, 0xf6, 0xac, 0x29, 0x8a, 0x4c, 0xf2, + 0x3e, 0x78, 0xd1, 0x2b, 0x1e, 0x9d, 0xcb, 0x6e, 0xad, 0x57, 0xeb, 0xfb, 0x03, 0x82, 0x3a, 0x96, + 0xfd, 0x50, 0x6f, 0x51, 0x64, 0x84, 0x0f, 0x72, 0x47, 0x7d, 0x68, 0x3c, 0x3d, 0x7e, 0x72, 0x7c, + 0xf2, 0xfc, 0xb8, 0x53, 0x21, 0x1e, 0x54, 0x4f, 0x9e, 0x74, 0x1c, 0x72, 0x0d, 0xc8, 0xe9, 0x3e, + 0x3d, 0x3b, 0xdc, 0x3f, 0x3a, 0xfa, 0xee, 0xc5, 0x70, 0xf4, 0x98, 0xee, 0x0f, 0x47, 0xc3, 0x4e, + 0x4d, 0x93, 0x1f, 0xed, 0x1f, 0x1e, 0x1d, 0x1e, 0x3f, 0xee, 0xb8, 0xe1, 0x8f, 0x0e, 0xf8, 0x85, + 0xb3, 0x75, 0x1e, 0x63, 0x36, 0xe7, 0x59, 0x1e, 0xf5, 0xfa, 0x7f, 0xc5, 0xd1, 0x85, 0xc6, 0x9c, + 0x4b, 0xc9, 0xa6, 0x59, 0x9a, 0x33, 0xb1, 0x9c, 0x33, 0xf7, 0x72, 0xce, 0x08, 0xb8, 0x6a, 0xb5, + 0xe0, 0xdd, 0xba, 0xb5, 0xaf, 0xd7, 0xe1, 0x57, 0xd0, 0xb1, 0x77, 0xfd, 0x90, 0x2d, 0xd8, 0x58, + 0xcc, 0x84, 0x5a, 0x69, 0xde, 0xb9, 0x88, 0x27, 0x99, 0x9f, 0x7a, 0xad, 0x6d, 0x26, 0x4b, 0xb5, + 0x58, 0x2a, 0xed, 0x68, 0x4d, 0xdb, 0x44, 0x31, 0xfc, 0xd9, 0x81, 0xe6, 0xd7, 0x5c, 0xb1, 0x09, + 0x53, 0x6c, 0x63, 0x88, 0xef, 0x00, 0xcc, 0x99, 0x88, 0x15, 0x13, 0x31, 0x4f, 0xb1, 0x5e, 0x0a, + 0x08, 0xe9, 0x40, 0x4d, 0xb1, 0x29, 0x86, 0xa2, 0x97, 0xa4, 0x07, 0xfe, 0x84, 0xcb, 0x28, 0x15, + 0x0b, 0x25, 0x92, 0x18, 0x03, 0x29, 0x42, 0x5a, 0xe7, 0x22, 0x92, 0x18, 0x89, 0x5e, 0x92, 0x0f, + 0xa1, 0x71, 0xc1, 0x53, 0xa9, 0xf9, 0x5e, 0xcf, 0x29, 0xdc, 0xee, 0x33, 0x8b, 0x1e, 0xc6, 0x2f, + 0x13, 0x9a, 0x51, 0xc2, 0xdf, 0x1d, 0xf0, 0x0b, 0x1b, 0xe4, 0x26, 0xb4, 0x17, 0x26, 0xe3, 0x08, + 0x62, 0x00, 0x65, 0x50, 0x47, 0x22, 0x27, 0xe7, 0x19, 0x05, 0x23, 0x59, 0x23, 0x3a, 0xfd, 0xe3, + 0xa5, 0x98, 0x4d, 0x86, 0x4c, 0x65, 0x57, 0xb3, 0x06, 0xf4, 0xee, 0x54, 0xa8, 0x87, 0xc9, 0x7c, + 0x2e, 0x54, 0x76, 0x39, 0x39, 0xa0, 0x9f, 0xce, 0x54, 0xa8, 0x33, 0x36, 0xc5, 0xa0, 0x50, 0xd2, + 0x19, 0x65, 0x69, 0xf4, 0xca, 0x04, 0xd5, 0xa2, 0x66, 0x6d, 0xde, 0x8e, 0xec, 0x36, 0x0c, 0x52, + 0x4d, 0x64, 0xf8, 0x6b, 0x0d, 0x1a, 0x94, 0xb3, 0x89, 0x88, 0xa7, 0xaf, 0x79, 0x36, 0x59, 0x09, + 0x54, 0xd7, 0x25, 0xa0, 0x31, 0x11, 0xbf, 0x4c, 0xd0, 0x61, 0xb3, 0x26, 0x3b, 0xe0, 0x2e, 0x63, + 0x74, 0xd3, 0x1f, 0xf8, 0x98, 0xca, 0xa7, 0xb1, 0x50, 0xd4, 0x6c, 0x90, 0x1b, 0x10, 0x48, 0x95, + 0x8a, 0x78, 0xfa, 0xe2, 0x82, 0xcd, 0x96, 0x58, 0x53, 0x07, 0x15, 0xea, 0x5b, 0xf4, 0x99, 0x06, + 0xc9, 0x0e, 0xc0, 0x38, 0x49, 0x66, 0x48, 0xd1, 0x11, 0x34, 0x0f, 0x2a, 0xb4, 0xa5, 0x31, 0x4b, + 0xd8, 0x85, 0xf6, 0xcb, 0x59, 0xc2, 0xd4, 0xed, 0x01, 0x72, 0x74, 0x4c, 0xd5, 0x83, 0x0a, 0x0d, + 0x10, 0x2e, 0xd3, 0xee, 0xde, 0x41, 0x5a, 0xb3, 0xe7, 0xf4, 0x9d, 0x9c, 0x76, 0xf7, 0x8e, 0xa5, + 0xbd, 0x0b, 0xbe, 0x88, 0xd7, 0x67, 0xb5, 0x7a, 0x4e, 0xbf, 0x7e, 0x50, 0xa1, 0x60, 0xc0, 0x22, + 0x25, 0x3f, 0x07, 0x7a, 0x4e, 0xbf, 0x86, 0x94, 0xc2, 0x29, 0xe3, 0x95, 0xe2, 0x12, 0x29, 0x7e, + 0xcf, 0xe9, 0x07, 0x9a, 0x62, 0x40, 0x4b, 0xb9, 0x01, 0xc1, 0xb2, 0x68, 0x29, 0xe8, 0x39, 0xfd, + 0xb6, 0x0e, 0x7e, 0x59, 0x30, 0x85, 0xa4, 0xdc, 0x56, 0xbb, 0xe7, 0xf4, 0xdd, 0x8c, 0x84, 0xc6, + 0x1e, 0x34, 0xa0, 0x6e, 0x76, 0xc3, 0xef, 0xa1, 0xf5, 0x3c, 0x15, 0x8a, 0x9b, 0x6a, 0xbc, 0x07, + 0xc1, 0xa4, 0xd0, 0x80, 0xcd, 0x35, 0xfa, 0x83, 0x2b, 0x78, 0x0b, 0xc5, 0xde, 0x4c, 0x4b, 0x44, + 0x72, 0x13, 0x5c, 0xfd, 0x0c, 0xcd, 0x13, 0xf5, 0x07, 0x1d, 0x54, 0x30, 0x07, 0x0f, 0x99, 0x62, + 0xd4, 0xec, 0x86, 0xf7, 0xd0, 0x96, 0x86, 0x74, 0xdd, 0xb1, 0x48, 0xad, 0x4b, 0x1e, 0x25, 0x5d, + 0x15, 0x78, 0x94, 0xd3, 0x0f, 0x50, 0xf1, 0x97, 0x2a, 0xb4, 0x8d, 0x26, 0xe5, 0x72, 0x91, 0xc4, + 0x92, 0xeb, 0x4a, 0x14, 0x59, 0xa3, 0xa8, 0x0a, 0xd3, 0x26, 0xa2, 0x94, 0x33, 0xc5, 0xb3, 0xc1, + 0x90, 0x89, 0x7a, 0x67, 0xb9, 0x98, 0x98, 0x1d, 0x6c, 0x5a, 0x28, 0x92, 0xfb, 0x79, 0x0b, 0x74, + 0x4d, 0x0b, 0xec, 0x15, 0xdd, 0xce, 0x2c, 0x59, 0xe9, 0x52, 0x23, 0xfc, 0x14, 0xea, 0x7a, 0x65, + 0xab, 0x6f, 0x6b, 0xb0, 0xf3, 0xef, 0x8a, 0x9c, 0x5a, 0x76, 0xb1, 0x7f, 0x7a, 0xa5, 0xfe, 0x19, + 0x7e, 0x09, 0x7e, 0xc1, 0x4e, 0xb9, 0xf5, 0xfb, 0xd0, 0x38, 0x1d, 0x1d, 0x0f, 0x75, 0x6b, 0x77, + 0xb4, 0xf0, 0x9c, 0x1e, 0x9e, 0x69, 0xa1, 0x4a, 0x9a, 0xe0, 0x0e, 0x4f, 0x8e, 0x47, 0x9d, 0x5a, + 0xb8, 0x03, 0xb0, 0x36, 0x87, 0xc3, 0xa2, 0x42, 0x5a, 0x50, 0x1f, 0x51, 0x7a, 0x42, 0x3b, 0x4e, + 0x78, 0x03, 0xde, 0x3c, 0x4b, 0x59, 0x2c, 0x6d, 0x92, 0xf1, 0xd6, 0x2e, 0x25, 0x31, 0xfc, 0xc9, + 0x81, 0xa0, 0xc0, 0x92, 0xe4, 0x10, 0x02, 0x55, 0x90, 0xbb, 0x8e, 0xb9, 0xde, 0x5d, 0x0c, 0xb7, + 0x48, 0x2d, 0x09, 0xa3, 0x58, 0xa5, 0x2b, 0x5a, 0x52, 0xdd, 0xfe, 0xa6, 0xe4, 0x80, 0xa5, 0xe8, + 0x6e, 0x7a, 0xce, 0x57, 0xe8, 0x81, 0x5e, 0x92, 0xf7, 0xb0, 0x2e, 0xcd, 0x2d, 0x6e, 0xaa, 0x24, + 0xbb, 0xfd, 0x79, 0xf5, 0xbe, 0x13, 0xfe, 0x56, 0x05, 0xcf, 0xd6, 0xe4, 0x6b, 0x9a, 0x4f, 0x07, + 0x6a, 0x4b, 0x91, 0x15, 0x86, 0x5e, 0xe6, 0x93, 0xa6, 0x56, 0x98, 0x34, 0xf7, 0xa0, 0x39, 0xc7, + 0x71, 0xd2, 0x75, 0x4d, 0xa0, 0x6f, 0x97, 0x0a, 0x7f, 0x2f, 0x1b, 0x36, 0x36, 0xbc, 0x9c, 0xac, + 0x2b, 0xd9, 0xb6, 0xeb, 0xac, 0x83, 0x5a, 0x29, 0xef, 0x6f, 0x5e, 0xa1, 0xbf, 0x7d, 0x00, 0xcd, + 0x59, 0x12, 0x31, 0x53, 0xf7, 0x0d, 0x13, 0xe2, 0x1b, 0x68, 0xe4, 0x08, 0x61, 0x9a, 0x13, 0xc8, + 0x2e, 0x78, 0x76, 0xd8, 0x75, 0x9b, 0xc6, 0x9f, 0x36, 0x52, 0x4f, 0x0c, 0x48, 0x71, 0x73, 0xfb, + 0x0b, 0x68, 0x97, 0x5c, 0xdb, 0x90, 0xd6, 0xab, 0xc5, 0xb4, 0xb6, 0x8a, 0x49, 0xbc, 0x03, 0xcd, + 0xcc, 0xf2, 0x7f, 0xff, 0xde, 0x0a, 0x7f, 0x70, 0xc0, 0xb3, 0x5e, 0x6c, 0x9c, 0xbc, 0x9b, 0xba, + 0xfd, 0x75, 0x68, 0x2d, 0x52, 0x1e, 0x09, 0x33, 0xc2, 0x74, 0xde, 0xeb, 0x74, 0x0d, 0xe8, 0x39, + 0x28, 0x23, 0x36, 0x13, 0xf1, 0xf4, 0x11, 0x8b, 0x54, 0x92, 0x9a, 0x27, 0xe9, 0xd0, 0x32, 0x98, + 0x4f, 0x87, 0xfa, 0x3f, 0x4c, 0x87, 0x70, 0x00, 0xae, 0x96, 0x36, 0x3a, 0x75, 0x0d, 0x3c, 0xb9, + 0x9a, 0x8f, 0x93, 0x19, 0xba, 0x85, 0xd2, 0xe0, 0x8f, 0x1a, 0x78, 0xf6, 0xab, 0x87, 0xec, 0x82, + 0x7b, 0xc6, 0xa5, 0x22, 0x01, 0x9e, 0x6c, 0xbe, 0x1d, 0xb7, 0xb3, 0xb4, 0xdb, 0xc7, 0x19, 0x56, + 0xc8, 0x47, 0xd0, 0xc8, 0x26, 0x6f, 0x99, 0xb9, 0x61, 0xf4, 0x1b, 0xba, 0x87, 0x9f, 0x96, 0x65, + 0xf6, 0x95, 0x0d, 0x9f, 0x5c, 0x61, 0x45, 0x97, 0x88, 0xbe, 0x4e, 0x53, 0x2e, 0x65, 0x85, 0xac, + 0x54, 0xb2, 0xdb, 0x0e, 0x2b, 0xe4, 0x33, 0x08, 0xf2, 0x0f, 0x28, 0xc1, 0xe5, 0x25, 0x85, 0xb7, + 0x4a, 0x05, 0xbc, 0xfe, 0xd2, 0x0a, 0x2b, 0xb7, 0x1c, 0xf2, 0x09, 0x34, 0x2c, 0x2e, 0xc9, 0xa6, + 0x0e, 0x9f, 0x87, 0x6d, 0x41, 0xa3, 0xf2, 0x31, 0xb8, 0x7a, 0xdc, 0x6f, 0xe6, 0x6f, 0x21, 0x88, + 0x1f, 0x04, 0x46, 0xe1, 0x16, 0xd4, 0xcd, 0xd3, 0x25, 0xa5, 0x87, 0xac, 0xf3, 0x92, 0x47, 0x5f, + 0xec, 0x0a, 0x61, 0x85, 0xec, 0x83, 0x5f, 0x40, 0x48, 0xf7, 0xef, 0x2c, 0x34, 0x77, 0x75, 0x53, + 0xd3, 0xd5, 0x46, 0xc7, 0x9e, 0xf9, 0xa9, 0xb8, 0xfd, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, + 0x1c, 0x1c, 0x7f, 0x63, 0x0c, 0x00, 0x00, } diff --git a/make/build.make b/make/build.make deleted file mode 100644 index 7f9b6b6..0000000 --- a/make/build.make +++ /dev/null @@ -1,29 +0,0 @@ - -python: ## Build the GRPC source for Python - @printf "Generating Python source." - @docker run \ - -v `pwd`:/build \ - grpc/python:1.4 \ - python3 -m grpc_tools.protoc -I/build \ - --python_out=/build/python/synse_plugin \ - --grpc_python_out=/build/python/synse_plugin \ - /build/synse.proto && \ - sed -i -e 's/import synse_pb2 as synse__pb2/from . import synse_pb2 as synse__pb2/g' python/synse_plugin/synse_pb2_grpc.py && \ - if [ -f "python/synse_plugin/synse_pb2_grpc.py-e" ]; then rm python/synse_plugin/synse_pb2_grpc.py-e; fi; - @printf " [done]\n" - - - -go: ## Build the GRPC source for Go - @printf "Generating Go source." - @docker run \ - -v `pwd`:/build \ - grpc/go:1.0 \ - protoc -I /build /build/synse.proto --go_out=plugins=grpc:/build/go - @printf " [done]\n" - - -all: python go ## Build source for all supported languages - - -.PHONY: all go python \ No newline at end of file diff --git a/make/github.make b/make/github.make deleted file mode 100644 index 94079a9..0000000 --- a/make/github.make +++ /dev/null @@ -1,15 +0,0 @@ - -build-hub: ## Build the docker image for creating a new GitHub release - docker build -f dockerfile/hub.dockerfile \ - -t vaporio/hub:latest \ - -t vaporio/hub:v2.3.0-pre10 . - - -release-github: build-hub ## Create a new GitHub release with $PKG_VER as the version - docker run -it -v $(PWD):/data vaporio/hub \ - release create -d \ - -a python/dist/synse_plugin-$(PKG_VER).tar.gz \ - -m "v$(PKG_VER)" v$(PKG_VER) - - -.PHONY: build-hub release-github \ No newline at end of file diff --git a/python/setup.py b/python/setup.py index faee1a6..0a451f0 100644 --- a/python/setup.py +++ b/python/setup.py @@ -5,12 +5,12 @@ from setuptools import find_packages, setup # Package metadata -name = 'synse_plugin' +name = 'synse_grpc' description = 'Internal gRPC API for communication between plugins and Synse Server.' url = 'https://github.com/vapor-ware/synse-server-grpc' email = 'vapor@vapor.io' author = 'Vapor IO' -version = '0.0.3' +version = '1.0.0' # packages required for this module to run required = [ diff --git a/python/synse_plugin/__init__.py b/python/synse_grpc/__init__.py similarity index 100% rename from python/synse_plugin/__init__.py rename to python/synse_grpc/__init__.py diff --git a/python/synse_grpc/synse_pb2.py b/python/synse_grpc/synse_pb2.py new file mode 100644 index 0000000..e4aebb2 --- /dev/null +++ b/python/synse_grpc/synse_pb2.py @@ -0,0 +1,1710 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: synse.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='synse.proto', + package='synse', + syntax='proto3', + serialized_pb=_b('\n\x0bsynse.proto\x12\x05synse\";\n\x0c\x44\x65viceFilter\x12\x0c\n\x04rack\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t\x12\x0e\n\x06\x64\x65vice\x18\x03 \x01(\t\"\x07\n\x05\x45mpty\"\x14\n\x06Status\x12\n\n\x02ok\x18\x01 \x01(\x08\"\xb5\x01\n\x0cPluginHealth\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12*\n\x06status\x18\x02 \x01(\x0e\x32\x1a.synse.PluginHealth.Status\x12\"\n\x06\x63hecks\x18\x03 \x03(\x0b\x32\x12.synse.HealthCheck\"B\n\x06Status\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x16\n\x12PARTIALLY_DEGRADED\x10\x03\x12\x0b\n\x07\x46\x41ILING\x10\x04\"y\n\x0bHealthCheck\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\x06status\x18\x02 \x01(\x0e\x32\x1a.synse.PluginHealth.Status\x12\x0f\n\x07message\x18\x03 \x01(\t\x12\x11\n\ttimestamp\x18\x04 \x01(\t\x12\x0c\n\x04type\x18\x05 \x01(\t\"1\n\x10\x44\x65viceCapability\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0f\n\x07outputs\x18\x02 \x03(\t\"\x80\x01\n\x08Metadata\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x12\n\nmaintainer\x18\x02 \x01(\t\x12\x0b\n\x03tag\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\x0b\n\x03vcs\x18\x05 \x01(\t\x12#\n\x07version\x18\x06 \x01(\x0b\x32\x12.synse.VersionInfo\"\x88\x01\n\x0bVersionInfo\x12\x15\n\rpluginVersion\x18\x01 \x01(\t\x12\x12\n\nsdkVersion\x18\x02 \x01(\t\x12\x11\n\tbuildDate\x18\x03 \x01(\t\x12\x11\n\tgitCommit\x18\x04 \x01(\t\x12\x0e\n\x06gitTag\x18\x05 \x01(\t\x12\x0c\n\x04\x61rch\x18\x06 \x01(\t\x12\n\n\x02os\x18\x07 \x01(\t\"\xb1\x02\n\x07Reading\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x0c\n\x04info\x18\x03 \x01(\t\x12\x19\n\x04unit\x18\x04 \x01(\x0b\x32\x0b.synse.Unit\x12\x16\n\x0cstring_value\x18\x05 \x01(\tH\x00\x12\x14\n\nbool_value\x18\x06 \x01(\x08H\x00\x12\x17\n\rfloat32_value\x18\x07 \x01(\x02H\x00\x12\x17\n\rfloat64_value\x18\x08 \x01(\x01H\x00\x12\x15\n\x0bint32_value\x18\t \x01(\x05H\x00\x12\x15\n\x0bint64_value\x18\n \x01(\x03H\x00\x12\x15\n\x0b\x62ytes_value\x18\x0b \x01(\x0cH\x00\x12\x16\n\x0cuint32_value\x18\x0c \x01(\rH\x00\x12\x16\n\x0cuint64_value\x18\r \x01(\x04H\x00\x42\x07\n\x05value\"V\n\tWriteInfo\x12)\n\x0c\x64\x65viceFilter\x18\x01 \x01(\x0b\x32\x13.synse.DeviceFilter\x12\x1e\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x10.synse.WriteData\")\n\tWriteData\x12\x0e\n\x06\x61\x63tion\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x91\x02\n\rWriteResponse\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0f\n\x07\x63reated\x18\x02 \x01(\t\x12\x0f\n\x07updated\x18\x03 \x01(\t\x12\x30\n\x06status\x18\x04 \x01(\x0e\x32 .synse.WriteResponse.WriteStatus\x12.\n\x05state\x18\x05 \x01(\x0e\x32\x1f.synse.WriteResponse.WriteState\x12\x0f\n\x07message\x18\x06 \x01(\t\">\n\x0bWriteStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0b\n\x07WRITING\x10\x02\x12\x08\n\x04\x44ONE\x10\x03\"\x1f\n\nWriteState\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"\x1f\n\x11TransactionFilter\x12\n\n\x02id\x18\x01 \x01(\t\"\x92\x01\n\x0cTransactions\x12;\n\x0ctransactions\x18\x01 \x03(\x0b\x32%.synse.Transactions.TransactionsEntry\x1a\x45\n\x11TransactionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.synse.WriteData:\x02\x38\x01\"\xf6\x01\n\x06\x44\x65vice\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12\x0c\n\x04kind\x18\x03 \x01(\t\x12-\n\x08metadata\x18\x04 \x03(\x0b\x32\x1b.synse.Device.MetadataEntry\x12\x0e\n\x06plugin\x18\x05 \x01(\t\x12\x0c\n\x04info\x18\x06 \x01(\t\x12!\n\x08location\x18\x07 \x01(\x0b\x32\x0f.synse.Location\x12\x1d\n\x06output\x18\x08 \x03(\x0b\x32\r.synse.Output\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\'\n\x08Location\x12\x0c\n\x04rack\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t\"i\n\x06Output\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\x11\n\tprecision\x18\x03 \x01(\x05\x12\x15\n\rscalingFactor\x18\x04 \x01(\x01\x12\x19\n\x04unit\x18\x05 \x01(\x0b\x32\x0b.synse.Unit\"$\n\x04Unit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06symbol\x18\x02 \x01(\t2\xce\x03\n\x06Plugin\x12%\n\x04Test\x12\x0c.synse.Empty\x1a\r.synse.Status\"\x00\x12-\n\x07Version\x12\x0c.synse.Empty\x1a\x12.synse.VersionInfo\"\x00\x12-\n\x06Health\x12\x0c.synse.Empty\x1a\x13.synse.PluginHealth\"\x00\x12+\n\x08Metainfo\x12\x0c.synse.Empty\x1a\x0f.synse.Metadata\"\x00\x12\x39\n\x0c\x43\x61pabilities\x12\x0c.synse.Empty\x1a\x17.synse.DeviceCapability\"\x00\x30\x01\x12\x31\n\x07\x44\x65vices\x12\x13.synse.DeviceFilter\x1a\r.synse.Device\"\x00\x30\x01\x12/\n\x04Read\x12\x13.synse.DeviceFilter\x1a\x0e.synse.Reading\"\x00\x30\x01\x12\x30\n\x05Write\x12\x10.synse.WriteInfo\x1a\x13.synse.Transactions\"\x00\x12\x41\n\x0bTransaction\x12\x18.synse.TransactionFilter\x1a\x14.synse.WriteResponse\"\x00\x30\x01\x62\x06proto3') +) + + + +_PLUGINHEALTH_STATUS = _descriptor.EnumDescriptor( + name='Status', + full_name='synse.PluginHealth.Status', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OK', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PARTIALLY_DEGRADED', index=2, number=3, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FAILING', index=3, number=4, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=230, + serialized_end=296, +) +_sym_db.RegisterEnumDescriptor(_PLUGINHEALTH_STATUS) + +_WRITERESPONSE_WRITESTATUS = _descriptor.EnumDescriptor( + name='WriteStatus', + full_name='synse.WriteResponse.WriteStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='PENDING', index=1, number=1, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='WRITING', index=2, number=2, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='DONE', index=3, number=3, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1360, + serialized_end=1422, +) +_sym_db.RegisterEnumDescriptor(_WRITERESPONSE_WRITESTATUS) + +_WRITERESPONSE_WRITESTATE = _descriptor.EnumDescriptor( + name='WriteState', + full_name='synse.WriteResponse.WriteState', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='OK', index=0, number=0, + options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='ERROR', index=1, number=1, + options=None, + type=None), + ], + containing_type=None, + options=None, + serialized_start=1424, + serialized_end=1455, +) +_sym_db.RegisterEnumDescriptor(_WRITERESPONSE_WRITESTATE) + + +_DEVICEFILTER = _descriptor.Descriptor( + name='DeviceFilter', + full_name='synse.DeviceFilter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rack', full_name='synse.DeviceFilter.rack', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='board', full_name='synse.DeviceFilter.board', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='device', full_name='synse.DeviceFilter.device', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=22, + serialized_end=81, +) + + +_EMPTY = _descriptor.Descriptor( + name='Empty', + full_name='synse.Empty', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=83, + serialized_end=90, +) + + +_STATUS = _descriptor.Descriptor( + name='Status', + full_name='synse.Status', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ok', full_name='synse.Status.ok', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=92, + serialized_end=112, +) + + +_PLUGINHEALTH = _descriptor.Descriptor( + name='PluginHealth', + full_name='synse.PluginHealth', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='synse.PluginHealth.timestamp', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='status', full_name='synse.PluginHealth.status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='checks', full_name='synse.PluginHealth.checks', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _PLUGINHEALTH_STATUS, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=115, + serialized_end=296, +) + + +_HEALTHCHECK = _descriptor.Descriptor( + name='HealthCheck', + full_name='synse.HealthCheck', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='synse.HealthCheck.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='status', full_name='synse.HealthCheck.status', index=1, + number=2, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='synse.HealthCheck.message', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='timestamp', full_name='synse.HealthCheck.timestamp', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='synse.HealthCheck.type', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=298, + serialized_end=419, +) + + +_DEVICECAPABILITY = _descriptor.Descriptor( + name='DeviceCapability', + full_name='synse.DeviceCapability', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='kind', full_name='synse.DeviceCapability.kind', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='outputs', full_name='synse.DeviceCapability.outputs', index=1, + number=2, type=9, cpp_type=9, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=421, + serialized_end=470, +) + + +_METADATA = _descriptor.Descriptor( + name='Metadata', + full_name='synse.Metadata', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='synse.Metadata.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='maintainer', full_name='synse.Metadata.maintainer', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='tag', full_name='synse.Metadata.tag', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='description', full_name='synse.Metadata.description', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='vcs', full_name='synse.Metadata.vcs', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='version', full_name='synse.Metadata.version', index=5, + number=6, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=473, + serialized_end=601, +) + + +_VERSIONINFO = _descriptor.Descriptor( + name='VersionInfo', + full_name='synse.VersionInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pluginVersion', full_name='synse.VersionInfo.pluginVersion', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='sdkVersion', full_name='synse.VersionInfo.sdkVersion', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='buildDate', full_name='synse.VersionInfo.buildDate', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gitCommit', full_name='synse.VersionInfo.gitCommit', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='gitTag', full_name='synse.VersionInfo.gitTag', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='arch', full_name='synse.VersionInfo.arch', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='os', full_name='synse.VersionInfo.os', index=6, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=604, + serialized_end=740, +) + + +_READING = _descriptor.Descriptor( + name='Reading', + full_name='synse.Reading', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='synse.Reading.timestamp', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='synse.Reading.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='info', full_name='synse.Reading.info', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='unit', full_name='synse.Reading.unit', index=3, + number=4, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='string_value', full_name='synse.Reading.string_value', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bool_value', full_name='synse.Reading.bool_value', index=5, + number=6, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='float32_value', full_name='synse.Reading.float32_value', index=6, + number=7, type=2, cpp_type=6, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='float64_value', full_name='synse.Reading.float64_value', index=7, + number=8, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='int32_value', full_name='synse.Reading.int32_value', index=8, + number=9, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='int64_value', full_name='synse.Reading.int64_value', index=9, + number=10, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='bytes_value', full_name='synse.Reading.bytes_value', index=10, + number=11, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uint32_value', full_name='synse.Reading.uint32_value', index=11, + number=12, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uint64_value', full_name='synse.Reading.uint64_value', index=12, + number=13, type=4, cpp_type=4, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='value', full_name='synse.Reading.value', + index=0, containing_type=None, fields=[]), + ], + serialized_start=743, + serialized_end=1048, +) + + +_WRITEINFO = _descriptor.Descriptor( + name='WriteInfo', + full_name='synse.WriteInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='deviceFilter', full_name='synse.WriteInfo.deviceFilter', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='synse.WriteInfo.data', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1050, + serialized_end=1136, +) + + +_WRITEDATA = _descriptor.Descriptor( + name='WriteData', + full_name='synse.WriteData', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='action', full_name='synse.WriteData.action', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='data', full_name='synse.WriteData.data', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1138, + serialized_end=1179, +) + + +_WRITERESPONSE = _descriptor.Descriptor( + name='WriteResponse', + full_name='synse.WriteResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='synse.WriteResponse.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='created', full_name='synse.WriteResponse.created', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='updated', full_name='synse.WriteResponse.updated', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='status', full_name='synse.WriteResponse.status', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='state', full_name='synse.WriteResponse.state', index=4, + number=5, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='message', full_name='synse.WriteResponse.message', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _WRITERESPONSE_WRITESTATUS, + _WRITERESPONSE_WRITESTATE, + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1182, + serialized_end=1455, +) + + +_TRANSACTIONFILTER = _descriptor.Descriptor( + name='TransactionFilter', + full_name='synse.TransactionFilter', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='id', full_name='synse.TransactionFilter.id', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1457, + serialized_end=1488, +) + + +_TRANSACTIONS_TRANSACTIONSENTRY = _descriptor.Descriptor( + name='TransactionsEntry', + full_name='synse.Transactions.TransactionsEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='synse.Transactions.TransactionsEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='synse.Transactions.TransactionsEntry.value', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1568, + serialized_end=1637, +) + +_TRANSACTIONS = _descriptor.Descriptor( + name='Transactions', + full_name='synse.Transactions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='transactions', full_name='synse.Transactions.transactions', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_TRANSACTIONS_TRANSACTIONSENTRY, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1491, + serialized_end=1637, +) + + +_DEVICE_METADATAENTRY = _descriptor.Descriptor( + name='MetadataEntry', + full_name='synse.Device.MetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key', full_name='synse.Device.MetadataEntry.key', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='value', full_name='synse.Device.MetadataEntry.value', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1839, + serialized_end=1886, +) + +_DEVICE = _descriptor.Descriptor( + name='Device', + full_name='synse.Device', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', full_name='synse.Device.timestamp', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='uid', full_name='synse.Device.uid', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='kind', full_name='synse.Device.kind', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='metadata', full_name='synse.Device.metadata', index=3, + number=4, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='plugin', full_name='synse.Device.plugin', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='info', full_name='synse.Device.info', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='location', full_name='synse.Device.location', index=6, + number=7, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='output', full_name='synse.Device.output', index=7, + number=8, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[_DEVICE_METADATAENTRY, ], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1640, + serialized_end=1886, +) + + +_LOCATION = _descriptor.Descriptor( + name='Location', + full_name='synse.Location', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rack', full_name='synse.Location.rack', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='board', full_name='synse.Location.board', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1888, + serialized_end=1927, +) + + +_OUTPUT = _descriptor.Descriptor( + name='Output', + full_name='synse.Output', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='synse.Output.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='type', full_name='synse.Output.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='precision', full_name='synse.Output.precision', index=2, + number=3, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='scalingFactor', full_name='synse.Output.scalingFactor', index=3, + number=4, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='unit', full_name='synse.Output.unit', index=4, + number=5, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1929, + serialized_end=2034, +) + + +_UNIT = _descriptor.Descriptor( + name='Unit', + full_name='synse.Unit', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='synse.Unit.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + _descriptor.FieldDescriptor( + name='symbol', full_name='synse.Unit.symbol', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=2036, + serialized_end=2072, +) + +_PLUGINHEALTH.fields_by_name['status'].enum_type = _PLUGINHEALTH_STATUS +_PLUGINHEALTH.fields_by_name['checks'].message_type = _HEALTHCHECK +_PLUGINHEALTH_STATUS.containing_type = _PLUGINHEALTH +_HEALTHCHECK.fields_by_name['status'].enum_type = _PLUGINHEALTH_STATUS +_METADATA.fields_by_name['version'].message_type = _VERSIONINFO +_READING.fields_by_name['unit'].message_type = _UNIT +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['string_value']) +_READING.fields_by_name['string_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['bool_value']) +_READING.fields_by_name['bool_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['float32_value']) +_READING.fields_by_name['float32_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['float64_value']) +_READING.fields_by_name['float64_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['int32_value']) +_READING.fields_by_name['int32_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['int64_value']) +_READING.fields_by_name['int64_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['bytes_value']) +_READING.fields_by_name['bytes_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['uint32_value']) +_READING.fields_by_name['uint32_value'].containing_oneof = _READING.oneofs_by_name['value'] +_READING.oneofs_by_name['value'].fields.append( + _READING.fields_by_name['uint64_value']) +_READING.fields_by_name['uint64_value'].containing_oneof = _READING.oneofs_by_name['value'] +_WRITEINFO.fields_by_name['deviceFilter'].message_type = _DEVICEFILTER +_WRITEINFO.fields_by_name['data'].message_type = _WRITEDATA +_WRITERESPONSE.fields_by_name['status'].enum_type = _WRITERESPONSE_WRITESTATUS +_WRITERESPONSE.fields_by_name['state'].enum_type = _WRITERESPONSE_WRITESTATE +_WRITERESPONSE_WRITESTATUS.containing_type = _WRITERESPONSE +_WRITERESPONSE_WRITESTATE.containing_type = _WRITERESPONSE +_TRANSACTIONS_TRANSACTIONSENTRY.fields_by_name['value'].message_type = _WRITEDATA +_TRANSACTIONS_TRANSACTIONSENTRY.containing_type = _TRANSACTIONS +_TRANSACTIONS.fields_by_name['transactions'].message_type = _TRANSACTIONS_TRANSACTIONSENTRY +_DEVICE_METADATAENTRY.containing_type = _DEVICE +_DEVICE.fields_by_name['metadata'].message_type = _DEVICE_METADATAENTRY +_DEVICE.fields_by_name['location'].message_type = _LOCATION +_DEVICE.fields_by_name['output'].message_type = _OUTPUT +_OUTPUT.fields_by_name['unit'].message_type = _UNIT +DESCRIPTOR.message_types_by_name['DeviceFilter'] = _DEVICEFILTER +DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY +DESCRIPTOR.message_types_by_name['Status'] = _STATUS +DESCRIPTOR.message_types_by_name['PluginHealth'] = _PLUGINHEALTH +DESCRIPTOR.message_types_by_name['HealthCheck'] = _HEALTHCHECK +DESCRIPTOR.message_types_by_name['DeviceCapability'] = _DEVICECAPABILITY +DESCRIPTOR.message_types_by_name['Metadata'] = _METADATA +DESCRIPTOR.message_types_by_name['VersionInfo'] = _VERSIONINFO +DESCRIPTOR.message_types_by_name['Reading'] = _READING +DESCRIPTOR.message_types_by_name['WriteInfo'] = _WRITEINFO +DESCRIPTOR.message_types_by_name['WriteData'] = _WRITEDATA +DESCRIPTOR.message_types_by_name['WriteResponse'] = _WRITERESPONSE +DESCRIPTOR.message_types_by_name['TransactionFilter'] = _TRANSACTIONFILTER +DESCRIPTOR.message_types_by_name['Transactions'] = _TRANSACTIONS +DESCRIPTOR.message_types_by_name['Device'] = _DEVICE +DESCRIPTOR.message_types_by_name['Location'] = _LOCATION +DESCRIPTOR.message_types_by_name['Output'] = _OUTPUT +DESCRIPTOR.message_types_by_name['Unit'] = _UNIT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +DeviceFilter = _reflection.GeneratedProtocolMessageType('DeviceFilter', (_message.Message,), dict( + DESCRIPTOR = _DEVICEFILTER, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.DeviceFilter) + )) +_sym_db.RegisterMessage(DeviceFilter) + +Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), dict( + DESCRIPTOR = _EMPTY, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Empty) + )) +_sym_db.RegisterMessage(Empty) + +Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), dict( + DESCRIPTOR = _STATUS, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Status) + )) +_sym_db.RegisterMessage(Status) + +PluginHealth = _reflection.GeneratedProtocolMessageType('PluginHealth', (_message.Message,), dict( + DESCRIPTOR = _PLUGINHEALTH, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.PluginHealth) + )) +_sym_db.RegisterMessage(PluginHealth) + +HealthCheck = _reflection.GeneratedProtocolMessageType('HealthCheck', (_message.Message,), dict( + DESCRIPTOR = _HEALTHCHECK, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.HealthCheck) + )) +_sym_db.RegisterMessage(HealthCheck) + +DeviceCapability = _reflection.GeneratedProtocolMessageType('DeviceCapability', (_message.Message,), dict( + DESCRIPTOR = _DEVICECAPABILITY, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.DeviceCapability) + )) +_sym_db.RegisterMessage(DeviceCapability) + +Metadata = _reflection.GeneratedProtocolMessageType('Metadata', (_message.Message,), dict( + DESCRIPTOR = _METADATA, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Metadata) + )) +_sym_db.RegisterMessage(Metadata) + +VersionInfo = _reflection.GeneratedProtocolMessageType('VersionInfo', (_message.Message,), dict( + DESCRIPTOR = _VERSIONINFO, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.VersionInfo) + )) +_sym_db.RegisterMessage(VersionInfo) + +Reading = _reflection.GeneratedProtocolMessageType('Reading', (_message.Message,), dict( + DESCRIPTOR = _READING, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Reading) + )) +_sym_db.RegisterMessage(Reading) + +WriteInfo = _reflection.GeneratedProtocolMessageType('WriteInfo', (_message.Message,), dict( + DESCRIPTOR = _WRITEINFO, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.WriteInfo) + )) +_sym_db.RegisterMessage(WriteInfo) + +WriteData = _reflection.GeneratedProtocolMessageType('WriteData', (_message.Message,), dict( + DESCRIPTOR = _WRITEDATA, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.WriteData) + )) +_sym_db.RegisterMessage(WriteData) + +WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), dict( + DESCRIPTOR = _WRITERESPONSE, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.WriteResponse) + )) +_sym_db.RegisterMessage(WriteResponse) + +TransactionFilter = _reflection.GeneratedProtocolMessageType('TransactionFilter', (_message.Message,), dict( + DESCRIPTOR = _TRANSACTIONFILTER, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.TransactionFilter) + )) +_sym_db.RegisterMessage(TransactionFilter) + +Transactions = _reflection.GeneratedProtocolMessageType('Transactions', (_message.Message,), dict( + + TransactionsEntry = _reflection.GeneratedProtocolMessageType('TransactionsEntry', (_message.Message,), dict( + DESCRIPTOR = _TRANSACTIONS_TRANSACTIONSENTRY, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Transactions.TransactionsEntry) + )) + , + DESCRIPTOR = _TRANSACTIONS, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Transactions) + )) +_sym_db.RegisterMessage(Transactions) +_sym_db.RegisterMessage(Transactions.TransactionsEntry) + +Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), dict( + + MetadataEntry = _reflection.GeneratedProtocolMessageType('MetadataEntry', (_message.Message,), dict( + DESCRIPTOR = _DEVICE_METADATAENTRY, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Device.MetadataEntry) + )) + , + DESCRIPTOR = _DEVICE, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Device) + )) +_sym_db.RegisterMessage(Device) +_sym_db.RegisterMessage(Device.MetadataEntry) + +Location = _reflection.GeneratedProtocolMessageType('Location', (_message.Message,), dict( + DESCRIPTOR = _LOCATION, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Location) + )) +_sym_db.RegisterMessage(Location) + +Output = _reflection.GeneratedProtocolMessageType('Output', (_message.Message,), dict( + DESCRIPTOR = _OUTPUT, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Output) + )) +_sym_db.RegisterMessage(Output) + +Unit = _reflection.GeneratedProtocolMessageType('Unit', (_message.Message,), dict( + DESCRIPTOR = _UNIT, + __module__ = 'synse_pb2' + # @@protoc_insertion_point(class_scope:synse.Unit) + )) +_sym_db.RegisterMessage(Unit) + + +_TRANSACTIONS_TRANSACTIONSENTRY.has_options = True +_TRANSACTIONS_TRANSACTIONSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) +_DEVICE_METADATAENTRY.has_options = True +_DEVICE_METADATAENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) +try: + # THESE ELEMENTS WILL BE DEPRECATED. + # Please use the generated *_pb2_grpc.py files instead. + import grpc + from grpc.beta import implementations as beta_implementations + from grpc.beta import interfaces as beta_interfaces + from grpc.framework.common import cardinality + from grpc.framework.interfaces.face import utilities as face_utilities + + + class PluginStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Test = channel.unary_unary( + '/synse.Plugin/Test', + request_serializer=Empty.SerializeToString, + response_deserializer=Status.FromString, + ) + self.Version = channel.unary_unary( + '/synse.Plugin/Version', + request_serializer=Empty.SerializeToString, + response_deserializer=VersionInfo.FromString, + ) + self.Health = channel.unary_unary( + '/synse.Plugin/Health', + request_serializer=Empty.SerializeToString, + response_deserializer=PluginHealth.FromString, + ) + self.Metainfo = channel.unary_unary( + '/synse.Plugin/Metainfo', + request_serializer=Empty.SerializeToString, + response_deserializer=Metadata.FromString, + ) + self.Capabilities = channel.unary_stream( + '/synse.Plugin/Capabilities', + request_serializer=Empty.SerializeToString, + response_deserializer=DeviceCapability.FromString, + ) + self.Devices = channel.unary_stream( + '/synse.Plugin/Devices', + request_serializer=DeviceFilter.SerializeToString, + response_deserializer=Device.FromString, + ) + self.Read = channel.unary_stream( + '/synse.Plugin/Read', + request_serializer=DeviceFilter.SerializeToString, + response_deserializer=Reading.FromString, + ) + self.Write = channel.unary_unary( + '/synse.Plugin/Write', + request_serializer=WriteInfo.SerializeToString, + response_deserializer=Transactions.FromString, + ) + self.Transaction = channel.unary_stream( + '/synse.Plugin/Transaction', + request_serializer=TransactionFilter.SerializeToString, + response_deserializer=WriteResponse.FromString, + ) + + + class PluginServicer(object): + # missing associated documentation comment in .proto file + pass + + def Test(self, request, context): + """Test returns the status of the plugin. This call is intended to + be used in order to check if a plugin is reachable. The status + returned here designates plugin reachability, not plugin health. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Version(self, request, context): + """Version returns the version info for the plugin. This is not used + by Synse Server, but can be used by the CLI/manual plugin interaction. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Health(self, request, context): + """Health returns the health status of a plugin. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Metainfo(self, request, context): + """Metainfo gets the metainfo for the plugin. This info provides details + about the plugin itself. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Capabilities(self, request, context): + """Capabilities returns the collection of capabilities that a plugin + exposes. More specifically, this means types of devices supported + and the readings supported for each of those devices. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Devices(self, request, context): + """Devices gets info for all of the devices that the plugin manages. + This rpc call is the plugin's equivalent to a Synse Server scan. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Read(self, request, context): + """Read returns the reading data for the specified device. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Write(self, request, context): + """Write issues an asynchronous write command to the specified device. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Transaction(self, request, context): + """Transactiong gets the state/status of an asynchronous write transaction. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + + def add_PluginServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Test': grpc.unary_unary_rpc_method_handler( + servicer.Test, + request_deserializer=Empty.FromString, + response_serializer=Status.SerializeToString, + ), + 'Version': grpc.unary_unary_rpc_method_handler( + servicer.Version, + request_deserializer=Empty.FromString, + response_serializer=VersionInfo.SerializeToString, + ), + 'Health': grpc.unary_unary_rpc_method_handler( + servicer.Health, + request_deserializer=Empty.FromString, + response_serializer=PluginHealth.SerializeToString, + ), + 'Metainfo': grpc.unary_unary_rpc_method_handler( + servicer.Metainfo, + request_deserializer=Empty.FromString, + response_serializer=Metadata.SerializeToString, + ), + 'Capabilities': grpc.unary_stream_rpc_method_handler( + servicer.Capabilities, + request_deserializer=Empty.FromString, + response_serializer=DeviceCapability.SerializeToString, + ), + 'Devices': grpc.unary_stream_rpc_method_handler( + servicer.Devices, + request_deserializer=DeviceFilter.FromString, + response_serializer=Device.SerializeToString, + ), + 'Read': grpc.unary_stream_rpc_method_handler( + servicer.Read, + request_deserializer=DeviceFilter.FromString, + response_serializer=Reading.SerializeToString, + ), + 'Write': grpc.unary_unary_rpc_method_handler( + servicer.Write, + request_deserializer=WriteInfo.FromString, + response_serializer=Transactions.SerializeToString, + ), + 'Transaction': grpc.unary_stream_rpc_method_handler( + servicer.Transaction, + request_deserializer=TransactionFilter.FromString, + response_serializer=WriteResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'synse.Plugin', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + class BetaPluginServicer(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def Test(self, request, context): + """Test returns the status of the plugin. This call is intended to + be used in order to check if a plugin is reachable. The status + returned here designates plugin reachability, not plugin health. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Version(self, request, context): + """Version returns the version info for the plugin. This is not used + by Synse Server, but can be used by the CLI/manual plugin interaction. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Health(self, request, context): + """Health returns the health status of a plugin. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Metainfo(self, request, context): + """Metainfo gets the metainfo for the plugin. This info provides details + about the plugin itself. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Capabilities(self, request, context): + """Capabilities returns the collection of capabilities that a plugin + exposes. More specifically, this means types of devices supported + and the readings supported for each of those devices. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Devices(self, request, context): + """Devices gets info for all of the devices that the plugin manages. + This rpc call is the plugin's equivalent to a Synse Server scan. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Read(self, request, context): + """Read returns the reading data for the specified device. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Write(self, request, context): + """Write issues an asynchronous write command to the specified device. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + def Transaction(self, request, context): + """Transactiong gets the state/status of an asynchronous write transaction. + """ + context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) + + + class BetaPluginStub(object): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This class was generated + only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" + # missing associated documentation comment in .proto file + pass + def Test(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Test returns the status of the plugin. This call is intended to + be used in order to check if a plugin is reachable. The status + returned here designates plugin reachability, not plugin health. + """ + raise NotImplementedError() + Test.future = None + def Version(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Version returns the version info for the plugin. This is not used + by Synse Server, but can be used by the CLI/manual plugin interaction. + """ + raise NotImplementedError() + Version.future = None + def Health(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Health returns the health status of a plugin. + """ + raise NotImplementedError() + Health.future = None + def Metainfo(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Metainfo gets the metainfo for the plugin. This info provides details + about the plugin itself. + """ + raise NotImplementedError() + Metainfo.future = None + def Capabilities(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Capabilities returns the collection of capabilities that a plugin + exposes. More specifically, this means types of devices supported + and the readings supported for each of those devices. + """ + raise NotImplementedError() + def Devices(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Devices gets info for all of the devices that the plugin manages. + This rpc call is the plugin's equivalent to a Synse Server scan. + """ + raise NotImplementedError() + def Read(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Read returns the reading data for the specified device. + """ + raise NotImplementedError() + def Write(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Write issues an asynchronous write command to the specified device. + """ + raise NotImplementedError() + Write.future = None + def Transaction(self, request, timeout, metadata=None, with_call=False, protocol_options=None): + """Transactiong gets the state/status of an asynchronous write transaction. + """ + raise NotImplementedError() + + + def beta_create_Plugin_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_deserializers = { + ('synse.Plugin', 'Capabilities'): Empty.FromString, + ('synse.Plugin', 'Devices'): DeviceFilter.FromString, + ('synse.Plugin', 'Health'): Empty.FromString, + ('synse.Plugin', 'Metainfo'): Empty.FromString, + ('synse.Plugin', 'Read'): DeviceFilter.FromString, + ('synse.Plugin', 'Test'): Empty.FromString, + ('synse.Plugin', 'Transaction'): TransactionFilter.FromString, + ('synse.Plugin', 'Version'): Empty.FromString, + ('synse.Plugin', 'Write'): WriteInfo.FromString, + } + response_serializers = { + ('synse.Plugin', 'Capabilities'): DeviceCapability.SerializeToString, + ('synse.Plugin', 'Devices'): Device.SerializeToString, + ('synse.Plugin', 'Health'): PluginHealth.SerializeToString, + ('synse.Plugin', 'Metainfo'): Metadata.SerializeToString, + ('synse.Plugin', 'Read'): Reading.SerializeToString, + ('synse.Plugin', 'Test'): Status.SerializeToString, + ('synse.Plugin', 'Transaction'): WriteResponse.SerializeToString, + ('synse.Plugin', 'Version'): VersionInfo.SerializeToString, + ('synse.Plugin', 'Write'): Transactions.SerializeToString, + } + method_implementations = { + ('synse.Plugin', 'Capabilities'): face_utilities.unary_stream_inline(servicer.Capabilities), + ('synse.Plugin', 'Devices'): face_utilities.unary_stream_inline(servicer.Devices), + ('synse.Plugin', 'Health'): face_utilities.unary_unary_inline(servicer.Health), + ('synse.Plugin', 'Metainfo'): face_utilities.unary_unary_inline(servicer.Metainfo), + ('synse.Plugin', 'Read'): face_utilities.unary_stream_inline(servicer.Read), + ('synse.Plugin', 'Test'): face_utilities.unary_unary_inline(servicer.Test), + ('synse.Plugin', 'Transaction'): face_utilities.unary_stream_inline(servicer.Transaction), + ('synse.Plugin', 'Version'): face_utilities.unary_unary_inline(servicer.Version), + ('synse.Plugin', 'Write'): face_utilities.unary_unary_inline(servicer.Write), + } + server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) + return beta_implementations.server(method_implementations, options=server_options) + + + def beta_create_Plugin_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): + """The Beta API is deprecated for 0.15.0 and later. + + It is recommended to use the GA API (classes and functions in this + file not marked beta) for all further purposes. This function was + generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" + request_serializers = { + ('synse.Plugin', 'Capabilities'): Empty.SerializeToString, + ('synse.Plugin', 'Devices'): DeviceFilter.SerializeToString, + ('synse.Plugin', 'Health'): Empty.SerializeToString, + ('synse.Plugin', 'Metainfo'): Empty.SerializeToString, + ('synse.Plugin', 'Read'): DeviceFilter.SerializeToString, + ('synse.Plugin', 'Test'): Empty.SerializeToString, + ('synse.Plugin', 'Transaction'): TransactionFilter.SerializeToString, + ('synse.Plugin', 'Version'): Empty.SerializeToString, + ('synse.Plugin', 'Write'): WriteInfo.SerializeToString, + } + response_deserializers = { + ('synse.Plugin', 'Capabilities'): DeviceCapability.FromString, + ('synse.Plugin', 'Devices'): Device.FromString, + ('synse.Plugin', 'Health'): PluginHealth.FromString, + ('synse.Plugin', 'Metainfo'): Metadata.FromString, + ('synse.Plugin', 'Read'): Reading.FromString, + ('synse.Plugin', 'Test'): Status.FromString, + ('synse.Plugin', 'Transaction'): WriteResponse.FromString, + ('synse.Plugin', 'Version'): VersionInfo.FromString, + ('synse.Plugin', 'Write'): Transactions.FromString, + } + cardinalities = { + 'Capabilities': cardinality.Cardinality.UNARY_STREAM, + 'Devices': cardinality.Cardinality.UNARY_STREAM, + 'Health': cardinality.Cardinality.UNARY_UNARY, + 'Metainfo': cardinality.Cardinality.UNARY_UNARY, + 'Read': cardinality.Cardinality.UNARY_STREAM, + 'Test': cardinality.Cardinality.UNARY_UNARY, + 'Transaction': cardinality.Cardinality.UNARY_STREAM, + 'Version': cardinality.Cardinality.UNARY_UNARY, + 'Write': cardinality.Cardinality.UNARY_UNARY, + } + stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) + return beta_implementations.dynamic_stub(channel, 'synse.Plugin', cardinalities, options=stub_options) +except ImportError: + pass +# @@protoc_insertion_point(module_scope) diff --git a/python/synse_grpc/synse_pb2_grpc.py b/python/synse_grpc/synse_pb2_grpc.py new file mode 100644 index 0000000..65f6606 --- /dev/null +++ b/python/synse_grpc/synse_pb2_grpc.py @@ -0,0 +1,189 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +from . import synse_pb2 as synse__pb2 + + +class PluginStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Test = channel.unary_unary( + '/synse.Plugin/Test', + request_serializer=synse__pb2.Empty.SerializeToString, + response_deserializer=synse__pb2.Status.FromString, + ) + self.Version = channel.unary_unary( + '/synse.Plugin/Version', + request_serializer=synse__pb2.Empty.SerializeToString, + response_deserializer=synse__pb2.VersionInfo.FromString, + ) + self.Health = channel.unary_unary( + '/synse.Plugin/Health', + request_serializer=synse__pb2.Empty.SerializeToString, + response_deserializer=synse__pb2.PluginHealth.FromString, + ) + self.Metainfo = channel.unary_unary( + '/synse.Plugin/Metainfo', + request_serializer=synse__pb2.Empty.SerializeToString, + response_deserializer=synse__pb2.Metadata.FromString, + ) + self.Capabilities = channel.unary_stream( + '/synse.Plugin/Capabilities', + request_serializer=synse__pb2.Empty.SerializeToString, + response_deserializer=synse__pb2.DeviceCapability.FromString, + ) + self.Devices = channel.unary_stream( + '/synse.Plugin/Devices', + request_serializer=synse__pb2.DeviceFilter.SerializeToString, + response_deserializer=synse__pb2.Device.FromString, + ) + self.Read = channel.unary_stream( + '/synse.Plugin/Read', + request_serializer=synse__pb2.DeviceFilter.SerializeToString, + response_deserializer=synse__pb2.Reading.FromString, + ) + self.Write = channel.unary_unary( + '/synse.Plugin/Write', + request_serializer=synse__pb2.WriteInfo.SerializeToString, + response_deserializer=synse__pb2.Transactions.FromString, + ) + self.Transaction = channel.unary_stream( + '/synse.Plugin/Transaction', + request_serializer=synse__pb2.TransactionFilter.SerializeToString, + response_deserializer=synse__pb2.WriteResponse.FromString, + ) + + +class PluginServicer(object): + # missing associated documentation comment in .proto file + pass + + def Test(self, request, context): + """Test returns the status of the plugin. This call is intended to + be used in order to check if a plugin is reachable. The status + returned here designates plugin reachability, not plugin health. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Version(self, request, context): + """Version returns the version info for the plugin. This is not used + by Synse Server, but can be used by the CLI/manual plugin interaction. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Health(self, request, context): + """Health returns the health status of a plugin. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Metainfo(self, request, context): + """Metainfo gets the metainfo for the plugin. This info provides details + about the plugin itself. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Capabilities(self, request, context): + """Capabilities returns the collection of capabilities that a plugin + exposes. More specifically, this means types of devices supported + and the readings supported for each of those devices. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Devices(self, request, context): + """Devices gets info for all of the devices that the plugin manages. + This rpc call is the plugin's equivalent to a Synse Server scan. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Read(self, request, context): + """Read returns the reading data for the specified device. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Write(self, request, context): + """Write issues an asynchronous write command to the specified device. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def Transaction(self, request, context): + """Transactiong gets the state/status of an asynchronous write transaction. + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_PluginServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Test': grpc.unary_unary_rpc_method_handler( + servicer.Test, + request_deserializer=synse__pb2.Empty.FromString, + response_serializer=synse__pb2.Status.SerializeToString, + ), + 'Version': grpc.unary_unary_rpc_method_handler( + servicer.Version, + request_deserializer=synse__pb2.Empty.FromString, + response_serializer=synse__pb2.VersionInfo.SerializeToString, + ), + 'Health': grpc.unary_unary_rpc_method_handler( + servicer.Health, + request_deserializer=synse__pb2.Empty.FromString, + response_serializer=synse__pb2.PluginHealth.SerializeToString, + ), + 'Metainfo': grpc.unary_unary_rpc_method_handler( + servicer.Metainfo, + request_deserializer=synse__pb2.Empty.FromString, + response_serializer=synse__pb2.Metadata.SerializeToString, + ), + 'Capabilities': grpc.unary_stream_rpc_method_handler( + servicer.Capabilities, + request_deserializer=synse__pb2.Empty.FromString, + response_serializer=synse__pb2.DeviceCapability.SerializeToString, + ), + 'Devices': grpc.unary_stream_rpc_method_handler( + servicer.Devices, + request_deserializer=synse__pb2.DeviceFilter.FromString, + response_serializer=synse__pb2.Device.SerializeToString, + ), + 'Read': grpc.unary_stream_rpc_method_handler( + servicer.Read, + request_deserializer=synse__pb2.DeviceFilter.FromString, + response_serializer=synse__pb2.Reading.SerializeToString, + ), + 'Write': grpc.unary_unary_rpc_method_handler( + servicer.Write, + request_deserializer=synse__pb2.WriteInfo.FromString, + response_serializer=synse__pb2.Transactions.SerializeToString, + ), + 'Transaction': grpc.unary_stream_rpc_method_handler( + servicer.Transaction, + request_deserializer=synse__pb2.TransactionFilter.FromString, + response_serializer=synse__pb2.WriteResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'synse.Plugin', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/python/synse_plugin/synse_pb2.py b/python/synse_plugin/synse_pb2.py deleted file mode 100644 index 097f627..0000000 --- a/python/synse_plugin/synse_pb2.py +++ /dev/null @@ -1,1069 +0,0 @@ -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: synse.proto - -import sys -_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from google.protobuf import reflection as _reflection -from google.protobuf import symbol_database as _symbol_database -from google.protobuf import descriptor_pb2 -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - - - -DESCRIPTOR = _descriptor.FileDescriptor( - name='synse.proto', - package='synse', - syntax='proto3', - serialized_pb=_b('\n\x0bsynse.proto\x12\x05synse\":\n\x0bReadRequest\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t\x12\x0c\n\x04rack\x18\x03 \x01(\t\"[\n\x0cWriteRequest\x12\x0e\n\x06\x64\x65vice\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t\x12\x0c\n\x04rack\x18\x03 \x01(\t\x12\x1e\n\x04\x64\x61ta\x18\x04 \x03(\x0b\x32\x10.synse.WriteData\".\n\x0fMetainfoRequest\x12\x0c\n\x04rack\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t\"\x1b\n\rTransactionId\x12\n\n\x02id\x18\x01 \x01(\t\">\n\x0cReadResponse\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\x0c\n\x04type\x18\x02 \x01(\t\x12\r\n\x05value\x18\x03 \x01(\t\"\x92\x01\n\x0cTransactions\x12;\n\x0ctransactions\x18\x01 \x03(\x0b\x32%.synse.Transactions.TransactionsEntry\x1a\x45\n\x11TransactionsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x1f\n\x05value\x18\x02 \x01(\x0b\x32\x10.synse.WriteData:\x02\x38\x01\"\xe0\x01\n\x10MetainfoResponse\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\r\n\x05model\x18\x04 \x01(\t\x12\x14\n\x0cmanufacturer\x18\x05 \x01(\t\x12\x10\n\x08protocol\x18\x06 \x01(\t\x12\x0c\n\x04info\x18\x07 \x01(\t\x12\x0f\n\x07\x63omment\x18\x08 \x01(\t\x12%\n\x08location\x18\t \x01(\x0b\x32\x13.synse.MetaLocation\x12!\n\x06output\x18\n \x03(\x0b\x32\x11.synse.MetaOutput\"\x85\x02\n\rWriteResponse\x12\x0f\n\x07\x63reated\x18\x01 \x01(\t\x12\x0f\n\x07updated\x18\x02 \x01(\t\x12\x30\n\x06status\x18\x03 \x01(\x0e\x32 .synse.WriteResponse.WriteStatus\x12.\n\x05state\x18\x04 \x01(\x0e\x32\x1f.synse.WriteResponse.WriteState\x12\x0f\n\x07message\x18\x05 \x01(\t\">\n\x0bWriteStatus\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0b\n\x07PENDING\x10\x01\x12\x0b\n\x07WRITING\x10\x02\x12\x08\n\x04\x44ONE\x10\x03\"\x1f\n\nWriteState\x12\x06\n\x02OK\x10\x00\x12\t\n\x05\x45RROR\x10\x01\"(\n\tWriteData\x12\x0b\n\x03raw\x18\x01 \x03(\x0c\x12\x0e\n\x06\x61\x63tion\x18\x02 \x01(\t\".\n\x0eMetaOutputUnit\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0e\n\x06symbol\x18\x02 \x01(\t\"+\n\x0fMetaOutputRange\x12\x0b\n\x03min\x18\x01 \x01(\x05\x12\x0b\n\x03max\x18\x02 \x01(\x05\"\x8c\x01\n\nMetaOutput\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x11\n\tdata_type\x18\x02 \x01(\t\x12\x11\n\tprecision\x18\x03 \x01(\x05\x12#\n\x04unit\x18\x04 \x01(\x0b\x32\x15.synse.MetaOutputUnit\x12%\n\x05range\x18\x05 \x01(\x0b\x32\x16.synse.MetaOutputRange\"+\n\x0cMetaLocation\x12\x0c\n\x04rack\x18\x01 \x01(\t\x12\r\n\x05\x62oard\x18\x02 \x01(\t2\xfa\x01\n\x0bInternalApi\x12\x33\n\x04Read\x12\x12.synse.ReadRequest\x1a\x13.synse.ReadResponse\"\x00\x30\x01\x12\x33\n\x05Write\x12\x13.synse.WriteRequest\x1a\x13.synse.Transactions\"\x00\x12?\n\x08Metainfo\x12\x16.synse.MetainfoRequest\x1a\x17.synse.MetainfoResponse\"\x00\x30\x01\x12@\n\x10TransactionCheck\x12\x14.synse.TransactionId\x1a\x14.synse.WriteResponse\"\x00\x62\x06proto3') -) - - - -_WRITERESPONSE_WRITESTATUS = _descriptor.EnumDescriptor( - name='WriteStatus', - full_name='synse.WriteResponse.WriteStatus', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='UNKNOWN', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='PENDING', index=1, number=1, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='WRITING', index=2, number=2, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='DONE', index=3, number=3, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=859, - serialized_end=921, -) -_sym_db.RegisterEnumDescriptor(_WRITERESPONSE_WRITESTATUS) - -_WRITERESPONSE_WRITESTATE = _descriptor.EnumDescriptor( - name='WriteState', - full_name='synse.WriteResponse.WriteState', - filename=None, - file=DESCRIPTOR, - values=[ - _descriptor.EnumValueDescriptor( - name='OK', index=0, number=0, - options=None, - type=None), - _descriptor.EnumValueDescriptor( - name='ERROR', index=1, number=1, - options=None, - type=None), - ], - containing_type=None, - options=None, - serialized_start=923, - serialized_end=954, -) -_sym_db.RegisterEnumDescriptor(_WRITERESPONSE_WRITESTATE) - - -_READREQUEST = _descriptor.Descriptor( - name='ReadRequest', - full_name='synse.ReadRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='device', full_name='synse.ReadRequest.device', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='board', full_name='synse.ReadRequest.board', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='rack', full_name='synse.ReadRequest.rack', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=22, - serialized_end=80, -) - - -_WRITEREQUEST = _descriptor.Descriptor( - name='WriteRequest', - full_name='synse.WriteRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='device', full_name='synse.WriteRequest.device', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='board', full_name='synse.WriteRequest.board', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='rack', full_name='synse.WriteRequest.rack', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='data', full_name='synse.WriteRequest.data', index=3, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=82, - serialized_end=173, -) - - -_METAINFOREQUEST = _descriptor.Descriptor( - name='MetainfoRequest', - full_name='synse.MetainfoRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='rack', full_name='synse.MetainfoRequest.rack', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='board', full_name='synse.MetainfoRequest.board', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=175, - serialized_end=221, -) - - -_TRANSACTIONID = _descriptor.Descriptor( - name='TransactionId', - full_name='synse.TransactionId', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='synse.TransactionId.id', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=223, - serialized_end=250, -) - - -_READRESPONSE = _descriptor.Descriptor( - name='ReadResponse', - full_name='synse.ReadResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='synse.ReadResponse.timestamp', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='type', full_name='synse.ReadResponse.type', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='value', full_name='synse.ReadResponse.value', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=252, - serialized_end=314, -) - - -_TRANSACTIONS_TRANSACTIONSENTRY = _descriptor.Descriptor( - name='TransactionsEntry', - full_name='synse.Transactions.TransactionsEntry', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='key', full_name='synse.Transactions.TransactionsEntry.key', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='value', full_name='synse.Transactions.TransactionsEntry.value', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=_descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')), - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=394, - serialized_end=463, -) - -_TRANSACTIONS = _descriptor.Descriptor( - name='Transactions', - full_name='synse.Transactions', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='transactions', full_name='synse.Transactions.transactions', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[_TRANSACTIONS_TRANSACTIONSENTRY, ], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=317, - serialized_end=463, -) - - -_METAINFORESPONSE = _descriptor.Descriptor( - name='MetainfoResponse', - full_name='synse.MetainfoResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='timestamp', full_name='synse.MetainfoResponse.timestamp', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='uid', full_name='synse.MetainfoResponse.uid', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='type', full_name='synse.MetainfoResponse.type', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='model', full_name='synse.MetainfoResponse.model', index=3, - number=4, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='manufacturer', full_name='synse.MetainfoResponse.manufacturer', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='protocol', full_name='synse.MetainfoResponse.protocol', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='info', full_name='synse.MetainfoResponse.info', index=6, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='comment', full_name='synse.MetainfoResponse.comment', index=7, - number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='location', full_name='synse.MetainfoResponse.location', index=8, - number=9, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='output', full_name='synse.MetainfoResponse.output', index=9, - number=10, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=466, - serialized_end=690, -) - - -_WRITERESPONSE = _descriptor.Descriptor( - name='WriteResponse', - full_name='synse.WriteResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='created', full_name='synse.WriteResponse.created', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='updated', full_name='synse.WriteResponse.updated', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='status', full_name='synse.WriteResponse.status', index=2, - number=3, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='state', full_name='synse.WriteResponse.state', index=3, - number=4, type=14, cpp_type=8, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='message', full_name='synse.WriteResponse.message', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - _WRITERESPONSE_WRITESTATUS, - _WRITERESPONSE_WRITESTATE, - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=693, - serialized_end=954, -) - - -_WRITEDATA = _descriptor.Descriptor( - name='WriteData', - full_name='synse.WriteData', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='raw', full_name='synse.WriteData.raw', index=0, - number=1, type=12, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='action', full_name='synse.WriteData.action', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=956, - serialized_end=996, -) - - -_METAOUTPUTUNIT = _descriptor.Descriptor( - name='MetaOutputUnit', - full_name='synse.MetaOutputUnit', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='synse.MetaOutputUnit.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='symbol', full_name='synse.MetaOutputUnit.symbol', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=998, - serialized_end=1044, -) - - -_METAOUTPUTRANGE = _descriptor.Descriptor( - name='MetaOutputRange', - full_name='synse.MetaOutputRange', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='min', full_name='synse.MetaOutputRange.min', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='max', full_name='synse.MetaOutputRange.max', index=1, - number=2, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1046, - serialized_end=1089, -) - - -_METAOUTPUT = _descriptor.Descriptor( - name='MetaOutput', - full_name='synse.MetaOutput', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='synse.MetaOutput.type', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='data_type', full_name='synse.MetaOutput.data_type', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='precision', full_name='synse.MetaOutput.precision', index=2, - number=3, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='unit', full_name='synse.MetaOutput.unit', index=3, - number=4, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='range', full_name='synse.MetaOutput.range', index=4, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1092, - serialized_end=1232, -) - - -_METALOCATION = _descriptor.Descriptor( - name='MetaLocation', - full_name='synse.MetaLocation', - filename=None, - file=DESCRIPTOR, - containing_type=None, - fields=[ - _descriptor.FieldDescriptor( - name='rack', full_name='synse.MetaLocation.rack', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - _descriptor.FieldDescriptor( - name='board', full_name='synse.MetaLocation.board', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=_b("").decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=1234, - serialized_end=1277, -) - -_WRITEREQUEST.fields_by_name['data'].message_type = _WRITEDATA -_TRANSACTIONS_TRANSACTIONSENTRY.fields_by_name['value'].message_type = _WRITEDATA -_TRANSACTIONS_TRANSACTIONSENTRY.containing_type = _TRANSACTIONS -_TRANSACTIONS.fields_by_name['transactions'].message_type = _TRANSACTIONS_TRANSACTIONSENTRY -_METAINFORESPONSE.fields_by_name['location'].message_type = _METALOCATION -_METAINFORESPONSE.fields_by_name['output'].message_type = _METAOUTPUT -_WRITERESPONSE.fields_by_name['status'].enum_type = _WRITERESPONSE_WRITESTATUS -_WRITERESPONSE.fields_by_name['state'].enum_type = _WRITERESPONSE_WRITESTATE -_WRITERESPONSE_WRITESTATUS.containing_type = _WRITERESPONSE -_WRITERESPONSE_WRITESTATE.containing_type = _WRITERESPONSE -_METAOUTPUT.fields_by_name['unit'].message_type = _METAOUTPUTUNIT -_METAOUTPUT.fields_by_name['range'].message_type = _METAOUTPUTRANGE -DESCRIPTOR.message_types_by_name['ReadRequest'] = _READREQUEST -DESCRIPTOR.message_types_by_name['WriteRequest'] = _WRITEREQUEST -DESCRIPTOR.message_types_by_name['MetainfoRequest'] = _METAINFOREQUEST -DESCRIPTOR.message_types_by_name['TransactionId'] = _TRANSACTIONID -DESCRIPTOR.message_types_by_name['ReadResponse'] = _READRESPONSE -DESCRIPTOR.message_types_by_name['Transactions'] = _TRANSACTIONS -DESCRIPTOR.message_types_by_name['MetainfoResponse'] = _METAINFORESPONSE -DESCRIPTOR.message_types_by_name['WriteResponse'] = _WRITERESPONSE -DESCRIPTOR.message_types_by_name['WriteData'] = _WRITEDATA -DESCRIPTOR.message_types_by_name['MetaOutputUnit'] = _METAOUTPUTUNIT -DESCRIPTOR.message_types_by_name['MetaOutputRange'] = _METAOUTPUTRANGE -DESCRIPTOR.message_types_by_name['MetaOutput'] = _METAOUTPUT -DESCRIPTOR.message_types_by_name['MetaLocation'] = _METALOCATION -_sym_db.RegisterFileDescriptor(DESCRIPTOR) - -ReadRequest = _reflection.GeneratedProtocolMessageType('ReadRequest', (_message.Message,), dict( - DESCRIPTOR = _READREQUEST, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.ReadRequest) - )) -_sym_db.RegisterMessage(ReadRequest) - -WriteRequest = _reflection.GeneratedProtocolMessageType('WriteRequest', (_message.Message,), dict( - DESCRIPTOR = _WRITEREQUEST, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.WriteRequest) - )) -_sym_db.RegisterMessage(WriteRequest) - -MetainfoRequest = _reflection.GeneratedProtocolMessageType('MetainfoRequest', (_message.Message,), dict( - DESCRIPTOR = _METAINFOREQUEST, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetainfoRequest) - )) -_sym_db.RegisterMessage(MetainfoRequest) - -TransactionId = _reflection.GeneratedProtocolMessageType('TransactionId', (_message.Message,), dict( - DESCRIPTOR = _TRANSACTIONID, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.TransactionId) - )) -_sym_db.RegisterMessage(TransactionId) - -ReadResponse = _reflection.GeneratedProtocolMessageType('ReadResponse', (_message.Message,), dict( - DESCRIPTOR = _READRESPONSE, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.ReadResponse) - )) -_sym_db.RegisterMessage(ReadResponse) - -Transactions = _reflection.GeneratedProtocolMessageType('Transactions', (_message.Message,), dict( - - TransactionsEntry = _reflection.GeneratedProtocolMessageType('TransactionsEntry', (_message.Message,), dict( - DESCRIPTOR = _TRANSACTIONS_TRANSACTIONSENTRY, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.Transactions.TransactionsEntry) - )) - , - DESCRIPTOR = _TRANSACTIONS, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.Transactions) - )) -_sym_db.RegisterMessage(Transactions) -_sym_db.RegisterMessage(Transactions.TransactionsEntry) - -MetainfoResponse = _reflection.GeneratedProtocolMessageType('MetainfoResponse', (_message.Message,), dict( - DESCRIPTOR = _METAINFORESPONSE, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetainfoResponse) - )) -_sym_db.RegisterMessage(MetainfoResponse) - -WriteResponse = _reflection.GeneratedProtocolMessageType('WriteResponse', (_message.Message,), dict( - DESCRIPTOR = _WRITERESPONSE, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.WriteResponse) - )) -_sym_db.RegisterMessage(WriteResponse) - -WriteData = _reflection.GeneratedProtocolMessageType('WriteData', (_message.Message,), dict( - DESCRIPTOR = _WRITEDATA, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.WriteData) - )) -_sym_db.RegisterMessage(WriteData) - -MetaOutputUnit = _reflection.GeneratedProtocolMessageType('MetaOutputUnit', (_message.Message,), dict( - DESCRIPTOR = _METAOUTPUTUNIT, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetaOutputUnit) - )) -_sym_db.RegisterMessage(MetaOutputUnit) - -MetaOutputRange = _reflection.GeneratedProtocolMessageType('MetaOutputRange', (_message.Message,), dict( - DESCRIPTOR = _METAOUTPUTRANGE, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetaOutputRange) - )) -_sym_db.RegisterMessage(MetaOutputRange) - -MetaOutput = _reflection.GeneratedProtocolMessageType('MetaOutput', (_message.Message,), dict( - DESCRIPTOR = _METAOUTPUT, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetaOutput) - )) -_sym_db.RegisterMessage(MetaOutput) - -MetaLocation = _reflection.GeneratedProtocolMessageType('MetaLocation', (_message.Message,), dict( - DESCRIPTOR = _METALOCATION, - __module__ = 'synse_pb2' - # @@protoc_insertion_point(class_scope:synse.MetaLocation) - )) -_sym_db.RegisterMessage(MetaLocation) - - -_TRANSACTIONS_TRANSACTIONSENTRY.has_options = True -_TRANSACTIONS_TRANSACTIONSENTRY._options = _descriptor._ParseOptions(descriptor_pb2.MessageOptions(), _b('8\001')) -try: - # THESE ELEMENTS WILL BE DEPRECATED. - # Please use the generated *_pb2_grpc.py files instead. - import grpc - from grpc.beta import implementations as beta_implementations - from grpc.beta import interfaces as beta_interfaces - from grpc.framework.common import cardinality - from grpc.framework.interfaces.face import utilities as face_utilities - - - class InternalApiStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Read = channel.unary_stream( - '/synse.InternalApi/Read', - request_serializer=ReadRequest.SerializeToString, - response_deserializer=ReadResponse.FromString, - ) - self.Write = channel.unary_unary( - '/synse.InternalApi/Write', - request_serializer=WriteRequest.SerializeToString, - response_deserializer=Transactions.FromString, - ) - self.Metainfo = channel.unary_stream( - '/synse.InternalApi/Metainfo', - request_serializer=MetainfoRequest.SerializeToString, - response_deserializer=MetainfoResponse.FromString, - ) - self.TransactionCheck = channel.unary_unary( - '/synse.InternalApi/TransactionCheck', - request_serializer=TransactionId.SerializeToString, - response_deserializer=WriteResponse.FromString, - ) - - - class InternalApiServicer(object): - # missing associated documentation comment in .proto file - pass - - def Read(self, request, context): - """Read from the specified device(s). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Write(self, request, context): - """Write to the specified device(s). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Metainfo(self, request, context): - """Get the metainformation from the background process that describes - all of the available devices which that process owns - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def TransactionCheck(self, request, context): - """Check on the state of a write transaction. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - - def add_InternalApiServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Read': grpc.unary_stream_rpc_method_handler( - servicer.Read, - request_deserializer=ReadRequest.FromString, - response_serializer=ReadResponse.SerializeToString, - ), - 'Write': grpc.unary_unary_rpc_method_handler( - servicer.Write, - request_deserializer=WriteRequest.FromString, - response_serializer=Transactions.SerializeToString, - ), - 'Metainfo': grpc.unary_stream_rpc_method_handler( - servicer.Metainfo, - request_deserializer=MetainfoRequest.FromString, - response_serializer=MetainfoResponse.SerializeToString, - ), - 'TransactionCheck': grpc.unary_unary_rpc_method_handler( - servicer.TransactionCheck, - request_deserializer=TransactionId.FromString, - response_serializer=WriteResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'synse.InternalApi', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - - class BetaInternalApiServicer(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - # missing associated documentation comment in .proto file - pass - def Read(self, request, context): - """Read from the specified device(s). - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def Write(self, request, context): - """Write to the specified device(s). - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def Metainfo(self, request, context): - """Get the metainformation from the background process that describes - all of the available devices which that process owns - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - def TransactionCheck(self, request, context): - """Check on the state of a write transaction. - """ - context.code(beta_interfaces.StatusCode.UNIMPLEMENTED) - - - class BetaInternalApiStub(object): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This class was generated - only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0.""" - # missing associated documentation comment in .proto file - pass - def Read(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Read from the specified device(s). - """ - raise NotImplementedError() - def Write(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Write to the specified device(s). - """ - raise NotImplementedError() - Write.future = None - def Metainfo(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Get the metainformation from the background process that describes - all of the available devices which that process owns - """ - raise NotImplementedError() - def TransactionCheck(self, request, timeout, metadata=None, with_call=False, protocol_options=None): - """Check on the state of a write transaction. - """ - raise NotImplementedError() - TransactionCheck.future = None - - - def beta_create_InternalApi_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_deserializers = { - ('synse.InternalApi', 'Metainfo'): MetainfoRequest.FromString, - ('synse.InternalApi', 'Read'): ReadRequest.FromString, - ('synse.InternalApi', 'TransactionCheck'): TransactionId.FromString, - ('synse.InternalApi', 'Write'): WriteRequest.FromString, - } - response_serializers = { - ('synse.InternalApi', 'Metainfo'): MetainfoResponse.SerializeToString, - ('synse.InternalApi', 'Read'): ReadResponse.SerializeToString, - ('synse.InternalApi', 'TransactionCheck'): WriteResponse.SerializeToString, - ('synse.InternalApi', 'Write'): Transactions.SerializeToString, - } - method_implementations = { - ('synse.InternalApi', 'Metainfo'): face_utilities.unary_stream_inline(servicer.Metainfo), - ('synse.InternalApi', 'Read'): face_utilities.unary_stream_inline(servicer.Read), - ('synse.InternalApi', 'TransactionCheck'): face_utilities.unary_unary_inline(servicer.TransactionCheck), - ('synse.InternalApi', 'Write'): face_utilities.unary_unary_inline(servicer.Write), - } - server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout) - return beta_implementations.server(method_implementations, options=server_options) - - - def beta_create_InternalApi_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None): - """The Beta API is deprecated for 0.15.0 and later. - - It is recommended to use the GA API (classes and functions in this - file not marked beta) for all further purposes. This function was - generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0""" - request_serializers = { - ('synse.InternalApi', 'Metainfo'): MetainfoRequest.SerializeToString, - ('synse.InternalApi', 'Read'): ReadRequest.SerializeToString, - ('synse.InternalApi', 'TransactionCheck'): TransactionId.SerializeToString, - ('synse.InternalApi', 'Write'): WriteRequest.SerializeToString, - } - response_deserializers = { - ('synse.InternalApi', 'Metainfo'): MetainfoResponse.FromString, - ('synse.InternalApi', 'Read'): ReadResponse.FromString, - ('synse.InternalApi', 'TransactionCheck'): WriteResponse.FromString, - ('synse.InternalApi', 'Write'): Transactions.FromString, - } - cardinalities = { - 'Metainfo': cardinality.Cardinality.UNARY_STREAM, - 'Read': cardinality.Cardinality.UNARY_STREAM, - 'TransactionCheck': cardinality.Cardinality.UNARY_UNARY, - 'Write': cardinality.Cardinality.UNARY_UNARY, - } - stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size) - return beta_implementations.dynamic_stub(channel, 'synse.InternalApi', cardinalities, options=stub_options) -except ImportError: - pass -# @@protoc_insertion_point(module_scope) diff --git a/python/synse_plugin/synse_pb2_grpc.py b/python/synse_plugin/synse_pb2_grpc.py deleted file mode 100644 index 503b188..0000000 --- a/python/synse_plugin/synse_pb2_grpc.py +++ /dev/null @@ -1,98 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -import grpc - -from . import synse_pb2 as synse__pb2 - - -class InternalApiStub(object): - # missing associated documentation comment in .proto file - pass - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Read = channel.unary_stream( - '/synse.InternalApi/Read', - request_serializer=synse__pb2.ReadRequest.SerializeToString, - response_deserializer=synse__pb2.ReadResponse.FromString, - ) - self.Write = channel.unary_unary( - '/synse.InternalApi/Write', - request_serializer=synse__pb2.WriteRequest.SerializeToString, - response_deserializer=synse__pb2.Transactions.FromString, - ) - self.Metainfo = channel.unary_stream( - '/synse.InternalApi/Metainfo', - request_serializer=synse__pb2.MetainfoRequest.SerializeToString, - response_deserializer=synse__pb2.MetainfoResponse.FromString, - ) - self.TransactionCheck = channel.unary_unary( - '/synse.InternalApi/TransactionCheck', - request_serializer=synse__pb2.TransactionId.SerializeToString, - response_deserializer=synse__pb2.WriteResponse.FromString, - ) - - -class InternalApiServicer(object): - # missing associated documentation comment in .proto file - pass - - def Read(self, request, context): - """Read from the specified device(s). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Write(self, request, context): - """Write to the specified device(s). - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def Metainfo(self, request, context): - """Get the metainformation from the background process that describes - all of the available devices which that process owns - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - def TransactionCheck(self, request, context): - """Check on the state of a write transaction. - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_InternalApiServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Read': grpc.unary_stream_rpc_method_handler( - servicer.Read, - request_deserializer=synse__pb2.ReadRequest.FromString, - response_serializer=synse__pb2.ReadResponse.SerializeToString, - ), - 'Write': grpc.unary_unary_rpc_method_handler( - servicer.Write, - request_deserializer=synse__pb2.WriteRequest.FromString, - response_serializer=synse__pb2.Transactions.SerializeToString, - ), - 'Metainfo': grpc.unary_stream_rpc_method_handler( - servicer.Metainfo, - request_deserializer=synse__pb2.MetainfoRequest.FromString, - response_serializer=synse__pb2.MetainfoResponse.SerializeToString, - ), - 'TransactionCheck': grpc.unary_unary_rpc_method_handler( - servicer.TransactionCheck, - request_deserializer=synse__pb2.TransactionId.FromString, - response_serializer=synse__pb2.WriteResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'synse.InternalApi', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) diff --git a/synse.proto b/synse.proto index f6b2e2c..1816c1e 100644 --- a/synse.proto +++ b/synse.proto @@ -3,211 +3,190 @@ syntax = "proto3"; package synse; -service InternalApi { +service Plugin { - // Read from the specified device(s). - rpc Read(ReadRequest) returns (stream ReadResponse) {} + // Test returns the status of the plugin. This call is intended to + // be used in order to check if a plugin is reachable. The status + // returned here designates plugin reachability, not plugin health. + rpc Test(Empty) returns (Status) {} - // Write to the specified device(s). - rpc Write(WriteRequest) returns (Transactions) {} + // Version returns the version info for the plugin. This is not used + // by Synse Server, but can be used by the CLI/manual plugin interaction. + rpc Version(Empty) returns (VersionInfo) {} - // Get the metainformation from the background process that describes - // all of the available devices which that process owns - rpc Metainfo(MetainfoRequest) returns (stream MetainfoResponse) {} + // Health returns the health status of a plugin. + rpc Health(Empty) returns (PluginHealth) {} - // Check on the state of a write transaction. - rpc TransactionCheck(TransactionId) returns (WriteResponse) {} + // Metainfo gets the metainfo for the plugin. This info provides details + // about the plugin itself. + rpc Metainfo(Empty) returns (Metadata) {} -} - - -// ------------------------------- -// Request Messages -// ------------------------------- + // Capabilities returns the collection of capabilities that a plugin + // exposes. More specifically, this means types of devices supported + // and the readings supported for each of those devices. + rpc Capabilities(Empty) returns (stream DeviceCapability) {} + // Devices gets info for all of the devices that the plugin manages. + // This rpc call is the plugin's equivalent to a Synse Server scan. + rpc Devices(DeviceFilter) returns (stream Device) {} -// Read -// ~~~~ -// the read request message contains the uuid of the device that -// we desire to read. the uuid of the device should be generated -// by the owning background process and should be returned to the -// synse application in the MetainfoResponse, which Synse will -// cache and use as a lookup table for routing requests. -message ReadRequest { + // Read returns the reading data for the specified device. + rpc Read(DeviceFilter) returns (stream Reading) {} - // the id of the device to read. this is generated by the plugin - // and returned via the `Metainfo` request under the `uid` field. - string device = 1; - - // the board identifier which the device belongs to. - string board = 2; + // Write issues an asynchronous write command to the specified device. + rpc Write(WriteInfo) returns (Transactions) {} - // the rack identifier which the board belongs to. - string rack = 3; + // Transactiong gets the state/status of an asynchronous write transaction. + rpc Transaction(TransactionFilter) returns (stream WriteResponse) {} } +// DeviceFilter is a message that specifies the routing information for +// a device. This can also be used as a filter for partial routing info +// by only specifying the rack or the rack+board. +message DeviceFilter { + // The rack identifier. + string rack = 1; -// Write -// ~~~~~ -// the write request message contains the uuid of the device that -// we desire to write to, as well as a repeated string (e.g. a -// list of strings in Python) which makes up the data that we -// which to write to that device. -message WriteRequest { - - // the id of the device to write to. this is generated by the - // plugin and returned via the `Metainfo` request under the - // `uid` field. - string device = 1; - - // the board identifier which the device belongs to. + // The board identifier. string board = 2; - // the rack identifier which the board belongs to. - string rack = 3; - - // the data to write. a given synse-server write request could - // actually be a composite of writes. for example, one can turn - // an LED on and change its color simultaneously via the Synse - // JSON API. each `WriteData` will get its own transaction id. - repeated WriteData data = 4; + // The device identifier. + string device = 3; } +// Empty is a message that contains no data. +message Empty {} -// Metainfo -// ~~~~~~~~ -// the metainfo request message contains a field for rack and board, -// but neither are required. if specified, the response will contain -// only information relating to the rack/board filter applied. if -// they are left unspecified, the response will contain the entirety -// of the metainfo scan information. -message MetainfoRequest { - - // the rack filter for the meta information response. - string rack = 1; - - // the board filter for the meta information response. - string board = 2; +// Status is the response of the `Test` rpc call. In general, it should +// always return with the 'ok' field being true. +message Status { + bool ok = 1; } +// PluginHealth is the response to the `Health` rpc call. It provides a +// health status summarizing the plugin's health, as well as a list of the +// `HealthCheck`s which make up that status. +message PluginHealth { + enum Status { + UNKNOWN = 0; + OK = 1; + PARTIALLY_DEGRADED = 3; + FAILING = 4; + } -// TransactionCheck -// ~~~~~~~~~~~~~~~~ -// the transaction id gives identity to a single 'write' action. since -// device writes are handled asynchronously, the background process -// returns the transaction id when a write is registered, which the -// caller can later pass back to `TransactionCheck` to get the status -// of that write. -message TransactionId { + // The time that the health was checked. + string timestamp = 1; - // the id of a write transaction. this is returned by the write - // commands `Transactions` response. - string id = 1; + // The overall health status. + Status status = 2; + // All the health checks of the plugin that make up the overall health. + repeated HealthCheck checks = 3; } +// HealthCheck is an individual health metric that makes up the plugin health. +message HealthCheck { + // The name of the health check. + string name = 1; -// ------------------------------- -// Response Messages -// ------------------------------- + // The status of the health check. + PluginHealth.Status status = 2; + // Any additional info associated with the health check. + string message = 3; -// Read -// ~~~~ -// the read response provides the timestamp at which the reading was -// taken, the type of the reading (e.g. temperature, humidity, led -// state, etc.), and the value of that reading. read responses are -// returned to the client as a stream, so a single device can return -// multiple readings. (e.g. a humidity sensor can return a %humidity -// reading and a temperature reading). -message ReadResponse { + // The time at which the health check was completed. + string timestamp = 4; - // the time which the reading was taken. - string timestamp = 1; + // The type of the health check. These are left as arbitrary strings + // instead of enums to make it easier to support new types of health + // checks in the future, without having to update the GRPC API. + string type = 5; +} - // the type of reading. - string type = 2; +// DeviceCapability identifies a device kind and the potential kinds of readings +// that it supports. +message DeviceCapability { + // The kind/type of the device. + string kind = 1; - // the value of the reading. - string value = 3; + // The outputs that the device supports. + repeated string outputs = 2; } +// Metadata is the response to the `Metainfo` rpc call. +message Metadata { + string name = 1; + string maintainer = 2; + string tag = 3; + string description = 4; + string vcs = 5; -// Write -// ~~~~~ -// the transactions message specifies the asynchronous transactions for -// each of the given write actions. each transaction identifies a single -// write action with a unique transaction id and context to help identify -// which transaction that id is associated with. the transaction id can -// later be passed back to `TransactionCheck` to get the status of that -// write. -message Transactions { - - // a map where the key is the transaction id for a given `WriteData` - // message that has been processed, and the value is that same - // `WriteData` message. the `WriteData` message is passed back in - // order to provide some context and make identifying transactions - // possible. the number of entries in the transactions map corresponds - // to the number of `WriteData` recieved in a `WriteRequest`. - map transactions = 1; + VersionInfo version = 6; } +// VersionInfo is the response to the `Version` rpc call. +message VersionInfo { + string pluginVersion = 1; + string sdkVersion = 2; + string buildDate = 3; + string gitCommit = 4; + string gitTag = 5; + string arch = 6; + string os = 7; +} -// Metainfo -// ~~~~~~~~ -// the metainfo response represents a single device that is owned by -// the process. metainfo responses are returned to the client as a stream -// so a background process can support any number of devices. the response -// itself contains a timestamp for when the response was generated, an -// for the device, and all other meta-information we have pertaining to -// that device. the caller, Synse, will cache this information and use it -// to route requests to the appropriate device as well as provide responses -// for scan and info requests. -message MetainfoResponse { - - // the time at which the metainfo was gathered. +// Reading is the response to the `Read` rpc call. +message Reading { + // The time which the reading was taken. string timestamp = 1; - // the unique id for the device this response represents. - string uid = 2; - - // the device type. - string type = 3; - - // the device model. - string model = 4; - - // the device manufacturer. - string manufacturer = 5; + // The type of reading. + string type = 2; - // the protocol that the device is configured to use. - string protocol = 6; + // Any info associated with the reading. + string info = 3; + + // The unit of the reading. + Unit unit = 4; + + // The value of the reading. + oneof value { + string string_value = 5; + bool bool_value = 6; + float float32_value = 7; + double float64_value = 8; + int32 int32_value = 9; + int64 int64_value = 10; + bytes bytes_value = 11; + uint32 uint32_value = 12; + uint64 uint64_value = 13; + } +} - // any additional information specified for the device. - string info = 7; +// WriteInfo is the request message for the `Write` rpc call. It specifies a +// filter for the device to write to, as well as actions/data for the write. +message WriteInfo { + // The specifier for the device to write to. + DeviceFilter deviceFilter = 1; - // any comment specified for the device. - string comment = 8; + // The data to write to the device. + repeated WriteData data = 2; +} - // the location of the device, as specified by rack and board - // identifiers. - MetaLocation location = 9; +// WriteData is the data that gets written on a `Write` rpc call. +message WriteData { + // The action string for the device write. + string action = 1; - // the reading output of the device. this specifies all of the - // outputs a device will generate when read. most devices will have - // a single output, but some devices (e.g. a humidity sensor) could - // return multiple data points from a single reading. (e.g. - // temperature and humidity). - repeated MetaOutput output = 10; + // The data to write. + bytes data = 2; } - -// TransactionCheck -// ~~~~~~~~~~~~~~~~ -// the response for a transaction check command gives the status of the -// transaction. transactions correspond to write requests. since writes -// are performed asynchronously, the transaction id is used to track the -// progress of that transaction. +// WriteResponse is the response for a `Transaction` rpc call. It gives the +// status of the transaction. Transactions correspond with write requests. +// Since writes are performed asynchronously, the transaction id is used to +// track the progress of that transaction. message WriteResponse { enum WriteStatus { @@ -222,101 +201,123 @@ message WriteResponse { ERROR = 1; } - // the time at which the write transaction was created. - string created = 1; + // The id of the write transaction. + string id = 1; + + // The time at which the write transaction was created. + string created = 2; - // the time at which the write transaction was last updated (either - // for an update to state or status). - string updated = 2; + // The time at which the write transaction state/status was last updated. + string updated = 3; - // the status of the transaction. this describes what stage of - // processing the transaction is at. - WriteStatus status = 3; + // The status of the transaction. This describes what stage of processing + // the transaction is at. + WriteStatus status = 4; - // the state of the transaction. this describes the so called "health" + // The state of the transaction. This describes the so called "health" // of the transaction. - WriteState state = 4; + WriteState state = 5; - // the message field will be used to specify any context information - // when the state is in ERROR. if the state is OK, this field will + // The message field will be used to specify any context information + // when the state is ERROR. If the state is OK, this field will // remain empty. - string message = 5; + string message = 6; } +// TransactionFilter is a filter for transaction checks. If its id field is +// set, the plugin will only check the state for that transaction. If the id +// field is empty, the plugin will return the state for all active transactions. +message TransactionFilter { -// ------------------------------- -// Message Components -// ------------------------------- + // The id of the transaction to check. + string id = 1; +} +// Transactions specifies the asynchronous transactions for each of the writes +// for a `Write` rpc call. Each transaction identifies a single write action +// with a unique transaction id and context to help identify which transaction +// that id corresponds to. +// +// The transaction id can later be passed back to the `Transaction` rpc call +// to get the status of that write. +message Transactions { -// Specifies the data that gets written on a `WriteRequest`. This is a -// composite of raw bytes and an action string. Both of the fields can -// be specified, or only one of them. In cases where no action is supplied, -// the plugin can take the raw data as raw bytes to write to the device. -// There may be cases when only an action is supplied, such as "on" for -// turning an LED on (which the plugin can then interpret for its protocol). -// Both can be specified, such as changing the color of an LED where the -// raw bytes can specify the color itself and the action could be "color", -// differentiating it from a write to LED blink state, etc. -message WriteData { + // A map where the key is the transaction id for a `WriteData` within the + // `WriteInfo`, and the value is that same `WriteData`, provided as context. + map transactions = 1; +} - // raw bytes to send to the plugin for writing. - repeated bytes raw = 1; +// Device is the response to the `Devices` rpc call. It provides all of the +// info that describes a device. This is used by Synse Server for its 'scan' +// and 'info' endpoints. +message Device { + // The time at which the device info was gathered. + string timestamp = 1; - // a (well-known) action identifier. - string action = 2; -} + // The unique id for the device. + string uid = 2; + // The device kind. This can also be thought of as 'device type'. + string kind = 3; -// the unit specification for a reading output. -message MetaOutputUnit { + // Any metadata associated with the device. + map metadata = 4; - // the full name of the unit, e.g. "degrees celsius". - string name = 1; + // The name of the plugin that the device is managed by. + string plugin = 5; - // the symbol for the unit, e.g. "C". - string symbol = 2; -} + // Any additional information specified for the device. + string info = 6; + + // The location of the device, as specified by rack and board + // identifiers. + Location location = 7; + // The reading output of the device. This specifies all of the + // outputs a device can generate when read. Many devices will have + // a single output, but some devices (e.g. a humidity sensor) could + // return multiple data points from a single reading (e.g. + // temperature and humidity). + repeated Output output = 8; +} -// the value range specification for a reading output. -message MetaOutputRange { +// Location is the location specification for a device. +message Location { - // the minimum allowable value for a numeric reading. - int32 min = 1; + // The rack which the device belongs to. + string rack = 1; - // the maximum allowable value for a numeric reading. - int32 max = 2; + // The board which the device belongs to. + string board = 2; } -// the specification for one of a device's reading outputs. -message MetaOutput { +// Output is the specification for one of a device's reading outputs. +message Output { - // the type of the reading output (e.g. 'temperature', - // 'humidity', etc). - string type = 1; + // The name of the output. This is namespaced. + string name = 1; - // the data type of the output (e.g. int, string, bool). - string data_type = 2; + // The type of the output. This is the last element of the namespace. + string type = 2; - // the decimal precision of the output. if the output is - // non-numeric, this can be left unspecified and will be - // ignored. + // The decimal precision of the output. This is ignored if the output + // dataType is not a float. int32 precision = 3; - // the unit of measure for the reading. - MetaOutputUnit unit = 4; + // The scaling factor to multiply the reading result by. This can be + // positive or negative, whole or decimal. + double scalingFactor = 4; - // the acceptable range of values for the reading. - MetaOutputRange range = 5; + // The unit of measure for the reading. + Unit unit = 5; } -// the location specification for a device. -message MetaLocation { +// Unit is the unit specification for a reading output. +message Unit { - // the rack which the device belongs to. - string rack = 1; + // The full name of the unit, e.g. "degrees celsius". + string name = 1; - // the board which the device belongs to. - string board = 2; + // The symbol for the unit, e.g. "C". + string symbol = 2; }