
The schwag was introduced to generate swagger with authorization support [1][1] in 2017. And in 2018, the grpc-gateway supports to render security fields by protoc-gen-swagger [2][2]. After several years, I think it's good to use upstream protoc supports. NOTE: The json's key in `rpc.swagger.json` has been reordered so that it seems that there's a lot of changes. How to verify it: ```bash $ # use jq -S to sort the key $ latest_commit="https://raw.githubusercontent.com/etcd-io/etcd/228f493c7697ce3e9d3a1d831bcffad175846c75/Documentation/dev-guide/apispec/swagger/rpc.swagger.json" $ curl -s "${latest_commit}" | jq -S . > /tmp/old.json $ cat Documentation/dev-guide/apispec/swagger/rpc.swagger.json | jq -S . > /tmp/new.json $ diff --color -u /tmp/old.json /tmp/new.json ``` ```diff --- /tmp/old.json 2023-04-26 10:58:07.142311861 +0800 +++ /tmp/new.json 2023-04-26 10:58:12.170299194 +0800 @@ -1523,11 +1523,14 @@ "type": "object" }, "protobufAny": { + "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := &pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": <string>,\n \"lastName\": <string>\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }", "properties": { "type_url": { + "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics.", "type": "string" }, "value": { + "description": "Must be a valid serialized protocol buffer of the above specified type.", "format": "byte", "type": "string" } ``` REF: 1: <https://github.com/etcd-io/etcd/pull/7999#issuecomment-307512043> 2: <https://github.com/grpc-ecosystem/grpc-gateway/pull/547> Signed-off-by: Wei Fu <fuweid89@gmail.com>
etcdutl
etcdutl
is a command line administration utility for etcd.
It's designed to operate directly on etcd data files.
For operations over a network, please use etcdctl
.
DEFRAG [options]
DEFRAG directly defragments an etcd data directory while etcd is not running. When an etcd member reclaims storage space from deleted and compacted keys, the space is kept in a free list and the database file remains the same size. By defragmenting the database, the etcd member releases this free space back to the file system.
In order to defrag a live etcd instances over the network, please use etcdctl defrag
instead.
Options
- data-dir -- Optional. If present, defragments a data directory not in use by etcd.
Output
Exit status '0' when the process was successful.
Example
To defragment a data directory directly, use the --data-dir
flag:
# Defragment while etcd is not running
./etcdutl defrag --data-dir default.etcd
# success (exit status 0)
# Error: cannot open database at default.etcd/member/snap/db
Remarks
DEFRAG returns a zero exit code only if it succeeded in defragmenting all given endpoints.
SNAPSHOT RESTORE [options] <filename>
SNAPSHOT RESTORE creates an etcd data directory for an etcd cluster member from a backend database snapshot and a new cluster configuration. Restoring the snapshot into each member for a new cluster configuration will initialize a new etcd cluster preloaded by the snapshot data.
Options
The snapshot restore options closely resemble to those used in the etcd
command for defining a cluster.
-
data-dir -- Path to the data directory. Uses <name>.etcd if none given.
-
wal-dir -- Path to the WAL directory. Uses data directory if none given.
-
initial-cluster -- The initial cluster configuration for the restored etcd cluster.
-
initial-cluster-token -- Initial cluster token for the restored etcd cluster.
-
initial-advertise-peer-urls -- List of peer URLs for the member being restored.
-
name -- Human-readable name for the etcd cluster member being restored.
-
skip-hash-check -- Ignore snapshot integrity hash value (required if copied from data directory)
Output
A new etcd data directory initialized with the snapshot.
Example
Save a snapshot, restore into a new 3 node cluster, and start the cluster:
# save snapshot
./etcdctl snapshot save snapshot.db
# restore members
./etcdutl snapshot restore snapshot.db --initial-cluster-token etcd-cluster-1 --initial-advertise-peer-urls http://127.0.0.1:12380 --name sshot1 --initial-cluster 'sshot1=http://127.0.0.1:12380,sshot2=http://127.0.0.1:22380,sshot3=http://127.0.0.1:32380'
./etcdutl snapshot restore snapshot.db --initial-cluster-token etcd-cluster-1 --initial-advertise-peer-urls http://127.0.0.1:22380 --name sshot2 --initial-cluster 'sshot1=http://127.0.0.1:12380,sshot2=http://127.0.0.1:22380,sshot3=http://127.0.0.1:32380'
./etcdutl snapshot restore snapshot.db --initial-cluster-token etcd-cluster-1 --initial-advertise-peer-urls http://127.0.0.1:32380 --name sshot3 --initial-cluster 'sshot1=http://127.0.0.1:12380,sshot2=http://127.0.0.1:22380,sshot3=http://127.0.0.1:32380'
# launch members
./etcd --name sshot1 --listen-client-urls http://127.0.0.1:2379 --advertise-client-urls http://127.0.0.1:2379 --listen-peer-urls http://127.0.0.1:12380 &
./etcd --name sshot2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 &
./etcd --name sshot3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 &
SNAPSHOT STATUS <filename>
SNAPSHOT STATUS lists information about a given backend database snapshot file.
Output
Simple format
Prints a humanized table of the database hash, revision, total keys, and size.
JSON format
Prints a line of JSON encoding the database hash, revision, total keys, and size.
Examples
./etcdutl snapshot status file.db
# cf1550fb, 3, 3, 25 kB
./etcdutl --write-out=json snapshot status file.db
# {"hash":3474280699,"revision":3,"totalKey":3,"totalSize":24576}
./etcdutl --write-out=table snapshot status file.db
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| cf1550fb | 3 | 3 | 25 kB |
+----------+----------+------------+------------+
VERSION
Prints the version of etcdutl.
Output
Prints etcd version and API version.
Examples
./etcdutl version
# etcdutl version: 3.5.0
# API version: 3.1
Exit codes
For all commands, a successful execution returns a zero exit code. All failures will return non-zero exit codes.
Output formats
All commands accept an output format by setting -w
or --write-out
. All commands default to the "simple" output format, which is meant to be human-readable. The simple format is listed in each command's Output
description since it is customized for each command. If a command has a corresponding RPC, it will respect all output formats.
If a command fails, returning a non-zero exit code, an error string will be written to standard error regardless of output format.
Simple
A format meant to be easy to parse and human-readable. Specific to each command.
JSON
The JSON encoding of the command's RPC response. Since etcd's RPCs use byte strings, the JSON output will encode keys and values in base64.
Some commands without an RPC also support JSON; see the command's Output
description.
Protobuf
The protobuf encoding of the command's RPC response. If an RPC is streaming, the stream messages will be concatenated. If an RPC is not given for a command, the protobuf output is not defined.
Fields
An output format similar to JSON but meant to parse with coreutils. For an integer field named Field
, it writes a line in the format "Field" : %d
where %d
is go's integer formatting. For byte array fields, it writes "Field" : %q
where %q
is go's quoted string formatting (e.g., []byte{'a', '\n'}
is written as "a\n"
).
Compatibility Support
etcdutl is still in its early stage. We try out best to ensure fully compatible releases, however we might break compatibility to fix bugs or improve commands. If we intend to release a version of etcdutl with backward incompatibilities, we will provide notice prior to release and have instructions on how to upgrade.
Input Compatibility
Input includes the command name, its flags, and its arguments. We ensure backward compatibility of the input of normal commands in non-interactive mode.
Output Compatibility
Currently, we do not ensure backward compatibility of utility commands.