ovsdb: Remove SPECS in favor of referring to RFC 7047.
authorBen Pfaff <blp@nicira.com>
Fri, 4 Apr 2014 16:43:54 +0000 (09:43 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 4 Apr 2014 20:51:32 +0000 (13:51 -0700)
Also, add some clarifications relative to RFC 7047 to ovsdb-server(1).

Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Justin Pettit <jpettit@nicira.com>
lib/ovsdb-data.c
ovsdb/SPECS [deleted file]
ovsdb/automake.mk
ovsdb/jsonrpc-server.c
ovsdb/ovsdb-server.1.in
python/ovs/db/data.py

index 3aae9f4..0706dd0 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -41,7 +41,7 @@ wrap_json(const char *name, struct json *wrapped)
 
 /* Initializes 'atom' with the default value of the given 'type'.
  *
- * The default value for an atom is as defined in ovsdb/SPECS:
+ * The default value for an atom is as defined in RFC 7047:
  *
  *      - "integer" or "real": 0
  *
@@ -409,10 +409,9 @@ ovsdb_atom_from_json__(union ovsdb_atom *atom,
  * Violations of constraints expressed by 'base' are treated as errors.
  *
  * If 'symtab' is nonnull, then named UUIDs in 'symtab' are accepted.  Refer to
- * ovsdb/SPECS for information about this, and for the syntax that this
- * function accepts.  If 'base' is a reference and a symbol is parsed, then the
- * symbol's 'strong_ref' or 'weak_ref' member is set to true, as
- * appropriate. */
+ * RFC 7047 for information about this, and for the syntax that this function
+ * accepts.  If 'base' is a reference and a symbol is parsed, then the symbol's
+ * 'strong_ref' or 'weak_ref' member is set to true, as appropriate. */
 struct ovsdb_error *
 ovsdb_atom_from_json(union ovsdb_atom *atom,
                      const struct ovsdb_base_type *base,
@@ -436,8 +435,7 @@ ovsdb_atom_from_json(union ovsdb_atom *atom,
 /* Converts 'atom', of the specified 'type', to JSON format, and returns the
  * JSON.  The caller is responsible for freeing the returned JSON.
  *
- * Refer to ovsdb/SPECS for the format of the JSON that this function
- * produces. */
+ * Refer to RFC 7047 for the format of the JSON that this function produces. */
 struct json *
 ovsdb_atom_to_json(const union ovsdb_atom *atom, enum ovsdb_atomic_type type)
 {
@@ -843,7 +841,7 @@ ovsdb_datum_init_empty(struct ovsdb_datum *datum)
 
 /* Initializes 'datum' as a datum that has the default value for 'type'.
  *
- * The default value for a particular type is as defined in ovsdb/SPECS:
+ * The default value for a particular type is as defined in RFC 7047:
  *
  *    - If n_min is 0, then the default value is the empty set (or map).
  *
@@ -1248,8 +1246,8 @@ ovsdb_datum_from_json__(struct ovsdb_datum *datum,
  * Violations of constraints expressed by 'type' are treated as errors.
  *
  * If 'symtab' is nonnull, then named UUIDs in 'symtab' are accepted.  Refer to
- * ovsdb/SPECS for information about this, and for the syntax that this
- * function accepts. */
+ * RFC 7047 for information about this, and for the syntax that this function
+ * accepts. */
 struct ovsdb_error *
 ovsdb_datum_from_json(struct ovsdb_datum *datum,
                       const struct ovsdb_type *type,
@@ -1275,8 +1273,7 @@ ovsdb_datum_from_json(struct ovsdb_datum *datum,
  *
  * 'type' constraints on datum->n are ignored.
  *
- * Refer to ovsdb/SPECS for the format of the JSON that this function
- * produces. */
+ * Refer to RFC 7047 for the format of the JSON that this function produces. */
 struct json *
 ovsdb_datum_to_json(const struct ovsdb_datum *datum,
                     const struct ovsdb_type *type)
diff --git a/ovsdb/SPECS b/ovsdb/SPECS
deleted file mode 100644 (file)
index 5656b9d..0000000
+++ /dev/null
@@ -1,1320 +0,0 @@
-         ===================================================
-          Open vSwitch Configuration Database Specification
-         ===================================================
-
-Basic Notation
---------------
-
-OVSDB uses JSON, as defined by RFC 4627, for its schema format and its
-wire protocol format.  The JSON implementation in Open vSwitch has the
-following limitations:
-
-     - Null bytes (\u0000) are not allowed in strings.
-
-     - Only UTF-8 encoding is supported.  (RFC 4627 also mentions
-       UTF-16BE, UTF-16LE, and UTF-32.)
-
-     - RFC 4627 says that names within a JSON object should be unique.
-       The Open vSwitch JSON parser discards all but the last value
-       for a name that is specified more than once.
-
-The descriptions below use the following shorthand notations for JSON
-values.  Additional notation is presented later.
-
-<string>
-
-    A JSON string.  Any Unicode string is allowed, as specified by RFC
-    4627.  Implementations may disallow null bytes.
-
-<id>
-
-    A JSON string matching [a-zA-Z_][a-zA-Z0-9_]*.
-
-    <id>s that begin with _ are reserved to the implementation and may
-    not be used by the user.
-
-<version>
-
-    A JSON string that contains a version number that matches
-    [0-9]+\.[0-9]+\.[0-9]+
-
-<boolean>
-
-    A JSON true or false value.
-
-<number>
-
-    A JSON number.
-
-<integer>
-
-    A JSON number with an integer value, within a certain range
-    (currently -2**63...+2**63-1).
-
-<json-value>
-
-    Any JSON value.
-
-<nonnull-json-value>
-
-    Any JSON value except null.
-
-<error>
-
-    A JSON object with the following members:
-
-        "error": <string>                       required
-        "details": <string>                     optional
-
-    The value of the "error" member is a short string, specified in
-    this document, that broadly indicates the class of the error.
-    Most "error" strings are specific to contexts described elsewhere
-    in this document, but the following "error" strings may appear in
-    any context where an <error> is permitted:
-
-    "error": "resources exhausted"
-
-        The operation requires more resources (memory, disk, CPU,
-        etc.) than are currently available to the database server.
-
-    "error": "I/O error"
-
-        Problems accessing the disk, network, or other required
-        resources prevented the operation from completing.
-
-    Database implementations may use "error" strings not specified
-    in this document to indicate errors that do not fit into any of
-    the specified categories.
-
-    Optionally, an <error> may include a "details" member, whose value
-    is a string that describes the error in more detail for the
-    benefit of a human user or administrator.  This document does not
-    specify the format or content of the "details" string.
-
-    An <error> may also have other members that describe the error in
-    more detail.  This document does not specify the names or values
-    of these members.
-
-Schema Format
--------------
-
-An Open vSwitch configuration database consists of a set of tables,
-each of which has a number of columns and zero or more rows.  A schema
-is represented by <database-schema>, as described below.
-
-<database-schema>
-
-    A JSON object with the following members:
-
-        "name": <id>                            required
-        "version": <version>                    required
-        "cksum": <string>                       optional
-        "tables": {<id>: <table-schema>, ...}   required
-
-    The "name" identifies the database as a whole.  It must be
-    provided to most JSON-RPC requests to identify the database being
-    operated on.  The value of "tables" is a JSON object whose names
-    are table names and whose values are <table-schema>s.
-
-    The "version" reports the version of the database schema.  Because
-    this is a recent addition to the schema format, OVSDB permits it
-    to be omitted, but future versions of OVSDB will require it to be
-    present.  Open vSwitch semantics for "version" are described in
-    ovs-vswitchd.conf.db(5).
-
-    The "cksum" optionally reports an implementation-defined checksum
-    for the database schema.
-
-<table-schema>
-
-    A JSON object with the following members:
-
-        "columns": {<id>: <column-schema>, ...}   required
-        "maxRows": <integer>                      optional
-        "isRoot": <boolean>                       optional
-        "indexes": [<column-set>*]                optional
-
-    The value of "columns" is a JSON object whose names are column
-    names and whose values are <column-schema>s.
-
-    Every table has the following columns whose definitions are not
-    included in the schema:
-
-        "_uuid": This column, which contains exactly one UUID value,
-        is initialized to a random value by the database engine when
-        it creates a row.  It is read-only, and its value never
-        changes during the lifetime of a row.
-
-        "_version": Like "_uuid", this column contains exactly one
-        UUID value, initialized to a random value by the database
-        engine when it creates a row, and it is read-only.  However,
-        its value changes to a new random value whenever any other
-        field in the row changes.  Furthermore, its value is
-        ephemeral: when the database is closed and reopened, or when
-        the database process is stopped and then started again, each
-        "_version" also changes to a new random value.
-
-    If "isRoot" is omitted or specified as false, then any given row
-    in the table may exist only when there is at least one reference
-    to it, with refType "strong", from a different row (in the same
-    table or a different table).  This is a "deferred" action:
-    unreferenced rows in the table are deleted just before transaction
-    commit.  If "isRoot" is specified as true, then rows in the table
-    exist independent of any references (they can be thought of as
-    part of the "root set" in a garbage collector).
-
-    For compatibility with schemas created before "isRoot" was
-    introduced, if "isRoot" is omitted or false in every
-    <table-schema> in a given <database-schema>, then every table is
-    part of the root set.
-
-    If "maxRows" is specified, as a positive integer, it limits the
-    maximum number of rows that may be present in the table.  This is
-    a "deferred" constraint, enforced only at transaction commit time
-    (see the "transact" request below).  If "maxRows" is not
-    specified, the size of the table is limited only by the resources
-    available to the database server.  "maxRows" constraints are
-    enforced after unreferenced rows are deleted from tables with a
-    false "isRoot".
-
-    If "indexes" is specified, it must be an array of zero or more
-    <column-set>s.  A <column-set> is an array of one or more strings,
-    each of which names a column.  Each <column-set> is a set of
-    columns whose values, taken together within any given row, must be
-    unique within the table.  This is a "deferred" constraint,
-    enforced only at transaction commit time, after unreferenced rows
-    are deleted and dangling weak references are removed.  Ephemeral
-    columns may not be part of indexes.
-
-<column-schema>
-
-    A JSON object with the following members:
-
-        "type": <type>                            required
-        "ephemeral": <boolean>                    optional
-        "mutable": <boolean>                      optional
-
-    The "type" specifies the type of data stored in this column.
-
-    If "ephemeral" is specified as true, then this column's values are
-    not guaranteed to be durable; they may be lost when the database
-    restarts.  A column whose type (either key or value) is a strong
-    reference to a table that is not part of the root set is always
-    durable, regardless of this value.  (Otherwise, restarting the
-    database could lose entire rows.)
-
-    If "mutable" is specified as false, then this column's values may
-    not be modified after they are initially set with the "insert"
-    operation.
-
-<type>
-
-    The type of a database column.  Either an <atomic-type> or a JSON
-    object that describes the type of a database column, with the
-    following members:
-
-        "key": <base-type>                 required
-        "value": <base-type>               optional
-        "min": <integer>                   optional
-        "max": <integer> or "unlimited"    optional
-
-    If "min" or "max" is not specified, each defaults to 1.  If "max"
-    is specified as "unlimited", then there is no specified maximum
-    number of elements, although the implementation will enforce some
-    limit.  After considering defaults, "min" must be exactly 0 or
-    exactly 1, "max" must be at least 1, and "max" must be greater
-    than or equal to "min".
-
-    If "min" and "max" are both 1 and "value" is not specified, the
-    type is the scalar type specified by "key".
-
-    If "min" is not 1 or "max" is not 1, or both, and "value" is not
-    specified, the type is a set of scalar type "key".
-
-    If "value" is specified, the type is a map from type "key" to type
-    "value".
-
-<base-type>
-
-    The type of a key or value in a database column.  Either an
-    <atomic-type> or a JSON object with the following members:
-
-        "type": <atomic-type>              required
-        "enum": <value>                    optional
-        "minInteger": <integer>            optional, integers only
-        "maxInteger": <integer>            optional, integers only
-        "minReal": <real>                  optional, reals only
-        "maxReal": <real>                  optional, reals only
-        "minLength": <integer>             optional, strings only
-        "maxLength": <integer>             optional, strings only
-        "refTable": <id>                   optional, uuids only
-        "refType": "strong" or "weak"      optional, only with "refTable"
-
-    An <atomic-type> by itself is equivalent to a JSON object with a
-    single member "type" whose value is the <atomic-type>.
-
-    "enum" may be specified as a <value> whose type is a set of one
-    or more values specified for the member "type".  If "enum" is
-    specified, then the valid values of the <base-type> are limited to
-    those in the <value>.
-
-    "enum" is mutually exclusive with the following constraints.
-
-    If "type" is "integer", then "minInteger" or "maxInteger" or both
-    may also be specified, restricting the valid integer range.  If
-    both are specified, then the maxInteger must be greater than or
-    equal to minInteger.
-
-    If "type" is "real", then "minReal" or "maxReal" or both may also
-    be specified, restricting the valid real range.  If both are
-    specified, then the maxReal must be greater than or equal to
-    minReal.
-
-    If "type" is "string", then "minLength" and "maxLength" or both
-    may be specified, restricting the valid length of value strings.
-    If both are specified, then maxLength must be greater than or
-    equal to minLength.  String length is measured in characters (not
-    bytes or UTF-16 code units).
-
-    If "type" is "uuid", then "refTable", if present, must be the name
-    of a table within this database.  If "refTable" is specified, then
-    "refType" may also be specified.  If "refTable" is set, the effect
-    depends on "refType":
-
-        - If "refType" is "strong" or if "refType" is omitted, the
-          allowed UUIDs are limited to UUIDs for rows in the named
-          table.
-
-        - If "refType" is "weak", then any UUIDs are allowed, but
-          UUIDs that do not correspond to rows in the named table will
-          be automatically deleted.
-
-    "refTable" constraints are "deferred" constraints: they are
-    enforced only at transaction commit time (see the "transact"
-    request below).  The other contraints on <base-type> are
-    "immediate", enforced immediately by each operation.
-
-<atomic-type>
-
-    One of the strings "integer", "real", "boolean", "string", or
-    "uuid", representing the specified scalar type.
-
-Wire Protocol
--------------
-
-The database wire protocol is implemented in JSON-RPC 1.0.  We
-encourage use of JSON-RPC over stream connections instead of JSON-RPC
-over HTTP, for these reasons:
-
-    * JSON-RPC is a peer-to-peer protocol, but HTTP is a client-server
-      protocol, which is a poor match.  Thus, JSON-RPC over HTTP
-      requires the client to periodically poll the server to receive
-      server requests.
-
-    * HTTP is more complicated than stream connections and doesn't
-      provide any corresponding advantage.
-
-    * The JSON-RPC specification for HTTP transport is incomplete.
-
-We are currently using TCP port 6632 for the database JSON-RPC
-connection, but future versions will switch to using IANA-assigned TCP
-port 6640.
-
-The database wire protocol consists of the following JSON-RPC methods:
-
-list_dbs
-........
-
-Request object members:
-
-    "method": "list_dbs"              required
-    "params": []                      required
-    "id": <nonnull-json-value>        required
-
-Response object members:
-
-    "result": [<db-name>, ...]
-    "error": null
-    "id": same "id" as request
-
-This operation retrieves an array whose elements are <db-name>s
-that name the databases that can be accessed over this JSON-RPC
-connection.
-
-get_schema
-..........
-
-Request object members:
-
-    "method": "get_schema"            required
-    "params": [<db-name>]             required
-    "id": <nonnull-json-value>        required
-
-Response object members:
-
-    "result": <database-schema>
-    "error": null
-    "id": same "id" as request
-
-This operation retrieves a <database-schema> that describes hosted
-database <db-name>.
-
-transact
-........
-
-Request object members:
-
-    "method": "transact"                  required
-    "params": [<db-name>, <operation>*]   required
-    "id": <nonnull-json-value>            required
-
-Response object members:
-
-    "result": [<object>*]
-    "error": null
-    "id": same "id" as request
-
-The "params" array for this method consists of a <db-name> that
-identifies the database to which the transaction applies, followed by
-zero or more JSON objects, each of which represents a single database
-operation.  The "Operations" section below describes the valid
-operations.
-
-The value of "id" must be unique among all in-flight transactions
-within the current JSON-RPC session.  Otherwise, the server may return
-a JSON-RPC error.
-
-The database server executes each of the specified operations in the
-specified order, except that if an operation fails, then the remaining
-operations are not executed.
-
-The set of operations is executed as a single atomic, consistent,
-isolated transaction.  The transaction is committed only if every
-operation succeeds.  Durability of the commit is not guaranteed unless
-the "commit" operation, with "durable" set to true, is included in the
-operation set (see below).
-
-Regardless of whether errors occur, the response is always a JSON-RPC
-response with null "error" and a "result" member that is an array with
-the same number of elements as "params".  Each element of the "result"
-array corresponds to the same element of the "params" array.  The
-"result" array elements may be interpreted as follows:
-
-    - A JSON object that does not contain an "error" member indicates
-      that the operation completed successfully.  The specific members
-      of the object are specified below in the descriptions of
-      individual operations.  Some operations do not produce any
-      results, in which case the object will have no members.
-
-    - An <error>, which indicates that the operation completed with an
-      error.
-
-    - A JSON null value indicates that the operation was not attempted
-      because a prior operation failed.
-
-In general, "result" contains some number of successful results,
-possibly followed by an error, in turn followed by enough JSON null
-values to match the number of elements in "params".  There is one
-exception: if all of the operations succeed, but the results cannot be
-committed, then "result" will have one more element than "params",
-with the additional element an <error>.  The possible "error" strings
-include at least the following:
-
-    "error": "referential integrity violation"
-
-        When the commit was attempted, a column's value referenced the
-        UUID for a row that did not exist in the table named by the
-        column's <base-type> key or value "refTable" that has a
-        "refType" of "strong".  (This can be caused by inserting a row
-        that references a nonexistent row, by deleting a row that is
-        still referenced by another row, by specifying the UUID for a
-        row in the wrong table, and other ways.)
-
-    "error": "constraint violation"
-
-        A column with a <base-type> key or value "refTable" whose
-        "refType" is "weak" became empty due to deletion(s) caused
-        because the rows that it referenced were deleted (or never
-        existed, if the column's row was inserted within the
-        transaction), and this column is not allowed to be empty
-        because its <type> has a "min" of 1.
-
-    "error": "constraint violation"
-
-        The number of rows in a table exceeds the maximum number
-        permitted by the table's "maxRows" value (see <table-schema>).
-
-    "error": "constraint violation"
-
-        Two or more rows in a table had the same values in the columns
-        that comprise an index.
-
-    "error": "resources exhausted"
-    "error": "I/O error"
-
-        As described in the definition of <error> above.
-
-If "params" contains one or more "wait" operations, then the
-transaction may take an arbitrary amount of time to complete.  The
-database implementation must be capable of accepting, executing, and
-replying to other transactions and other JSON-RPC requests while a
-transaction or transactions containing "wait" operations are
-outstanding on the same or different JSON-RPC sessions.
-
-The section "Notation for the Wire Protocol" below describes
-additional notation for use with the wire protocol.  After that, the
-"Operations" section describes each operation.
-
-cancel
-......
-
-Request object members:
-
-    "method": "cancel"                              required
-    "params": [the "id" for an outstanding request] required
-    "id": null                                      required
-
-Response object members:
-
-    <no response>
-
-This JSON-RPC notification instructs the database server to
-immediately complete or cancel the "transact" request whose "id" is
-the same as the notification's "params" value.
-
-If the "transact" request can be completed immediately, then the
-server sends a response in the form described for "transact", above.
-Otherwise, the server sends a JSON-RPC error response of the following
-form:
-
-    "result": null
-    "error": "canceled"
-    "id": the request "id" member
-
-The "cancel" notification itself has no reply.
-
-monitor
-.......
-
-Request object members:
-
-    "method": "monitor"                                       required
-    "params": [<db-name>, <json-value>, <monitor-requests>]   required
-    "id": <nonnull-json-value>                                required
-
-<monitor-requests> is an object that maps from a table name to an
-array of <monitor-request> objects.  For backward compatibility, a
-single <monitor-request> may be used instead of an array; it is
-treated as a single-element array.
-
-Each <monitor-request> is an object with the following members:
-
-    "columns": [<column>*]            optional
-    "select": <monitor-select>        optional
-
-<monitor-select> is an object with the following members:
-
-    "initial": <boolean>              optional
-    "insert": <boolean>               optional
-    "delete": <boolean>               optional
-    "modify": <boolean>               optional
-
-Response object members:
-
-    "result": <table-updates>
-    "error": null
-    "id": same "id" as request
-
-This JSON-RPC request enables a client to replicate tables or subsets
-of tables within database <db-name>.  Each element of
-<monitor-requests> specifies a table to be replicated.  The JSON-RPC
-response to the "monitor" includes the initial contents of each table,
-unless disabled (see below).  Afterward, when changes to those tables
-are committed, the changes are automatically sent to the client using
-the "update" monitor notification.  This monitoring persists until the
-JSON-RPC session terminates or until the client sends a
-"monitor_cancel" JSON-RPC request.
-
-Each <monitor-request> describes how to monitor columns in a table:
-
-    The circumstances in which an "update" notification is sent for a
-    row within the table are determined by <monitor-select>:
-
-        If "initial" is omitted or true, every row in the table is
-        sent as part of the reply to the "monitor" request.
-
-        If "insert" is omitted or true, "update" notifications are
-        sent for rows newly inserted into the table.
-
-        If "delete" is omitted or true, "update" notifications are
-        sent for rows deleted from the table.
-
-        If "modify" is omitted or true, "update" notifications are
-        sent whenever when a row in the table is modified.
-
-    The "columns" member specifies the columns whose values are
-    monitored.  It must not contain duplicates.  If "columns" is
-    omitted, all columns in the table, except for "_uuid", are
-    monitored.
-
-If there is more than one <monitor-request> in an array of them, then
-each <monitor-request> in the array should specify both "columns" and
-"select", and the "columns" must be non-overlapping sets.
-
-The "result" in the JSON-RPC response to the "monitor" request is a
-<table-updates> object (see below) that contains the contents of the
-tables for which "initial" rows are selected.  If no tables' initial
-contents are requested, then "result" is an empty object.
-
-update
-......
-
-Notification object members:
-
-    "method": "update"
-    "params": [<json-value>, <table-updates>]
-    "id": null
-
-The <json-value> in "params" is the same as the value passed as the
-<json-value> in "params" for the "monitor" request.
-
-<table-updates> is an object that maps from a table name to a
-<table-update>.
-
-A <table-update> is an object that maps from the row's UUID (as a
-36-byte string) to a <row-update> object.
-
-A <row-update> is an object with the following members:
-
-    "old": <row>         present for "delete" and "modify" updates
-    "new": <row>         present for "initial", "insert", and "modify" updates
-
-This JSON-RPC notification is sent from the server to the client to
-tell it about changes to a monitored table (or the initial state of a
-modified table).  Each table in which one or more rows has changed (or
-whose initial view is being presented) is represented in "updates".
-Each row that has changed (or whose initial view is being presented)
-is represented in its <table-update> as a member with its name taken
-from the row's _uuid member.  The corresponding value is a
-<row-update>:
-
-    The "old" member is present for "delete" and "modify" updates.
-    For "delete" updates, each monitored column is included.  For
-    "modify" updates, the prior value of each monitored column whose
-    value has changed is included (monitored columns that have not
-    changed are represented in "new").
-
-    The "new" member is present for "initial", "insert", and "modify"
-    updates.  For "initial" and "insert" updates, each monitored
-    column is included.  For "modify" updates, the new value of each
-    monitored column is included.
-
-monitor_cancel
-..............
-
-Request object members:
-
-    "method": "monitor_cancel"                              required
-    "params": [<json-value>]                                required
-    "id": <nonnull-json-value>                              required
-
-Response object members:
-
-    "result": {}
-    "error": null
-    "id": the request "id" member
-
-Cancels the ongoing table monitor request, identified by the
-<json-value> in "params" matching the <json-value> in "params" for an
-ongoing "monitor" request.  No more "update" messages will be sent for
-this table monitor.
-
-lock operations
-...............
-
-Request object members:
-
-    "method": "lock", "steal", or "unlock"          required
-    "params": [<id>]                                required
-    "id": <nonnull-json-value>                      required
-
-Response object members:
-
-    "result": {"locked": <boolean>}     for "lock"
-    "result": {"locked": true}          for "steal"
-    "result": {}                        for "unlock"
-    "error": null
-    "id": same "id" as request
-
-Performs an operation on a "lock" object.  The database server
-supports an arbitrary number of locks, each of which is identified by
-a client-defined id (given in "params").  At any given time, each lock
-may have at most one owner.
-
-The locking operation depends on "method":
-
-    - "lock": The database will assign this client ownership of the
-      lock as soon as it becomes available.  When multiple clients
-      request the same lock, they will receive it in first-come, first
-      served order.
-
-    - "steal": The database immediately assigns this client ownership
-      of the lock.  If there is an existing owner, it loses ownership.
-
-    - "unlock": If the client owns the lock, releases it.  If the
-      client is waiting to obtain the lock, cancels the request and
-      stops waiting.
-
-      (Closing or otherwise disconnecting a database client connection
-      unlocks all of its locks.)
-
-For any given lock, the client must alternate "lock" or "steal"
-operations with "unlock" operations.  That is, if the previous
-operation on a lock was "lock" or "steal", it must be followed by an
-"unlock" operation, and vice versa.
-
-For a "lock" operation, the "locked" member in the response object is
-true if the lock has already been acquired, false if another client
-holds the lock and the client's request for it was queued.  In the
-latter case, the client will be notified later with a "locked" message
-when acquisition succeeds.
-
-These requests complete and send a response quickly, without waiting.
-The "locked" and "stolen" notifications (see below) report
-asynchronous changes to ownership.
-
-The scope of a lock is a database server, not a database hosted by
-that server.  A naming convention, such as "<db-name>__<lock-name>",
-can effectively limit the scope of a lock to a particular database.
-
-locked
-......
-
-Notification object members:
-
-    "method": "locked"
-    "params": [<id>]
-    "id": null
-
-Notifies the client that a "lock" operation that it previously
-requested has succeeded.  The client now owns the lock named in
-"params".
-
-The database server sends this notification after the reply to the
-corresponding "lock" request (but only if the "locked" member of the
-response was false), and before the reply to the client's subsequent
-"unlock" request.
-
-stolen
-......
-
-Notification object members:
-
-    "method": "stolen"
-    "params": [<id>]
-    "id": null
-
-Notifies the client that owns a lock that another database client has
-stolen ownership of the lock.  The client no longer owns the lock
-named in "params".  The client must still issue an "unlock" request
-before performing any subsequent "lock" or "steal" operation on the
-lock.
-
-If the client originally obtained the lock through a "lock" request,
-then it will automatically regain the lock later after the client that
-stole it releases it.  (The database server will send the client a
-"locked" notification at that point to let it know.)
-
-If the client originally obtained the lock through a "steal" request,
-the database server won't automatically reassign it ownership of the
-lock when it later becomes available.  To regain ownership, the client
-must "unlock" and then "lock" or "steal" the lock again.
-
-echo
-....
-
-Request object members:
-
-    "method": "echo"                                required
-    "params": JSON array with any contents          required
-    "id": <json-value>                              required
-
-Response object members:
-
-    "result": same as "params"
-    "error": null
-    "id": the request "id" member
-
-Both the JSON-RPC client and the server must implement this request.
-
-This JSON-RPC request and response can be used to implement connection
-keepalives, by allowing the server to check that the client is still
-there or vice versa.
-
-
-Notation for the Wire Protocol
-------------------------------
-
-<db-name>
-
-    An <id> that names a database.  The valid <db-name>s can be
-    obtained using a "list-db" request.  The <db-name> is taken from
-    the "name" member of <database-schema>.
-
-<table>
-
-    An <id> that names a table.
-
-<column>
-
-    An <id> that names a table column.
-
-<row>
-
-    A JSON object that describes a table row or a subset of a table
-    row.  Each member is the name of a table column paired with the
-    <value> of that column.
-
-<value>
-
-    A JSON value that represents the value of a column in a table row,
-    one of <atom>, a <set>, or a <map>.
-
-<atom>
-
-    A JSON value that represents a scalar value for a column, one of
-    <string>, <number>, <boolean>, <uuid>, <named-uuid>.
-
-<set>
-
-    Either an <atom>, representing a set with exactly one element, or
-    a 2-element JSON array that represents a database set value.  The
-    first element of the array must be the string "set" and the second
-    element must be an array of zero or more <atom>s giving the values
-    in the set.  All of the <atom>s must have the same type.
-
-<map>
-
-    A 2-element JSON array that represents a database map value.  The
-    first element of the array must be the string "map" and the second
-    element must be an array of zero or more <pair>s giving the values
-    in the map.  All of the <pair>s must have the same key and value
-    types.
-
-    (JSON objects are not used to represent <map> because JSON only
-    allows string names in an object.)
-
-<pair>
-
-    A 2-element JSON array that represents a pair within a database
-    map.  The first element is an <atom> that represents the key, the
-    second element is an <atom> that represents the value.
-
-<uuid>
-
-    A 2-element JSON array that represents a UUID.  The first element
-    of the array must be the string "uuid" and the second element must
-    be a 36-character string giving the UUID in the format described
-    by RFC 4122.  For example, the following <uuid> represents the
-    UUID 550e8400-e29b-41d4-a716-446655440000:
-
-        ["uuid", "550e8400-e29b-41d4-a716-446655440000"]
-
-<named-uuid>
-
-    A 2-element JSON array that represents the UUID of a row inserted
-    in an "insert" operation within the same transaction.  The first
-    element of the array must be the string "named-uuid" and the
-    second element should be the <id> specified as the "uuid-name"
-    for an "insert" operation within the same transaction.  For
-    example, if an "insert" operation within this transaction
-    specifies a "uuid-name" of "myrow", the following <named-uuid>
-    represents the UUID created by that operation:
-
-        ["named-uuid", "myrow"]
-
-    A <named-uuid> may be used anywhere a <uuid> is valid.
-
-<condition>
-
-    A 3-element JSON array of the form [<column>, <function>,
-    <value>] that represents a test on a column value.
-
-    Except as otherwise specified below, <value> must have the same
-    type as <column>.
-
-    The meaning depends on the type of <column>:
-
-        integer
-        real
-
-            <function> must be "<", "<=", "==", "!=", ">=", ">",
-            "includes", or "excludes".
-
-            The test is true if the column's value satisfies the
-            relation <function> <value>, e.g. if the column has value
-            1 and <value> is 2, the test is true if <function> is "<",
-            "<=" or "!=", but not otherwise.
-
-            "includes" is equivalent to "=="; "excludes" is equivalent
-            to "!=".
-
-        boolean
-        string
-        uuid
-
-            <function> must be "!=", "==", "includes", or "excludes".
-
-            If <function> is "==" or "includes", the test is true if
-            the column's value equals <value>.  If <function> is "!="
-            or "excludes", the test is inverted.
-
-        set
-        map
-
-            <function> must be "!=", "==", "includes", or "excludes".
-
-            If <function> is "==", the test is true if the column's
-            value contains exactly the same values (for sets) or pairs
-            (for maps).  If <function> is "!=", the test is inverted.
-
-            If <function> is "includes", the test is true if the
-            column's value contains all of the values (for sets) or
-            pairs (for maps) in <value>.  The column's value may also
-            contain other values or pairs.
-
-            If <function> is "excludes", the test is true if the
-            column's value does not contain any of the values (for
-            sets) or pairs (for maps) in <value>.  The column's value
-            may contain other values or pairs not in <value>.
-
-            If <function> is "includes" or "excludes", then the
-            required type of <value> is slightly relaxed, in that it
-            may have fewer than the minimum number of elements
-            specified by the column's type.  If <function> is
-            "excludes", then the required type is additionally relaxed
-            in that <value> may have more than the maximum number of
-            elements specified by the column's type.
-
-<function>
-
-    One of "<", "<=", "==", "!=", ">=", ">", "includes", "excludes".
-
-<mutation>
-
-    A 3-element JSON array of the form [<column>, <mutator>, <value>]
-    that represents a change to a column value.
-
-    Except as otherwise specified below, <value> must have the same
-    type as <column>.
-
-    The meaning depends on the type of <column>:
-
-        integer
-        real
-
-            <mutator> must be "+=", "-=", "*=", "/=" or (integer only)
-            "%=".  The value of <column> is changed to the sum,
-            difference, product, quotient, or remainder, respectively,
-            of <column> and <value>.
-
-            Constraints on <column> are ignored when parsing <value>.
-
-        boolean
-        string
-        uuid
-
-            No valid <mutator>s are currently defined for these types.
-
-        set
-
-            Any <mutator> valid for the set's element type may be
-            applied to the set, in which case the mutation is applied
-            to each member of the set individually.  <value> must be a
-            scalar value of the same type as the set's element type,
-            except that contraints are ignored.
-
-            If <mutator> is "insert", then each of the values in the
-            set in <value> is added to <column> if it is not already
-            present.  The required type of <value> is slightly
-            relaxed, in that it may have fewer than the minimum number
-            of elements specified by the column's type.
-
-            If <mutator> is "delete", then each of the values in the
-            set in <value> is removed from <column> if it is present
-            there.  The required type is slightly relaxed in that
-            <value> may have more or less than the maximum number of
-            elements specified by the column's type.
-
-        map
-
-            <mutator> must be "insert" or "delete".
-
-            If <mutator> is "insert", then each of the key-value pairs
-            in the map in <value> is added to <column> only if its key
-            is not already present.  The required type of <value> is
-            slightly relaxed, in that it may have fewer than the
-            minimum number of elements specified by the column's type.
-
-            If <mutator> is "delete", then <value> may have the same
-            type as <column> (a map type) or it may be a set whose
-            element type is the same as <column>'s key type:
-
-                - If <value> is a map, the mutation deletes each
-                  key-value pair in <column> whose key and value equal
-                  one of the key-value pairs in <value>.
-
-                - If <value> is a set, the mutation deletes each
-                  key-value pair in <column> whose key equals one of
-                  the values in <value>.
-
-            For "delete", <value> may have any number of elements,
-            regardless of restrictions on the number of elements in
-            <column>.
-
-<mutator>
-
-    One of "+=", "-=", "*=", "/=", "%=", "insert", "delete".
-
-Operations
-----------
-
-Each of the available operations is described below.
-
-insert
-......
-
-Request object members:
-
-    "op": "insert"          required
-    "table": <table>        required
-    "row": <row>            required
-    "uuid-name": <id>       optional
-
-Result object members:
-
-    "uuid": <uuid>
-
-Semantics:
-
-    Inserts "row" into "table".
-
-    If "row" does not specify values for all the columns in "table",
-    those columns receive default values.  The default value for a
-    column depends on its type.  The default for a column whose <type>
-    specifies a "min" of 0 is an empty set or empty map.  Otherwise,
-    the default is a single value or a single key-value pair, whose
-    value(s) depend on its <atomic-type>:
-
-        - "integer" or "real": 0
-
-        - "boolean": false
-
-        - "string": "" (the empty string)
-
-        - "uuid": 00000000-0000-0000-0000-000000000000
-
-    The new row receives a new, randomly generated UUID.
-
-    If "uuid-name" is supplied, then it is an error if <id> is not
-    unique among the "uuid-name"s supplied on all the "insert"
-    operations within this transaction.
-
-    The UUID for the new row is returned as the "uuid" member of the
-    result.
-
-Errors:
-
-    "error": "duplicate uuid-name"
-
-        The same "uuid-name" appears on another "insert" operation
-        within this transaction.
-
-    "error": "constraint violation"
-
-        One of the values in "row" does not satisfy the immediate
-        constraints for its column's <base-type>.  This error will
-        occur for columns that are not explicitly set by "row" if the
-        default value does not satisfy the column's constraints.
-
-select
-......
-
-Request object members:
-
-    "op": "select"                required
-    "table": <table>              required
-    "where": [<condition>*]       required
-    "columns": [<column>*]        optional
-
-Result object members:
-
-    "rows": [<row>*]
-
-Semantics:
-
-    Searches "table" for rows that match all the conditions specified
-    in "where".  If "where" is an empty array, every row in "table" is
-    selected.
-
-    The "rows" member of the result is an array of objects.  Each
-    object corresponds to a matching row, with each column
-    specified in "columns" as a member, the column's name as the
-    member name and its value as the member value.  If "columns"
-    is not specified, all the table's columns are included.  If
-    two rows of the result have the same values for all included
-    columns, only one copy of that row is included in "rows".
-    Specifying "_uuid" within "columns" will avoid dropping
-    duplicates, since every row has a unique UUID.
-
-    The ordering of rows within "rows" is unspecified.
-
-update
-......
-
-Request object members:
-
-    "op": "update"                required
-    "table": <table>              required
-    "where": [<condition>*]       required
-    "row": <row>                  required
-
-Result object members:
-
-    "count": <integer>
-
-Semantics:
-
-    Updates rows in a table.
-
-    Searches "table" for rows that match all the conditions
-    specified in "where".  For each matching row, changes the
-    value of each column specified in "row" to the value for that
-    column specified in "row".
-
-    The "_uuid" and "_version" columns of a table may not be directly
-    updated with this operation.  Columns designated read-only in the
-    schema also may not be updated.
-
-    The "count" member of the result specifies the number of rows
-    that matched.
-
-Errors:
-
-    "error": "constraint violation"
-
-        One of the values in "row" does not satisfy the immediate
-        constraints for its column's <base-type>.
-mutate
-......
-
-Request object members:
-
-    "op": "mutate"                required
-    "table": <table>              required
-    "where": [<condition>*]       required
-    "mutations": [<mutation>*]    required
-
-Result object members:
-
-    "count": <integer>
-
-Semantics:
-
-    Mutates rows in a table.
-
-    Searches "table" for rows that match all the conditions specified
-    in "where".  For each matching row, mutates its columns as
-    specified by each <mutation> in "mutations", in the order
-    specified.
-
-    The "_uuid" and "_version" columns of a table may not be directly
-    modified with this operation.  Columns designated read-only in the
-    schema also may not be updated.
-
-    The "count" member of the result specifies the number of rows
-    that matched.
-
-Errors:
-
-    "error": "domain error"
-
-        The result of the mutation is not mathematically defined,
-        e.g. division by zero.
-
-    "error": "range error"
-
-        The result of the mutation is not representable within the
-        database's format, e.g. an integer result outside the range
-        INT64_MIN...INT64_MAX or a real result outside the range
-        -DBL_MAX...DBL_MAX.
-
-    "error": "constraint violation"
-
-        The mutation caused the column's value to violate a
-        constraint, e.g. it caused a column to have more or fewer
-        values than are allowed, an arithmetic operation caused a set
-        or map to have duplicate elements, or it violated a constraint
-        specified by a column's <base-type>.
-
-delete
-......
-
-Request object members:
-
-    "op": "delete"                required
-    "table": <table>              required
-    "where": [<condition>*]       required
-
-Result object members:
-
-    "count": <integer>
-
-Semantics:
-
-    Deletes all the rows from "table" that match all the conditions
-    specified in "where".
-
-    The "count" member of the result specifies the number of deleted
-    rows.
-
-wait
-....
-
-Request object members:
-
-    "op": "wait"                        required
-    "timeout": <integer>                optional
-    "table": <table>                    required
-    "where": [<condition>*]             required
-    "columns": [<column>*]              required
-    "until": "==" or "!="               required
-    "rows": [<row>*]                    required
-
-Result object members:
-
-    none
-
-Semantics:
-
-    Waits until a condition becomes true.
-
-    If "until" is "==", checks whether the query on "table" specified
-    by "where" and "columns", which is evaluated in the same way as
-    specified for "select", returns the result set specified by
-    "rows".  If it does, then the operation completes successfully.
-    Otherwise, the entire transaction rolls back.  It is automatically
-    restarted later, after a change in the database makes it possible
-    for the operation to succeed.  The client will not receive a
-    response until the operation permanently succeeds or fails.
-
-    If "until" is "!=", the sense of the test is negated.  That is, as
-    long as the query on "table" specified by "where" and "columns"
-    returns "rows", the transaction will be rolled back and restarted
-    later.
-
-    If "timeout" is specified, then the transaction aborts after the
-    specified number of milliseconds.  The transaction is guaranteed
-    to be attempted at least once before it aborts.  A "timeout" of 0
-    will abort the transaction on the first mismatch.
-
-Errors:
-
-    "error": "not supported"
-
-        One or more of the columns in this table do not support
-        triggers.  This error will not occur if "timeout" is 0.
-
-    "error": "timed out"
-
-        The "timeout" was reached before the transaction was able to
-        complete.
-
-commit
-......
-
-Request object members:
-
-    "op": "commit"                      required
-    "durable": <boolean>                required
-
-Result object members:
-
-    none
-
-Semantics:
-
-    If "durable" is specified as true, then the transaction, if it
-    commits, will be stored durably (to disk) before the reply is sent
-    to the client.
-
-Errors:
-
-    "error": "not supported"
-
-        When "durable" is true, this database implementation does not
-        support durable commits.
-
-abort
-.....
-
-Request object members:
-
-    "op": "abort"                      required
-
-Result object members:
-
-    (never succeeds)
-
-Semantics:
-
-    Aborts the transaction with an error.  This may be useful for
-    testing.
-
-Errors:
-
-    "error": "aborted"
-
-        This operation always fails with this error.
-
-comment
-.......
-
-
-Request object members:
-
-    "op": "comment"                    required
-    "comment": <string>                required
-
-Result object members:
-
-    none
-
-Semantics:
-
-    Provides information to a database administrator on the purpose of
-    a transaction.  The OVSDB server, for example, adds comments in
-    transactions that modify the database to the database journal.
-
-assert
-......
-
-Request object members:
-
-    "op": "assert"                     required
-    "lock": <id>                       required
-
-Result object members:
-
-    none
-
-Semantics:
-
-    If the client does not own the lock named <string>, aborts the
-    transaction.
-
-Errors:
-
-    "error": "not owner"
-
-        The client does not own the named lock.
index dfb900a..404848e 100644 (file)
@@ -65,7 +65,6 @@ DISTCLEANFILES += ovsdb/ovsdb-server.1
 MAN_ROOTS += ovsdb/ovsdb-server.1.in
 
 # ovsdb-idlc
-EXTRA_DIST += ovsdb/SPECS
 noinst_SCRIPTS += ovsdb/ovsdb-idlc
 EXTRA_DIST += ovsdb/ovsdb-idlc.in
 MAN_ROOTS += ovsdb/ovsdb-idlc.1
index 692830c..cfaa656 100644 (file)
@@ -1512,8 +1512,8 @@ ovsdb_jsonrpc_monitor_change_cb(const struct ovsdb_row *old,
     return true;
 }
 
-/* Returns JSON for a <row-update> (as described in ovsdb/SPECS) for 'row'
- * within 'mt', or NULL if no row update should be sent.
+/* Returns JSON for a <row-update> (as described in RFC 7047) for 'row' within
+ * 'mt', or NULL if no row update should be sent.
  *
  * The caller should specify 'initial' as true if the returned JSON is going to
  * be used as part of the initial reply to a "monitor" request, false if it is
@@ -1596,9 +1596,9 @@ ovsdb_jsonrpc_monitor_compose_row_update(
 }
 
 /* Constructs and returns JSON for a <table-updates> object (as described in
- * ovsdb/SPECS) for all the outstanding changes within 'monitor', and deletes
- * all the outstanding changes from 'monitor'.  Returns NULL if no update needs
- * to be sent.
+ * RFC 7047) for all the outstanding changes within 'monitor', and deletes all
+ * the outstanding changes from 'monitor'.  Returns NULL if no update needs to
+ * be sent.
  *
  * The caller should specify 'initial' as true if the returned JSON is going to
  * be used as part of the initial reply to a "monitor" request, false if it is
index a4cf344..15382b4 100644 (file)
@@ -183,6 +183,54 @@ the command line or through the \fBovsdb\-server/add\-db\fR command.
 .so lib/vlog-unixctl.man
 .so lib/memory-unixctl.man
 .so lib/coverage-unixctl.man
+.SH "SPECIFICATIONS"
+.
+.PP
+\fBovsdb\-server\fR implements the Open vSwitch Database (OVSDB)
+protocol specified in RFC 7047, with the following clarifications:
+.
+.IP "3.1. JSON Usage"
+RFC 4627 says that names within a JSON object should be unique.
+The Open vSwitch JSON parser discards all but the last value
+for a name that is specified more than once.
+.
+.IP "3.2. Schema Format"
+RFC 7047 requires the "version" field in <database-schema>.  Current
+versions of \fBovsdb\-server\fR allow it to be omitted (future
+versions are likely to require it).
+.
+.IP "4. Wire Protocol"
+The original OVSDB specifications included the following reason,
+omitted from RFC 7047, to operate JSON-RPC directly over a stream
+instead of over HTTP:
+.
+.RS
+.IP \(bu
+JSON-RPC is a peer-to-peer protocol, but HTTP is a client-server
+protocol, which is a poor match.  Thus, JSON-RPC over HTTP requires
+the client to periodically poll the server to receive server requests.
+.IP \(bu
+HTTP is more complicated than stream connections and doesn't provide
+any corresponding advantage.
+.IP \(bu
+The JSON-RPC specification for HTTP transport is incomplete.
+.RE
+.
+.IP "4.1.5. Monitor"
+For backward compatibility, \fBovsdb\-server\fR currently permits a
+single <monitor-request> to be used instead of an array; it is treated
+as a single-element array.  Future versions of \fBovsdb\-server\fR
+might remove this compatibility feature.
+.IP
+Because the <json-value> parameter is used to match subsequent update
+notifications (see below) to the request, it must be unique among all
+active monitors.  \fBovsdb\-server\fR rejects attempt to create two
+monitors with the same identifier.
+.
+.IP "6. IANA Considerations"
+\fBovsdb\-server\fR currently defaults to its historical port number
+6632.  Future versions will adopt IANA-assigned port 6640 as default.
+
 .SH "SEE ALSO"
 .
 .BR ovsdb\-tool (1).
index e21a1cc..6baff38 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2009, 2010, 2011 Nicira, Inc.
+# Copyright (c) 2009, 2010, 2011, 2014 Nicira, Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -307,7 +307,7 @@ class Datum(object):
         Violations of constraints expressed by 'type' are treated as errors.
 
         If 'symtab' is nonnull, then named UUIDs in 'symtab' are accepted.
-        Refer to ovsdb/SPECS for information about this, and for the syntax
+        Refer to RFC 7047 for information about this, and for the syntax
         that this function accepts."""
         is_map = type_.is_map()
         if (is_map or