SEBA-349 GRPC
added xos proto files

Change-Id: I59feae392782331d11e1ac506c18f772ccfb8898
diff --git a/contrib/schema/schema.proto b/contrib/schema/schema.proto
new file mode 100644
index 0000000..d6e4e01
--- /dev/null
+++ b/contrib/schema/schema.proto
@@ -0,0 +1,38 @@
+syntax = "proto3";
+
+package schema;
+
+import "google/protobuf/empty.proto";
+import "annotations.proto";
+
+// Contains the name and content of a *.proto file
+message ProtoFile {
+    string file_name = 1;  // name of proto file
+    string proto = 2;  // content of proto file
+    bytes descriptor = 3;  // compiled descriptor for proto (zlib compressed)
+}
+
+// Proto files and compiled descriptors for this interface
+message Schemas {
+
+    // Proto files
+    repeated ProtoFile protos = 1;
+
+    // Proto file name from which swagger.json shall be generated
+    string swagger_from = 2;
+
+    // Proto file name from which yang schemas shall be generated
+    string yang_from = 3;
+}
+
+// Schema services
+service SchemaService {
+
+    // Return active grpc schemas
+    rpc GetSchema(google.protobuf.Empty) returns (Schemas) {
+        option (googleapi.http) = {
+            get: "/schema"
+        };
+    }
+
+}
diff --git a/contrib/xos/annotations.proto b/contrib/xos/annotations.proto
new file mode 100644
index 0000000..2ed81a6
--- /dev/null
+++ b/contrib/xos/annotations.proto
@@ -0,0 +1,34 @@
+// Copyright (c) 2015, Google Inc.
+// Modififications (C) 2018, Open Networking Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// See NOTE in http.proto for the modifications made to these files
+
+syntax = "proto3";
+
+package googleapi;
+
+import "http.proto";
+import "google/protobuf/descriptor.proto";
+
+option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations";
+option java_multiple_files = true;
+option java_outer_classname = "AnnotationsProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+extend google.protobuf.MethodOptions {
+  // See `HttpRule`.
+  HttpRule http = 72295728;
+}
diff --git a/contrib/xos/common.proto b/contrib/xos/common.proto
new file mode 100644
index 0000000..5f82f7d
--- /dev/null
+++ b/contrib/xos/common.proto
@@ -0,0 +1,39 @@
+syntax = "proto3";
+
+package xos;
+
+message ID {
+    int32 id = 1;
+}
+
+message QueryElement {
+    enum QueryOperator {
+        EQUAL = 0;
+        GREATER_THAN = 1;
+        LESS_THAN = 2;
+        GREATER_THAN_OR_EQUAL = 3;
+        LESS_THAN_OR_EQUAL = 4;
+        IEXACT = 5;
+    }
+    QueryOperator operator = 1;
+    bool invert = 2;
+    string name = 3;
+    oneof value {
+        string sValue = 4;
+        int32 iValue = 5;
+    }
+};
+
+message Query {
+    enum QueryKind {
+        DEFAULT=0;
+        ALL=1;
+        SYNCHRONIZER_DIRTY_OBJECTS = 2;
+        SYNCHRONIZER_DELETED_OBJECTS = 3;
+        SYNCHRONIZER_DIRTY_POLICIES = 4;
+        SYNCHRONIZER_DELETED_POLICIES = 5;
+    }
+    QueryKind kind = 1;
+    repeated QueryElement elements = 2;
+};
+
diff --git a/contrib/xos/dynamicload.proto b/contrib/xos/dynamicload.proto
new file mode 100644
index 0000000..0279f71
--- /dev/null
+++ b/contrib/xos/dynamicload.proto
@@ -0,0 +1,90 @@
+syntax = "proto3";
+
+package xos;
+
+import "google/protobuf/empty.proto";
+import "annotations.proto";
+
+message Xproto {
+    string filename = 1;
+    string contents = 2;
+}
+
+message DeclFile {
+    string filename = 1;
+    string contents = 2;
+};
+
+message AtticFile {
+    string filename = 1;
+    string contents = 2;
+};
+
+message APIConvenienceFile {
+    string filename = 1;
+    string contents = 2;
+};
+
+message LoadModelsRequest {
+    string name = 1;
+    string version = 2;
+    repeated Xproto xprotos = 3;
+    repeated DeclFile decls = 4;
+    repeated AtticFile attics = 5;
+    repeated APIConvenienceFile convenience_methods = 6;
+};
+
+message ListConvenienceMethodsReply {
+    repeated APIConvenienceFile convenience_methods = 1;
+}
+
+message LoadModelsReply {
+    enum LoadModelsStatus {
+        SUCCESS = 0;
+        ERROR = 1;
+    }
+    LoadModelsStatus status = 1;
+};
+
+message UnloadModelsRequest {
+    string name = 1;
+    string version = 2;
+};
+
+message ServiceModelStatus {
+    string name = 1;
+    string version = 2;
+    string state = 3;
+};
+
+message LoadStatusReply {
+    int32 model_status = 1;
+    string model_output = 2;
+    repeated ServiceModelStatus services = 3;
+}
+
+service dynamicload {
+  rpc LoadModels(LoadModelsRequest) returns (LoadModelsReply) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/dynamicload/load_models"
+            body: "*"
+        };
+  }
+  rpc UnloadModels(UnloadModelsRequest) returns (LoadModelsReply) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/dynamicload/unload_models"
+            body: "*"
+        };
+  }
+  rpc GetLoadStatus(google.protobuf.Empty) returns (LoadStatusReply) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/dynamicload/load_status"
+        };
+  }
+  rpc GetConvenienceMethods(google.protobuf.Empty) returns (ListConvenienceMethodsReply) {
+        option (googleapi.http) = {
+            // NOTE do we need to expose this via rest? maybe for debug...
+            get: "/xosapi/v1/dynamicload/convenience_methods"
+        };
+  }
+};
diff --git a/contrib/xos/http.proto b/contrib/xos/http.proto
new file mode 100644
index 0000000..99d0ce3
--- /dev/null
+++ b/contrib/xos/http.proto
@@ -0,0 +1,353 @@
+// Copyright 2018 Google LLC
+// Modififications (C) 2018, Open Networking Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// NOTE: On the provenance of and modifications to http.proto and
+// annotations.proto
+//
+// TL;DR: The files http.proto and annotations.proto are originally from here:
+//  https://github.com/googleapis/googleapis
+// They have been modified slightly to avoid a namespace conflict.
+//
+// Long winded explanation:
+// These files are designed to interact with Google's first party API's, and
+// the recommended way to use them is to compiled them to code with protoc and
+// included in your codebase before being used.  Due to the fact that we're not
+// using them that way, and because of how Chameleon and XOS work (dynamically
+// defining our own API's), we have to ship these *.proto files as a part of
+// our artifacts.
+//
+// The problems start when you try to include these specific .proto files in
+// python. The protoc compiler includes the `google.protobuf` classes, which
+// python can look up in the standard python library path. Unfortunately these
+// files are namespaced with `google.api` in the path and aren't shipped with
+// protoc.  This leads to a path conflict - you can't have two library paths
+// start with the same path component (`google` in this case) without getting
+// an "ImportError: No module named ..." on one of the paths when you import
+// them.
+//
+// Historically, various confusing hacks were implemented to override and
+// special-case the python `include` directive to include a file at a different
+// path than was specified. These hacks also failed when updating the base OS,
+// and would likely continue to fail in other, stranger ways as we update the
+// codebase.  Specifically, Python 3 reimplemented these features in the
+// importlib section of the standard library, so there's little confidence our
+// hacks would continue to work.  As an aside, there are various protobuf
+// `options` statements to deal with this sort of issue in other languages (see
+// the `go_package` and `java_package` below ) but these don't currently exist
+// for python: https://github.com/google/protobuf/issues/973
+//
+// To avoid this entire psychotic namespace hellscape, it's much easier to
+// modify these files to remove the google.api path component, and have them
+// included directly at a path of our own choice.
+
+syntax = "proto3";
+
+package googleapi;
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations";
+option java_multiple_files = true;
+option java_outer_classname = "HttpProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+
+// Defines the HTTP configuration for an API service. It contains a list of
+// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method
+// to one or more HTTP REST API methods.
+message Http {
+  // A list of HTTP configuration rules that apply to individual API methods.
+  //
+  // **NOTE:** All service configuration rules follow "last one wins" order.
+  repeated HttpRule rules = 1;
+
+  // When set to true, URL path parmeters will be fully URI-decoded except in
+  // cases of single segment matches in reserved expansion, where "%2F" will be
+  // left encoded.
+  //
+  // The default behavior is to not decode RFC 6570 reserved characters in multi
+  // segment matches.
+  bool fully_decode_reserved_expansion = 2;
+}
+
+// `HttpRule` defines the mapping of an RPC method to one or more HTTP
+// REST API methods. The mapping specifies how different portions of the RPC
+// request message are mapped to URL path, URL query parameters, and
+// HTTP request body. The mapping is typically specified as an
+// `google.api.http` annotation on the RPC method,
+// see "google/api/annotations.proto" for details.
+//
+// The mapping consists of a field specifying the path template and
+// method kind.  The path template can refer to fields in the request
+// message, as in the example below which describes a REST GET
+// operation on a resource collection of messages:
+//
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http).get = "/v1/messages/{message_id}/{sub.subfield}";
+//       }
+//     }
+//     message GetMessageRequest {
+//       message SubMessage {
+//         string subfield = 1;
+//       }
+//       string message_id = 1; // mapped to the URL
+//       SubMessage sub = 2;    // `sub.subfield` is url-mapped
+//     }
+//     message Message {
+//       string text = 1; // content of the resource
+//     }
+//
+// The same http annotation can alternatively be expressed inside the
+// `GRPC API Configuration` YAML file.
+//
+//     http:
+//       rules:
+//         - selector: <proto_package_name>.Messaging.GetMessage
+//           get: /v1/messages/{message_id}/{sub.subfield}
+//
+// This definition enables an automatic, bidrectional mapping of HTTP
+// JSON to RPC. Example:
+//
+// HTTP | RPC
+// -----|-----
+// `GET /v1/messages/123456/foo`  | `GetMessage(message_id: "123456" sub: SubMessage(subfield: "foo"))`
+//
+// In general, not only fields but also field paths can be referenced
+// from a path pattern. Fields mapped to the path pattern cannot be
+// repeated and must have a primitive (non-message) type.
+//
+// Any fields in the request message which are not bound by the path
+// pattern automatically become (optional) HTTP query
+// parameters. Assume the following definition of the request message:
+//
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http).get = "/v1/messages/{message_id}";
+//       }
+//     }
+//     message GetMessageRequest {
+//       message SubMessage {
+//         string subfield = 1;
+//       }
+//       string message_id = 1; // mapped to the URL
+//       int64 revision = 2;    // becomes a parameter
+//       SubMessage sub = 3;    // `sub.subfield` becomes a parameter
+//     }
+//
+//
+// This enables a HTTP JSON to RPC mapping as below:
+//
+// HTTP | RPC
+// -----|-----
+// `GET /v1/messages/123456?revision=2&sub.subfield=foo` | `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield: "foo"))`
+//
+// Note that fields which are mapped to HTTP parameters must have a
+// primitive type or a repeated primitive type. Message types are not
+// allowed. In the case of a repeated type, the parameter can be
+// repeated in the URL, as in `...?param=A&param=B`.
+//
+// For HTTP method kinds which allow a request body, the `body` field
+// specifies the mapping. Consider a REST update method on the
+// message resource collection:
+//
+//
+//     service Messaging {
+//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//           put: "/v1/messages/{message_id}"
+//           body: "message"
+//         };
+//       }
+//     }
+//     message UpdateMessageRequest {
+//       string message_id = 1; // mapped to the URL
+//       Message message = 2;   // mapped to the body
+//     }
+//
+//
+// The following HTTP JSON to RPC mapping is enabled, where the
+// representation of the JSON in the request body is determined by
+// protos JSON encoding:
+//
+// HTTP | RPC
+// -----|-----
+// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" message { text: "Hi!" })`
+//
+// The special name `*` can be used in the body mapping to define that
+// every field not bound by the path template should be mapped to the
+// request body.  This enables the following alternative definition of
+// the update method:
+//
+//     service Messaging {
+//       rpc UpdateMessage(Message) returns (Message) {
+//         option (google.api.http) = {
+//           put: "/v1/messages/{message_id}"
+//           body: "*"
+//         };
+//       }
+//     }
+//     message Message {
+//       string message_id = 1;
+//       string text = 2;
+//     }
+//
+//
+// The following HTTP JSON to RPC mapping is enabled:
+//
+// HTTP | RPC
+// -----|-----
+// `PUT /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id: "123456" text: "Hi!")`
+//
+// Note that when using `*` in the body mapping, it is not possible to
+// have HTTP parameters, as all fields not bound by the path end in
+// the body. This makes this option more rarely used in practice of
+// defining REST APIs. The common usage of `*` is in custom methods
+// which don't use the URL at all for transferring data.
+//
+// It is possible to define multiple HTTP methods for one RPC by using
+// the `additional_bindings` option. Example:
+//
+//     service Messaging {
+//       rpc GetMessage(GetMessageRequest) returns (Message) {
+//         option (google.api.http) = {
+//           get: "/v1/messages/{message_id}"
+//           additional_bindings {
+//             get: "/v1/users/{user_id}/messages/{message_id}"
+//           }
+//         };
+//       }
+//     }
+//     message GetMessageRequest {
+//       string message_id = 1;
+//       string user_id = 2;
+//     }
+//
+//
+// This enables the following two alternative HTTP JSON to RPC
+// mappings:
+//
+// HTTP | RPC
+// -----|-----
+// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
+// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id: "123456")`
+//
+// # Rules for HTTP mapping
+//
+// The rules for mapping HTTP path, query parameters, and body fields
+// to the request message are as follows:
+//
+// 1. The `body` field specifies either `*` or a field path, or is
+//    omitted. If omitted, it indicates there is no HTTP request body.
+// 2. Leaf fields (recursive expansion of nested messages in the
+//    request) can be classified into three types:
+//     (a) Matched in the URL template.
+//     (b) Covered by body (if body is `*`, everything except (a) fields;
+//         else everything under the body field)
+//     (c) All other fields.
+// 3. URL query parameters found in the HTTP request are mapped to (c) fields.
+// 4. Any body sent with an HTTP request can contain only (b) fields.
+//
+// The syntax of the path template is as follows:
+//
+//     Template = "/" Segments [ Verb ] ;
+//     Segments = Segment { "/" Segment } ;
+//     Segment  = "*" | "**" | LITERAL | Variable ;
+//     Variable = "{" FieldPath [ "=" Segments ] "}" ;
+//     FieldPath = IDENT { "." IDENT } ;
+//     Verb     = ":" LITERAL ;
+//
+// The syntax `*` matches a single path segment. The syntax `**` matches zero
+// or more path segments, which must be the last part of the path except the
+// `Verb`. The syntax `LITERAL` matches literal text in the path.
+//
+// The syntax `Variable` matches part of the URL path as specified by its
+// template. A variable template must not contain other variables. If a variable
+// matches a single path segment, its template may be omitted, e.g. `{var}`
+// is equivalent to `{var=*}`.
+//
+// If a variable contains exactly one path segment, such as `"{var}"` or
+// `"{var=*}"`, when such a variable is expanded into a URL path, all characters
+// except `[-_.~0-9a-zA-Z]` are percent-encoded. Such variables show up in the
+// Discovery Document as `{var}`.
+//
+// If a variable contains one or more path segments, such as `"{var=foo/*}"`
+// or `"{var=**}"`, when such a variable is expanded into a URL path, all
+// characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. Such variables
+// show up in the Discovery Document as `{+var}`.
+//
+// NOTE: While the single segment variable matches the semantics of
+// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2
+// Simple String Expansion, the multi segment variable **does not** match
+// RFC 6570 Reserved Expansion. The reason is that the Reserved Expansion
+// does not expand special characters like `?` and `#`, which would lead
+// to invalid URLs.
+//
+// NOTE: the field paths in variables and in the `body` must not refer to
+// repeated fields or map fields.
+message HttpRule {
+  // Selects methods to which this rule applies.
+  //
+  // Refer to [selector][google.api.DocumentationRule.selector] for syntax details.
+  string selector = 1;
+
+  // Determines the URL pattern is matched by this rules. This pattern can be
+  // used with any of the {get|put|post|delete|patch} methods. A custom method
+  // can be defined using the 'custom' field.
+  oneof pattern {
+    // Used for listing and getting information about resources.
+    string get = 2;
+
+    // Used for updating a resource.
+    string put = 3;
+
+    // Used for creating a resource.
+    string post = 4;
+
+    // Used for deleting a resource.
+    string delete = 5;
+
+    // Used for updating a resource.
+    string patch = 6;
+
+    // The custom pattern is used for specifying an HTTP method that is not
+    // included in the `pattern` field, such as HEAD, or "*" to leave the
+    // HTTP method unspecified for this rule. The wild-card rule is useful
+    // for services that provide content to Web (HTML) clients.
+    CustomHttpPattern custom = 8;
+  }
+
+  // The name of the request field whose value is mapped to the HTTP body, or
+  // `*` for mapping all fields not captured by the path pattern to the HTTP
+  // body. NOTE: the referred field must not be a repeated field and must be
+  // present at the top-level of request message type.
+  string body = 7;
+
+  // Additional HTTP bindings for the selector. Nested bindings must
+  // not contain an `additional_bindings` field themselves (that is,
+  // the nesting may only be one level deep).
+  repeated HttpRule additional_bindings = 11;
+}
+
+// A custom pattern is used for defining custom HTTP verb.
+message CustomHttpPattern {
+  // The name of this custom HTTP verb.
+  string kind = 1;
+
+  // The path matched by this custom verb.
+  string path = 2;
+}
diff --git a/contrib/xos/modeldefs.proto b/contrib/xos/modeldefs.proto
new file mode 100644
index 0000000..1df3234
--- /dev/null
+++ b/contrib/xos/modeldefs.proto
@@ -0,0 +1,61 @@
+syntax = "proto3";
+
+package xos;
+
+import "google/protobuf/empty.proto";
+import "annotations.proto";
+
+// This API is used by the UI to validate fields.
+
+message FieldValidator {
+    string name = 1;
+    oneof val_value {
+        bool bool_value = 2;
+        int64 int_value = 3;
+        string str_value = 4;
+    };
+};
+
+message FieldOption {
+    string id = 1;
+    string label = 2;
+}
+
+message FieldRelation {
+    string model = 1;
+    string type = 2;
+    string on_field = 3;
+};
+
+message ModelField {
+    string name = 1;
+    string hint = 2;
+    string type = 3;
+    FieldRelation relation = 4;
+    repeated FieldValidator validators = 5;
+    repeated FieldOption options = 6;
+    string default = 7;
+    bool read_only = 8;
+};
+
+message ModelDef {
+    string name = 1;
+    repeated ModelField fields = 2;
+    repeated FieldRelation relations = 3;
+    string app = 4;
+    string verbose_name = 5;
+    string description = 6;
+};
+
+message ModelDefs {
+    repeated ModelDef items = 1;
+};
+
+service modeldefs {
+
+  rpc ListModelDefs(google.protobuf.Empty) returns (ModelDefs) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/modeldefs"
+        };
+  }
+};
diff --git a/contrib/xos/seba.proto b/contrib/xos/seba.proto
new file mode 100644
index 0000000..55a0892
--- /dev/null
+++ b/contrib/xos/seba.proto
@@ -0,0 +1,2531 @@
+syntax = "proto3";
+
+package xos;
+
+import "google/protobuf/empty.proto";
+import "annotations.proto";
+import "common.proto";
+import "xosoptions.proto";
+
+// Note: all fields are wrapped in a "oneof". This causes proto3 to always send
+// fields that are set by the caller, regardless if they are set to a default
+// value. XOS uses this to know when to apply a default value.
+
+
+message AttWorkflowDriverService {
+    option (contentTypeId) = "att-workflow-driver.attworkflowdriverservice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof description_present {
+      string description = 101 [(val).maxLength = 254];
+    }
+    oneof enabled_present {
+      bool enabled = 102 [(val).nonNull = true];
+    }
+    oneof kind_present {
+      string kind = 103 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof name_present {
+      string name = 104 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof versionNumber_present {
+      string versionNumber = 105 [(val).maxLength = 30];
+    }
+    oneof published_present {
+      bool published = 106 [(val).nonNull = true];
+    }
+    oneof icon_url_present {
+      string icon_url = 108 [(val).maxLength = 1024];
+    }
+    oneof public_key_present {
+      string public_key = 109 [(val).maxLength = 4096];
+    }
+    oneof private_key_fn_present {
+      string private_key_fn = 110 [(val).maxLength = 4096];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 111 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 112 ;
+    }
+    repeated int32 addresspools_ids  = 1001 [(reverseForeignKey).modelName = "AddressPool"];
+    repeated int32 serviceports_ids  = 1002 [(reverseForeignKey).modelName = "ServicePort"];
+    repeated int32 serviceattributes_ids  = 1003 [(reverseForeignKey).modelName = "ServiceAttribute"];
+    repeated int32 provided_dependencies_ids  = 1004 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 subscribed_dependencies_ids  = 1005 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 slices_ids  = 1006 [(reverseForeignKey).modelName = "Slice"];
+    repeated int32 tags_ids  = 1007 [(reverseForeignKey).modelName = "Tag"];
+    repeated int32 service_interfaces_ids  = 1008 [(reverseForeignKey).modelName = "ServiceInterface"];
+    repeated int32 service_instances_ids  = 1009 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 subscribed_links_ids  = 1010 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 owned_trust_domains_ids  = 1011 [(reverseForeignKey).modelName = "TrustDomain"];
+    repeated int32 whitelist_entries_ids  = 1101 [(reverseForeignKey).modelName = "AttWorkflowDriverWhiteListEntry"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message AttWorkflowDriverServices {
+    repeated AttWorkflowDriverService items = 1;
+}
+
+message AttWorkflowDriverServiceInstance {
+    option (contentTypeId) = "att-workflow-driver.attworkflowdriverserviceinstance";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 [(val).maxLength = 200];
+    }
+    oneof owner_present {
+      int32 owner_id = 102 [(val).nonNull = true, (foreignKey).modelName = "Service", (foreignKey).reverseFieldName = "service_instances"];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 103 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 110 ;
+    }
+    oneof link_deleted_count_present {
+      uint32 link_deleted_count = 111 ;
+    }
+    oneof master_serviceinstance_present {
+      int32 master_serviceinstance_id = 112 [(foreignKey).modelName = "ServiceInstance", (foreignKey).reverseFieldName = "child_serviceinstances"];
+    }
+    oneof serial_number_present {
+      string serial_number = 202 [(val).maxLength = 254];
+    }
+    oneof authentication_state_present {
+      string authentication_state = 203 [(val).maxLength = 50];
+    }
+    oneof of_dpid_present {
+      string of_dpid = 204 [(val).maxLength = 254];
+    }
+    oneof uni_port_id_present {
+      int32 uni_port_id = 205 ;
+    }
+    oneof onu_state_present {
+      string onu_state = 206 [(val).maxLength = 254];
+    }
+    oneof status_message_present {
+      string status_message = 207 [(val).maxLength = 254];
+    }
+    oneof dhcp_state_present {
+      string dhcp_state = 208 [(val).maxLength = 254];
+    }
+    oneof ip_address_present {
+      string ip_address = 209 [(val).maxLength = 20];
+    }
+    oneof mac_address_present {
+      string mac_address = 210 [(val).maxLength = 20];
+    }
+    repeated int32 ports_ids  = 1001 [(reverseForeignKey).modelName = "Port"];
+    repeated int32 child_serviceinstances_ids  = 1002 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 provided_links_ids  = 1003 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 subscribed_links_ids  = 1005 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 service_instance_attributes_ids  = 1006 [(reverseForeignKey).modelName = "ServiceInstanceAttribute"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message AttWorkflowDriverServiceInstances {
+    repeated AttWorkflowDriverServiceInstance items = 1;
+}
+
+message AttWorkflowDriverWhiteListEntry {
+    option (contentTypeId) = "att-workflow-driver.attworkflowdriverwhitelistentry";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof owner_present {
+      int32 owner_id = 101 [(foreignKey).modelName = "AttWorkflowDriverService", (foreignKey).reverseFieldName = "whitelist_entries"];
+    }
+    oneof serial_number_present {
+      string serial_number = 102 [(val).maxLength = 254];
+    }
+    oneof pon_port_id_present {
+      int32 pon_port_id = 103 ;
+    }
+    oneof device_id_present {
+      string device_id = 104 [(val).maxLength = 54];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message attworkflowdriverwhitelistentries {
+    repeated AttWorkflowDriverWhiteListEntry items = 1;
+}
+
+message BNGPortMapping {
+    option (contentTypeId) = "fabric-crossconnect.bngportmapping";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof s_tag_present {
+      string s_tag = 101 [(val).nonNull = true];
+    }
+    oneof switch_port_present {
+      int32 switch_port = 102 [(val).nonNull = true];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message BNGPortMappings {
+    repeated BNGPortMapping items = 1;
+}
+
+message FabricCrossconnectService {
+    option (contentTypeId) = "fabric-crossconnect.fabriccrossconnectservice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof description_present {
+      string description = 101 [(val).maxLength = 254];
+    }
+    oneof enabled_present {
+      bool enabled = 102 [(val).nonNull = true];
+    }
+    oneof kind_present {
+      string kind = 103 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof name_present {
+      string name = 104 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof versionNumber_present {
+      string versionNumber = 105 [(val).maxLength = 30];
+    }
+    oneof published_present {
+      bool published = 106 [(val).nonNull = true];
+    }
+    oneof icon_url_present {
+      string icon_url = 108 [(val).maxLength = 1024];
+    }
+    oneof public_key_present {
+      string public_key = 109 [(val).maxLength = 4096];
+    }
+    oneof private_key_fn_present {
+      string private_key_fn = 110 [(val).maxLength = 4096];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 111 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 112 ;
+    }
+    repeated int32 addresspools_ids  = 1001 [(reverseForeignKey).modelName = "AddressPool"];
+    repeated int32 serviceports_ids  = 1002 [(reverseForeignKey).modelName = "ServicePort"];
+    repeated int32 serviceattributes_ids  = 1003 [(reverseForeignKey).modelName = "ServiceAttribute"];
+    repeated int32 provided_dependencies_ids  = 1004 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 subscribed_dependencies_ids  = 1005 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 slices_ids  = 1006 [(reverseForeignKey).modelName = "Slice"];
+    repeated int32 tags_ids  = 1007 [(reverseForeignKey).modelName = "Tag"];
+    repeated int32 service_interfaces_ids  = 1008 [(reverseForeignKey).modelName = "ServiceInterface"];
+    repeated int32 service_instances_ids  = 1009 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 subscribed_links_ids  = 1010 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 owned_trust_domains_ids  = 1011 [(reverseForeignKey).modelName = "TrustDomain"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message FabricCrossconnectServices {
+    repeated FabricCrossconnectService items = 1;
+}
+
+message FabricCrossconnectServiceInstance {
+    option (contentTypeId) = "fabric-crossconnect.fabriccrossconnectserviceinstance";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 [(val).maxLength = 200];
+    }
+    oneof owner_present {
+      int32 owner_id = 102 [(val).nonNull = true, (foreignKey).modelName = "Service", (foreignKey).reverseFieldName = "service_instances"];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 103 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 110 ;
+    }
+    oneof link_deleted_count_present {
+      uint32 link_deleted_count = 111 ;
+    }
+    oneof master_serviceinstance_present {
+      int32 master_serviceinstance_id = 112 [(foreignKey).modelName = "ServiceInstance", (foreignKey).reverseFieldName = "child_serviceinstances"];
+    }
+    oneof s_tag_present {
+      int32 s_tag = 201 ;
+    }
+    oneof switch_datapath_id_present {
+      string switch_datapath_id = 202 ;
+    }
+    oneof source_port_present {
+      int32 source_port = 203 ;
+    }
+    repeated int32 ports_ids  = 1001 [(reverseForeignKey).modelName = "Port"];
+    repeated int32 child_serviceinstances_ids  = 1002 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 provided_links_ids  = 1003 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 subscribed_links_ids  = 1005 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 service_instance_attributes_ids  = 1006 [(reverseForeignKey).modelName = "ServiceInstanceAttribute"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message FabricCrossconnectServiceInstances {
+    repeated FabricCrossconnectServiceInstance items = 1;
+}
+
+message NNIPort {
+    option (contentTypeId) = "volt.nniport";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 ;
+    }
+    oneof port_no_present {
+      int32 port_no = 103 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 104 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 105 ;
+    }
+    oneof olt_device_present {
+      int32 olt_device_id = 201 [(foreignKey).modelName = "OLTDevice", (foreignKey).reverseFieldName = "nni_ports"];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message NNIPorts {
+    repeated NNIPort items = 1;
+}
+
+message OLTDevice {
+    option (contentTypeId) = "volt.oltdevice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof volt_service_present {
+      int32 volt_service_id = 101 [(foreignKey).modelName = "VOLTService", (foreignKey).reverseFieldName = "volt_devices"];
+    }
+    oneof name_present {
+      string name = 102 [(val).maxLength = 254];
+    }
+    oneof device_type_present {
+      string device_type = 103 [(val).maxLength = 254];
+    }
+    oneof host_present {
+      string host = 104 [(val).maxLength = 254];
+    }
+    oneof port_present {
+      int32 port = 105 ;
+    }
+    oneof mac_address_present {
+      string mac_address = 106 ;
+    }
+    oneof serial_number_present {
+      string serial_number = 109 ;
+    }
+    oneof device_id_present {
+      string device_id = 110 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 111 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 112 ;
+    }
+    oneof of_id_present {
+      string of_id = 113 ;
+    }
+    oneof dp_id_present {
+      string dp_id = 114 ;
+    }
+    oneof uplink_present {
+      string uplink = 115 ;
+    }
+    oneof driver_present {
+      string driver = 116 ;
+    }
+    oneof switch_datapath_id_present {
+      string switch_datapath_id = 117 ;
+    }
+    oneof switch_port_present {
+      string switch_port = 118 ;
+    }
+    oneof outer_tpid_present {
+      string outer_tpid = 119 ;
+    }
+    oneof nas_id_present {
+      string nas_id = 120 ;
+    }
+    repeated int32 pon_ports_ids  = 1001 [(reverseForeignKey).modelName = "PONPort"];
+    repeated int32 nni_ports_ids  = 1002 [(reverseForeignKey).modelName = "NNIPort"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message OLTDevices {
+    repeated OLTDevice items = 1;
+}
+
+message ONUDevice {
+    option (contentTypeId) = "volt.onudevice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof pon_port_present {
+      int32 pon_port_id = 101 [(foreignKey).modelName = "PONPort", (foreignKey).reverseFieldName = "onu_devices"];
+    }
+    oneof serial_number_present {
+      string serial_number = 102 [(val).maxLength = 254];
+    }
+    oneof vendor_present {
+      string vendor = 103 [(val).maxLength = 254];
+    }
+    oneof device_type_present {
+      string device_type = 104 [(val).maxLength = 254];
+    }
+    oneof device_id_present {
+      string device_id = 105 [(val).maxLength = 254];
+    }
+    oneof admin_state_present {
+      string admin_state = 106 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 107 ;
+    }
+    oneof connect_status_present {
+      string connect_status = 108 ;
+    }
+    repeated int32 pononu_ports_ids  = 1001 [(reverseForeignKey).modelName = "PONONUPort"];
+    repeated int32 uni_ports_ids  = 1002 [(reverseForeignKey).modelName = "UNIPort"];
+    repeated int32 volt_service_instances_ids  = 1003 [(reverseForeignKey).modelName = "VOLTServiceInstance"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message ONUDevices {
+    repeated ONUDevice items = 1;
+}
+
+message PONONUPort {
+    option (contentTypeId) = "volt.pononuport";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 ;
+    }
+    oneof port_no_present {
+      int32 port_no = 103 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 104 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 105 ;
+    }
+    oneof onu_device_present {
+      int32 onu_device_id = 201 [(foreignKey).modelName = "ONUDevice", (foreignKey).reverseFieldName = "pononu_ports"];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message PONONUPorts {
+    repeated PONONUPort items = 1;
+}
+
+message PONPort {
+    option (contentTypeId) = "volt.ponport";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 ;
+    }
+    oneof port_no_present {
+      int32 port_no = 103 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 104 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 105 ;
+    }
+    oneof olt_device_present {
+      int32 olt_device_id = 201 [(foreignKey).modelName = "OLTDevice", (foreignKey).reverseFieldName = "pon_ports"];
+    }
+    repeated int32 onu_devices_ids  = 1001 [(reverseForeignKey).modelName = "ONUDevice"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message PONPorts {
+    repeated PONPort items = 1;
+}
+
+message PortBase {
+    option (contentTypeId) = "volt.portbase";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 ;
+    }
+    oneof port_no_present {
+      int32 port_no = 103 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 104 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 105 ;
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message PortBases {
+    repeated PortBase items = 1;
+}
+
+message RCORDIpAddress {
+    option (contentTypeId) = "rcord.rcordipaddress";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof subscriber_present {
+      int32 subscriber_id = 101 [(val).nonNull = true, (foreignKey).modelName = "RCORDSubscriber", (foreignKey).reverseFieldName = "ips"];
+    }
+    oneof ip_present {
+      string ip = 102 [(val).maxLength = 52, (val).nonNull = true];
+    }
+    oneof description_present {
+      string description = 103 [(val).maxLength = 254, (val).nonNull = true];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message RCORDIpAddresses {
+    repeated RCORDIpAddress items = 1;
+}
+
+message RCORDService {
+    option (contentTypeId) = "rcord.rcordservice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof description_present {
+      string description = 101 [(val).maxLength = 254];
+    }
+    oneof enabled_present {
+      bool enabled = 102 [(val).nonNull = true];
+    }
+    oneof kind_present {
+      string kind = 103 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof name_present {
+      string name = 104 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof versionNumber_present {
+      string versionNumber = 105 [(val).maxLength = 30];
+    }
+    oneof published_present {
+      bool published = 106 [(val).nonNull = true];
+    }
+    oneof icon_url_present {
+      string icon_url = 108 [(val).maxLength = 1024];
+    }
+    oneof public_key_present {
+      string public_key = 109 [(val).maxLength = 4096];
+    }
+    oneof private_key_fn_present {
+      string private_key_fn = 110 [(val).maxLength = 4096];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 111 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 112 ;
+    }
+    oneof access_present {
+      string access = 211 [(val).maxLength = 30];
+    }
+    repeated int32 addresspools_ids  = 1001 [(reverseForeignKey).modelName = "AddressPool"];
+    repeated int32 serviceports_ids  = 1002 [(reverseForeignKey).modelName = "ServicePort"];
+    repeated int32 serviceattributes_ids  = 1003 [(reverseForeignKey).modelName = "ServiceAttribute"];
+    repeated int32 provided_dependencies_ids  = 1004 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 subscribed_dependencies_ids  = 1005 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 slices_ids  = 1006 [(reverseForeignKey).modelName = "Slice"];
+    repeated int32 tags_ids  = 1007 [(reverseForeignKey).modelName = "Tag"];
+    repeated int32 service_interfaces_ids  = 1008 [(reverseForeignKey).modelName = "ServiceInterface"];
+    repeated int32 service_instances_ids  = 1009 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 subscribed_links_ids  = 1010 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 owned_trust_domains_ids  = 1011 [(reverseForeignKey).modelName = "TrustDomain"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message RCORDServices {
+    repeated RCORDService items = 1;
+}
+
+message RCORDSubscriber {
+    option (contentTypeId) = "rcord.rcordsubscriber";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 [(val).maxLength = 200];
+    }
+    oneof owner_present {
+      int32 owner_id = 102 [(val).nonNull = true, (foreignKey).modelName = "Service", (foreignKey).reverseFieldName = "service_instances"];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 103 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 110 ;
+    }
+    oneof link_deleted_count_present {
+      uint32 link_deleted_count = 111 ;
+    }
+    oneof master_serviceinstance_present {
+      int32 master_serviceinstance_id = 112 [(foreignKey).modelName = "ServiceInstance", (foreignKey).reverseFieldName = "child_serviceinstances"];
+    }
+    oneof status_present {
+      string status = 211 [(val).maxLength = 30];
+    }
+    oneof c_tag_present {
+      int32 c_tag = 212 ;
+    }
+    oneof onu_device_present {
+      string onu_device = 213 ;
+    }
+    oneof creator_present {
+      int32 creator_id = 215 [(foreignKey).modelName = "User", (foreignKey).reverseFieldName = "created_rcord_subscribers"];
+    }
+    oneof mac_address_present {
+      string mac_address = 218 ;
+    }
+    oneof s_tag_present {
+      int32 s_tag = 219 ;
+    }
+    oneof nas_port_id_present {
+      string nas_port_id = 220 ;
+    }
+    oneof circuit_id_present {
+      string circuit_id = 221 ;
+    }
+    oneof remote_id_present {
+      string remote_id = 222 ;
+    }
+    repeated int32 ports_ids  = 1001 [(reverseForeignKey).modelName = "Port"];
+    repeated int32 child_serviceinstances_ids  = 1002 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 provided_links_ids  = 1003 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 subscribed_links_ids  = 1005 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 service_instance_attributes_ids  = 1006 [(reverseForeignKey).modelName = "ServiceInstanceAttribute"];
+    repeated int32 ips_ids  = 1101 [(reverseForeignKey).modelName = "RCORDIpAddress"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message RCORDSubscribers {
+    repeated RCORDSubscriber items = 1;
+}
+
+message UNIPort {
+    option (contentTypeId) = "volt.uniport";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 ;
+    }
+    oneof port_no_present {
+      int32 port_no = 103 ;
+    }
+    oneof admin_state_present {
+      string admin_state = 104 ;
+    }
+    oneof oper_status_present {
+      string oper_status = 105 ;
+    }
+    oneof onu_device_present {
+      int32 onu_device_id = 201 [(foreignKey).modelName = "ONUDevice", (foreignKey).reverseFieldName = "uni_ports"];
+    }
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message UNIPorts {
+    repeated UNIPort items = 1;
+}
+
+message VOLTService {
+    option (contentTypeId) = "volt.voltservice";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof description_present {
+      string description = 101 [(val).maxLength = 254];
+    }
+    oneof enabled_present {
+      bool enabled = 102 [(val).nonNull = true];
+    }
+    oneof kind_present {
+      string kind = 103 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof name_present {
+      string name = 104 [(val).maxLength = 30, (val).nonNull = true];
+    }
+    oneof versionNumber_present {
+      string versionNumber = 105 [(val).maxLength = 30];
+    }
+    oneof published_present {
+      bool published = 106 [(val).nonNull = true];
+    }
+    oneof icon_url_present {
+      string icon_url = 108 [(val).maxLength = 1024];
+    }
+    oneof public_key_present {
+      string public_key = 109 [(val).maxLength = 4096];
+    }
+    oneof private_key_fn_present {
+      string private_key_fn = 110 [(val).maxLength = 4096];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 111 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 112 ;
+    }
+    oneof voltha_url_present {
+      string voltha_url = 201 [(val).maxLength = 254];
+    }
+    oneof voltha_port_present {
+      int32 voltha_port = 202 ;
+    }
+    oneof voltha_user_present {
+      string voltha_user = 203 [(val).maxLength = 254];
+    }
+    oneof voltha_pass_present {
+      string voltha_pass = 204 [(val).maxLength = 254];
+    }
+    oneof onos_voltha_url_present {
+      string onos_voltha_url = 205 [(val).maxLength = 254];
+    }
+    oneof onos_voltha_port_present {
+      int32 onos_voltha_port = 206 ;
+    }
+    oneof onos_voltha_user_present {
+      string onos_voltha_user = 207 [(val).maxLength = 254];
+    }
+    oneof onos_voltha_pass_present {
+      string onos_voltha_pass = 208 [(val).maxLength = 254];
+    }
+    repeated int32 addresspools_ids  = 1001 [(reverseForeignKey).modelName = "AddressPool"];
+    repeated int32 serviceports_ids  = 1002 [(reverseForeignKey).modelName = "ServicePort"];
+    repeated int32 serviceattributes_ids  = 1003 [(reverseForeignKey).modelName = "ServiceAttribute"];
+    repeated int32 provided_dependencies_ids  = 1004 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 subscribed_dependencies_ids  = 1005 [(reverseForeignKey).modelName = "ServiceDependency"];
+    repeated int32 slices_ids  = 1006 [(reverseForeignKey).modelName = "Slice"];
+    repeated int32 tags_ids  = 1007 [(reverseForeignKey).modelName = "Tag"];
+    repeated int32 service_interfaces_ids  = 1008 [(reverseForeignKey).modelName = "ServiceInterface"];
+    repeated int32 service_instances_ids  = 1009 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 subscribed_links_ids  = 1010 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 owned_trust_domains_ids  = 1011 [(reverseForeignKey).modelName = "TrustDomain"];
+    repeated int32 volt_devices_ids  = 1101 [(reverseForeignKey).modelName = "OLTDevice"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message VOLTServices {
+    repeated VOLTService items = 1;
+}
+
+message VOLTServiceInstance {
+    option (contentTypeId) = "volt.voltserviceinstance";
+    oneof id_present {
+      int32 id = 1 ;
+    }
+    oneof created_present {
+      double created = 2 ;
+    }
+    oneof updated_present {
+      double updated = 3 ;
+    }
+    oneof enacted_present {
+      double enacted = 4 ;
+    }
+    oneof policed_present {
+      double policed = 5 ;
+    }
+    oneof backend_register_present {
+      string backend_register = 6 [(val).maxLength = 1024];
+    }
+    oneof backend_need_delete_present {
+      bool backend_need_delete = 7 ;
+    }
+    oneof backend_need_reap_present {
+      bool backend_need_reap = 8 ;
+    }
+    oneof backend_status_present {
+      string backend_status = 9 [(val).maxLength = 1024];
+    }
+    oneof backend_code_present {
+      int32 backend_code = 10 ;
+    }
+    oneof deleted_present {
+      bool deleted = 11 ;
+    }
+    oneof write_protect_present {
+      bool write_protect = 12 ;
+    }
+    oneof lazy_blocked_present {
+      bool lazy_blocked = 13 ;
+    }
+    oneof no_sync_present {
+      bool no_sync = 14 ;
+    }
+    oneof no_policy_present {
+      bool no_policy = 15 ;
+    }
+    oneof policy_status_present {
+      string policy_status = 16 [(val).maxLength = 1024];
+    }
+    oneof policy_code_present {
+      int32 policy_code = 17 ;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 18 [(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof backend_need_delete_policy_present {
+      bool backend_need_delete_policy = 19 ;
+    }
+    oneof xos_managed_present {
+      bool xos_managed = 20 ;
+    }
+    oneof backend_handle_present {
+      string backend_handle = 21 [(val).maxLength = 1024];
+    }
+    oneof changed_by_step_present {
+      double changed_by_step = 22 ;
+    }
+    oneof changed_by_policy_present {
+      double changed_by_policy = 23 ;
+    }
+    oneof name_present {
+      string name = 101 [(val).maxLength = 200];
+    }
+    oneof owner_present {
+      int32 owner_id = 102 [(val).nonNull = true, (foreignKey).modelName = "Service", (foreignKey).reverseFieldName = "service_instances"];
+    }
+    oneof service_specific_id_present {
+      string service_specific_id = 103 [(val).maxLength = 30];
+    }
+    oneof service_specific_attribute_present {
+      string service_specific_attribute = 110 ;
+    }
+    oneof link_deleted_count_present {
+      uint32 link_deleted_count = 111 ;
+    }
+    oneof master_serviceinstance_present {
+      int32 master_serviceinstance_id = 112 [(foreignKey).modelName = "ServiceInstance", (foreignKey).reverseFieldName = "child_serviceinstances"];
+    }
+    oneof description_present {
+      string description = 201 [(val).maxLength = 254];
+    }
+    oneof onu_device_present {
+      int32 onu_device_id = 202 [(foreignKey).modelName = "ONUDevice", (foreignKey).reverseFieldName = "volt_service_instances"];
+    }
+    repeated int32 ports_ids  = 1001 [(reverseForeignKey).modelName = "Port"];
+    repeated int32 child_serviceinstances_ids  = 1002 [(reverseForeignKey).modelName = "ServiceInstance"];
+    repeated int32 provided_links_ids  = 1003 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 subscribed_links_ids  = 1005 [(reverseForeignKey).modelName = "ServiceInstanceLink"];
+    repeated int32 service_instance_attributes_ids  = 1006 [(reverseForeignKey).modelName = "ServiceInstanceAttribute"];
+  string class_names = 2046;
+  string self_content_type_id = 2047;
+}
+
+message VOLTServiceInstances {
+    repeated VOLTServiceInstance items = 1;
+}
+
+
+service xos {
+
+rpc ListAttWorkflowDriverService(google.protobuf.Empty) returns (AttWorkflowDriverServices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverservices"
+        };
+  }
+  rpc FilterAttWorkflowDriverService(Query) returns (AttWorkflowDriverServices) {
+  }
+  rpc GetAttWorkflowDriverService(ID) returns (AttWorkflowDriverService) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverservices/{id}"
+        };
+  }
+  rpc CreateAttWorkflowDriverService(AttWorkflowDriverService) returns (AttWorkflowDriverService) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/att-workflow-driver/attworkflowdriverservices"
+            body: "*"
+        };
+  }
+  rpc UpdateAttWorkflowDriverService(AttWorkflowDriverService) returns (AttWorkflowDriverService) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/att-workflow-driver/attworkflowdriverservices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteAttWorkflowDriverService(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/att-workflow-driver/attworkflowdriverservices/{id}"
+        };
+  }
+
+rpc ListAttWorkflowDriverServiceInstance(google.protobuf.Empty) returns (AttWorkflowDriverServiceInstances) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances"
+        };
+  }
+  rpc FilterAttWorkflowDriverServiceInstance(Query) returns (AttWorkflowDriverServiceInstances) {
+  }
+  rpc GetAttWorkflowDriverServiceInstance(ID) returns (AttWorkflowDriverServiceInstance) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances/{id}"
+        };
+  }
+  rpc CreateAttWorkflowDriverServiceInstance(AttWorkflowDriverServiceInstance) returns (AttWorkflowDriverServiceInstance) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances"
+            body: "*"
+        };
+  }
+  rpc UpdateAttWorkflowDriverServiceInstance(AttWorkflowDriverServiceInstance) returns (AttWorkflowDriverServiceInstance) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteAttWorkflowDriverServiceInstance(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/att-workflow-driver/attworkflowdriverserviceinstances/{id}"
+        };
+  }
+
+rpc ListAttWorkflowDriverWhiteListEntry(google.protobuf.Empty) returns (attworkflowdriverwhitelistentries) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries"
+        };
+  }
+  rpc FilterAttWorkflowDriverWhiteListEntry(Query) returns (attworkflowdriverwhitelistentries) {
+  }
+  rpc GetAttWorkflowDriverWhiteListEntry(ID) returns (AttWorkflowDriverWhiteListEntry) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries/{id}"
+        };
+  }
+  rpc CreateAttWorkflowDriverWhiteListEntry(AttWorkflowDriverWhiteListEntry) returns (AttWorkflowDriverWhiteListEntry) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries"
+            body: "*"
+        };
+  }
+  rpc UpdateAttWorkflowDriverWhiteListEntry(AttWorkflowDriverWhiteListEntry) returns (AttWorkflowDriverWhiteListEntry) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteAttWorkflowDriverWhiteListEntry(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/att-workflow-driver/attworkflowdriverwhitelistentries/{id}"
+        };
+  }
+
+rpc ListBNGPortMapping(google.protobuf.Empty) returns (BNGPortMappings) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/bngportmappings"
+        };
+  }
+  rpc FilterBNGPortMapping(Query) returns (BNGPortMappings) {
+  }
+  rpc GetBNGPortMapping(ID) returns (BNGPortMapping) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/bngportmappings/{id}"
+        };
+  }
+  rpc CreateBNGPortMapping(BNGPortMapping) returns (BNGPortMapping) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/fabric-crossconnect/bngportmappings"
+            body: "*"
+        };
+  }
+  rpc UpdateBNGPortMapping(BNGPortMapping) returns (BNGPortMapping) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/fabric-crossconnect/bngportmappings/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteBNGPortMapping(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/fabric-crossconnect/bngportmappings/{id}"
+        };
+  }
+
+rpc ListFabricCrossconnectService(google.protobuf.Empty) returns (FabricCrossconnectServices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectservices"
+        };
+  }
+  rpc FilterFabricCrossconnectService(Query) returns (FabricCrossconnectServices) {
+  }
+  rpc GetFabricCrossconnectService(ID) returns (FabricCrossconnectService) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectservices/{id}"
+        };
+  }
+  rpc CreateFabricCrossconnectService(FabricCrossconnectService) returns (FabricCrossconnectService) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectservices"
+            body: "*"
+        };
+  }
+  rpc UpdateFabricCrossconnectService(FabricCrossconnectService) returns (FabricCrossconnectService) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectservices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteFabricCrossconnectService(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectservices/{id}"
+        };
+  }
+
+rpc ListFabricCrossconnectServiceInstance(google.protobuf.Empty) returns (FabricCrossconnectServiceInstances) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectserviceinstances"
+        };
+  }
+  rpc FilterFabricCrossconnectServiceInstance(Query) returns (FabricCrossconnectServiceInstances) {
+  }
+  rpc GetFabricCrossconnectServiceInstance(ID) returns (FabricCrossconnectServiceInstance) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectserviceinstances/{id}"
+        };
+  }
+  rpc CreateFabricCrossconnectServiceInstance(FabricCrossconnectServiceInstance) returns (FabricCrossconnectServiceInstance) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectserviceinstances"
+            body: "*"
+        };
+  }
+  rpc UpdateFabricCrossconnectServiceInstance(FabricCrossconnectServiceInstance) returns (FabricCrossconnectServiceInstance) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectserviceinstances/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteFabricCrossconnectServiceInstance(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/fabric-crossconnect/fabriccrossconnectserviceinstances/{id}"
+        };
+  }
+
+rpc ListNNIPort(google.protobuf.Empty) returns (NNIPorts) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/nniports"
+        };
+  }
+  rpc FilterNNIPort(Query) returns (NNIPorts) {
+  }
+  rpc GetNNIPort(ID) returns (NNIPort) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/nniports/{id}"
+        };
+  }
+  rpc CreateNNIPort(NNIPort) returns (NNIPort) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/nniports"
+            body: "*"
+        };
+  }
+  rpc UpdateNNIPort(NNIPort) returns (NNIPort) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/nniports/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteNNIPort(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/nniports/{id}"
+        };
+  }
+
+rpc ListOLTDevice(google.protobuf.Empty) returns (OLTDevices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/oltdevices"
+        };
+  }
+  rpc FilterOLTDevice(Query) returns (OLTDevices) {
+  }
+  rpc GetOLTDevice(ID) returns (OLTDevice) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/oltdevices/{id}"
+        };
+  }
+  rpc CreateOLTDevice(OLTDevice) returns (OLTDevice) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/oltdevices"
+            body: "*"
+        };
+  }
+  rpc UpdateOLTDevice(OLTDevice) returns (OLTDevice) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/oltdevices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteOLTDevice(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/oltdevices/{id}"
+        };
+  }
+
+rpc ListONUDevice(google.protobuf.Empty) returns (ONUDevices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/onudevices"
+        };
+  }
+  rpc FilterONUDevice(Query) returns (ONUDevices) {
+  }
+  rpc GetONUDevice(ID) returns (ONUDevice) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/onudevices/{id}"
+        };
+  }
+  rpc CreateONUDevice(ONUDevice) returns (ONUDevice) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/onudevices"
+            body: "*"
+        };
+  }
+  rpc UpdateONUDevice(ONUDevice) returns (ONUDevice) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/onudevices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteONUDevice(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/onudevices/{id}"
+        };
+  }
+
+rpc ListPONONUPort(google.protobuf.Empty) returns (PONONUPorts) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/pononuports"
+        };
+  }
+  rpc FilterPONONUPort(Query) returns (PONONUPorts) {
+  }
+  rpc GetPONONUPort(ID) returns (PONONUPort) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/pononuports/{id}"
+        };
+  }
+  rpc CreatePONONUPort(PONONUPort) returns (PONONUPort) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/pononuports"
+            body: "*"
+        };
+  }
+  rpc UpdatePONONUPort(PONONUPort) returns (PONONUPort) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/pononuports/{id}"
+            body: "*"
+        };
+  }
+  rpc DeletePONONUPort(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/pononuports/{id}"
+        };
+  }
+
+rpc ListPONPort(google.protobuf.Empty) returns (PONPorts) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/ponports"
+        };
+  }
+  rpc FilterPONPort(Query) returns (PONPorts) {
+  }
+  rpc GetPONPort(ID) returns (PONPort) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/ponports/{id}"
+        };
+  }
+  rpc CreatePONPort(PONPort) returns (PONPort) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/ponports"
+            body: "*"
+        };
+  }
+  rpc UpdatePONPort(PONPort) returns (PONPort) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/ponports/{id}"
+            body: "*"
+        };
+  }
+  rpc DeletePONPort(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/ponports/{id}"
+        };
+  }
+
+rpc ListPortBase(google.protobuf.Empty) returns (PortBases) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/portbases"
+        };
+  }
+  rpc FilterPortBase(Query) returns (PortBases) {
+  }
+  rpc GetPortBase(ID) returns (PortBase) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/portbases/{id}"
+        };
+  }
+  rpc CreatePortBase(PortBase) returns (PortBase) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/portbases"
+            body: "*"
+        };
+  }
+  rpc UpdatePortBase(PortBase) returns (PortBase) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/portbases/{id}"
+            body: "*"
+        };
+  }
+  rpc DeletePortBase(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/portbases/{id}"
+        };
+  }
+
+rpc ListRCORDIpAddress(google.protobuf.Empty) returns (RCORDIpAddresses) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordipaddresses"
+        };
+  }
+  rpc FilterRCORDIpAddress(Query) returns (RCORDIpAddresses) {
+  }
+  rpc GetRCORDIpAddress(ID) returns (RCORDIpAddress) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordipaddresses/{id}"
+        };
+  }
+  rpc CreateRCORDIpAddress(RCORDIpAddress) returns (RCORDIpAddress) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/rcord/rcordipaddresses"
+            body: "*"
+        };
+  }
+  rpc UpdateRCORDIpAddress(RCORDIpAddress) returns (RCORDIpAddress) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/rcord/rcordipaddresses/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteRCORDIpAddress(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/rcord/rcordipaddresses/{id}"
+        };
+  }
+
+rpc ListRCORDService(google.protobuf.Empty) returns (RCORDServices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordservices"
+        };
+  }
+  rpc FilterRCORDService(Query) returns (RCORDServices) {
+  }
+  rpc GetRCORDService(ID) returns (RCORDService) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordservices/{id}"
+        };
+  }
+  rpc CreateRCORDService(RCORDService) returns (RCORDService) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/rcord/rcordservices"
+            body: "*"
+        };
+  }
+  rpc UpdateRCORDService(RCORDService) returns (RCORDService) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/rcord/rcordservices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteRCORDService(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/rcord/rcordservices/{id}"
+        };
+  }
+
+rpc ListRCORDSubscriber(google.protobuf.Empty) returns (RCORDSubscribers) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordsubscribers"
+        };
+  }
+  rpc FilterRCORDSubscriber(Query) returns (RCORDSubscribers) {
+  }
+  rpc GetRCORDSubscriber(ID) returns (RCORDSubscriber) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/rcord/rcordsubscribers/{id}"
+        };
+  }
+  rpc CreateRCORDSubscriber(RCORDSubscriber) returns (RCORDSubscriber) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/rcord/rcordsubscribers"
+            body: "*"
+        };
+  }
+  rpc UpdateRCORDSubscriber(RCORDSubscriber) returns (RCORDSubscriber) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/rcord/rcordsubscribers/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteRCORDSubscriber(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/rcord/rcordsubscribers/{id}"
+        };
+  }
+
+rpc ListUNIPort(google.protobuf.Empty) returns (UNIPorts) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/uniports"
+        };
+  }
+  rpc FilterUNIPort(Query) returns (UNIPorts) {
+  }
+  rpc GetUNIPort(ID) returns (UNIPort) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/uniports/{id}"
+        };
+  }
+  rpc CreateUNIPort(UNIPort) returns (UNIPort) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/uniports"
+            body: "*"
+        };
+  }
+  rpc UpdateUNIPort(UNIPort) returns (UNIPort) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/uniports/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteUNIPort(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/uniports/{id}"
+        };
+  }
+
+rpc ListVOLTService(google.protobuf.Empty) returns (VOLTServices) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/voltservices"
+        };
+  }
+  rpc FilterVOLTService(Query) returns (VOLTServices) {
+  }
+  rpc GetVOLTService(ID) returns (VOLTService) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/voltservices/{id}"
+        };
+  }
+  rpc CreateVOLTService(VOLTService) returns (VOLTService) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/voltservices"
+            body: "*"
+        };
+  }
+  rpc UpdateVOLTService(VOLTService) returns (VOLTService) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/voltservices/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteVOLTService(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/voltservices/{id}"
+        };
+  }
+
+rpc ListVOLTServiceInstance(google.protobuf.Empty) returns (VOLTServiceInstances) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/voltserviceinstances"
+        };
+  }
+  rpc FilterVOLTServiceInstance(Query) returns (VOLTServiceInstances) {
+  }
+  rpc GetVOLTServiceInstance(ID) returns (VOLTServiceInstance) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/volt/voltserviceinstances/{id}"
+        };
+  }
+  rpc CreateVOLTServiceInstance(VOLTServiceInstance) returns (VOLTServiceInstance) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/volt/voltserviceinstances"
+            body: "*"
+        };
+  }
+  rpc UpdateVOLTServiceInstance(VOLTServiceInstance) returns (VOLTServiceInstance) {
+        option (googleapi.http) = {
+            put: "/xosapi/v1/volt/voltserviceinstances/{id}"
+            body: "*"
+        };
+  }
+  rpc DeleteVOLTServiceInstance(ID) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            delete: "/xosapi/v1/volt/voltserviceinstances/{id}"
+        };
+  }
+
+}
+
diff --git a/contrib/xos/utility.proto b/contrib/xos/utility.proto
new file mode 100644
index 0000000..554e0a9
--- /dev/null
+++ b/contrib/xos/utility.proto
@@ -0,0 +1,111 @@
+syntax = "proto3";
+
+package xos;
+
+import "google/protobuf/empty.proto";
+import "annotations.proto";
+import "common.proto";
+import "xosoptions.proto";
+
+message LoginRequest {
+    string username = 1;
+    string password = 2;
+};
+
+message LoginResponse {
+    string sessionid = 1;
+};
+
+message ModelFilter {
+    string class_name = 1;
+};
+
+message ModelListEntry {
+    string class_name = 1;
+    int32 id = 2;
+    string info = 3;
+};
+
+message ModelList {
+    repeated ModelListEntry items = 1;
+};
+
+message XProtos {
+    string xproto = 1;
+};
+
+message PopulatedServiceInstance {
+    option (contentTypeId) = "core.serviceinstance";
+    oneof id_present {
+      int32 id = 1;
+    }
+    oneof leaf_model_name_present {
+      string leaf_model_name = 2[(val).maxLength = 1024, (val).nonNull = true];
+    }
+    oneof name_present {
+      string name = 3[(val).maxLength = 200];
+    }
+    oneof owner_present {
+      int32 owner_id = 4[(val).nonNull = true, (foreignKey).modelName = "Service", (foreignKey).reverseFieldName = "service_instances"];
+    }
+    repeated int32 provided_service_instances = 5;
+    repeated int32 subscribed_service_instances = 6;
+    repeated int32 subscribed_service = 7;
+    repeated int32 subscribed_network = 8;
+};
+
+service utility {
+
+  rpc Login(LoginRequest) returns (LoginResponse) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/utility/login"
+            body: "*"
+        };
+  }
+
+  rpc Logout(google.protobuf.Empty) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/utility/logout"
+            body: "*"
+        };
+  }
+
+  rpc NoOp(google.protobuf.Empty) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/utility/noop"
+            body: "*"
+        };
+  }
+
+  rpc AuthenticatedNoOp(google.protobuf.Empty) returns (google.protobuf.Empty) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/utility/auth_noop"
+            body: "*"
+        };
+  }
+
+  rpc SetDirtyModels(ModelFilter) returns (ModelList) {
+        option (googleapi.http) = {
+            post: "/xosapi/v1/utility/dirty_models"
+            body: "*"
+        };
+  }
+
+  rpc ListDirtyModels(ModelFilter) returns (ModelList) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/utility/dirty_models"
+        };
+  }
+
+  rpc GetXproto(google.protobuf.Empty) returns (XProtos) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/xproto"
+        };
+  }
+
+  rpc GetPopulatedServiceInstances(ID) returns (PopulatedServiceInstance) {
+        option (googleapi.http) = {
+            get: "/xosapi/v1/core/populatedserviceinstance/{id}"
+        };
+  }
+};
diff --git a/contrib/xos/xosoptions.proto b/contrib/xos/xosoptions.proto
new file mode 100644
index 0000000..0494ada
--- /dev/null
+++ b/contrib/xos/xosoptions.proto
@@ -0,0 +1,36 @@
+syntax = "proto3";
+
+package xos;
+
+import "google/protobuf/descriptor.proto";
+
+message ValRule {
+  int32 maxLength = 1;
+  bool nonNull = 2;
+  bool unique = 3;
+}
+
+message ForeignKeyRule {
+  string modelName = 1;
+  string reverseFieldName = 2;
+}
+
+message ReverseForeignKeyRule {
+  string modelName = 1;
+}
+
+message ManyToManyForeignKeyRule {
+  string modelName = 1;
+}
+
+extend google.protobuf.FieldOptions {
+  ValRule val = 1001;
+  ForeignKeyRule foreignKey = 1002;
+  ReverseForeignKeyRule reverseForeignKey = 1003;
+  ManyToManyForeignKeyRule manyToManyForeignKey = 1004;
+}
+
+extend google.protobuf.MessageOptions {
+  string contentTypeId = 1001;
+}
+