Etcd API
Etcd v3 KV helpers are available under ptool.etcd and p.etcd.
ptool.etcd.connect
v0.11.0- Introduced.
ptool.etcd.connect(options) opens an etcd connection and returns a
Connection object.
options fields:
address(string, required): The etcd HTTP address such ashttp://127.0.0.1:2379or127.0.0.1:2379.token(string, optional): Authorization header value sent with requests.username(string, optional): etcd auth username.password(string, optional): etcd auth password.api_prefix(string, optional): API prefix appended underaddress. Defaults to"v3", which targets the standard v3 gRPC-gateway endpoints.timeout_ms(integer, optional): Default request timeout in milliseconds.
Notes:
tokencannot be combined withusernameorpassword.usernameandpasswordmust be provided together.- When
usernameandpasswordare used,ptool.etcd.connect(...)authenticates throughauth/authenticateand stores the returned token on the connection.
Example:
local etcd = ptool.etcd.connect({
address = "127.0.0.1:2379",
username = "root",
password = p.os.getenv("ETCD_PASSWORD"),
timeout_ms = 10_000,
})
Connection
v0.11.0- Introduced.
Connection represents an open etcd connection returned by
ptool.etcd.connect().
It is implemented as a Lua userdata.
Methods:
conn:get(key[, options])->table | nilconn:put(key, value[, options])->tableconn:delete(key[, options])->tableconn:list([prefix[, options]])->tableconn:request(options)->Response
KV entry table shape:
key(string): The decoded raw key bytes as a Lua string.value(string): The decoded raw value bytes as a Lua string.create_revision(integer): The key creation revision.mod_revision(integer): The last modification revision.version(integer): The number of times the key has been modified.lease(integer): The attached lease ID, or0when no lease is attached.
Response header table shape:
cluster_id(string): The etcd cluster ID rendered as a decimal string.member_id(string): The responding member ID rendered as a decimal string.revision(integer): The store revision for the response.raft_term(string): The raft term rendered as a decimal string.
get
v0.11.0- Introduced.
Canonical API name: ptool.etcd.Connection:get.
conn:get(key[, options]) reads a single etcd KV entry.
key(string, required): The raw key bytes.options(table, optional):revision(integer, optional): Reads the key at a specific revision.serializable(boolean, optional): Uses serializable reads instead of linearizable reads.
- Returns:
table | nil.
Behavior:
- Returns
nilwhen the key does not exist. keyandvalueare binary-safe Lua strings.
Example:
local etcd = ptool.etcd.connect({ address = "127.0.0.1:2379" })
local item = etcd:get("/apps/api/config.json")
if item then
local config = p.json.parse(item.value)
print(item.mod_revision, config.port)
end
put
v0.11.0- Introduced.
Canonical API name: ptool.etcd.Connection:put.
conn:put(key, value[, options]) writes an etcd KV entry.
key(string, required): The raw key bytes.value(string, required): The raw value bytes.options(table, optional):lease(integer, optional): Lease ID to attach to the key.prev_kv(boolean, optional): Whentrue, include the previous KV entry.ignore_value(boolean, optional): Reuse the current value.ignore_lease(boolean, optional): Reuse the current lease.
- Returns:
table.
Return table shape:
header(table | nil): Response header metadata.prev_kv(table | nil): Previous KV entry whenprev_kv = trueand a previous key existed.
Example:
local etcd = ptool.etcd.connect({ address = "127.0.0.1:2379" })
local resp = etcd:put("/apps/api/version", "v2\n", {
prev_kv = true,
})
if resp.prev_kv then
print(resp.prev_kv.value)
end
delete
v0.11.0- Introduced.
Canonical API name: ptool.etcd.Connection:delete.
conn:delete(key[, options]) deletes one key or a whole key prefix.
key(string, required): The raw key bytes. Whenprefix = true, an empty string deletes the full keyspace.options(table, optional):prefix(boolean, optional): Whentrue, delete the full prefix range.prev_kv(boolean, optional): Whentrue, include deleted KV entries.
- Returns:
table.
Return table shape:
header(table | nil): Response header metadata.deleted(integer): Number of deleted keys.prev_kvs(table): Dense Lua array of deleted KV entries.
list
v0.11.0- Introduced.
Canonical API name: ptool.etcd.Connection:list.
conn:list([prefix[, options]]) lists etcd KV entries under a prefix.
prefix(string, optional): The prefix to list. When omitted or empty, the whole keyspace is scanned.options(table, optional):limit(integer, optional): Maximum number of returned entries.revision(integer, optional): Reads at a specific revision.serializable(boolean, optional): Uses serializable reads.keys_only(boolean, optional): Return keys without values.count_only(boolean, optional): Return only the count.min_mod_revision(integer, optional): Minimum modification revision.max_mod_revision(integer, optional): Maximum modification revision.min_create_revision(integer, optional): Minimum creation revision.max_create_revision(integer, optional): Maximum creation revision.sort_order(string, optional): One of"none","ascend", or"descend".sort_target(string, optional): One of"key","version","create","mod", or"value".
- Returns:
table.
Return table shape:
header(table | nil): Response header metadata.kvs(table): Dense Lua array of KV entries.count(integer): Number of matched keys reported by etcd.more(boolean): Whether more results remain on the server.
Example:
local etcd = ptool.etcd.connect({ address = "127.0.0.1:2379" })
local resp = etcd:list("/apps/api/", {
keys_only = true,
sort_order = "ascend",
sort_target = "key",
})
for _, item in ipairs(resp.kvs) do
print(item.key)
end
request
v0.11.0- Introduced.
Canonical API name: ptool.etcd.Connection:request.
conn:request(options) sends a raw HTTP request through the current etcd
connection defaults and returns the same Response object shape as
ptool.http.request(...).
options supports the same request fields as ptool.http.request(options),
plus:
path(string, optional): An etcd-relative path such as"/kv/txn"or"/v3/kv/txn".url(string, optional): An explicit absolute URL.
Notes:
- Exactly one of
pathorurlis required. - Connection defaults automatically add the configured authorization header and
timeout_mswhen they are not overridden by the request. - Relative
pathvalues are resolved against the configuredapi_prefix.
Example:
local etcd = ptool.etcd.connect({ address = "127.0.0.1:2379" })
local resp = etcd:request({
path = "/kv/txn",
json = {
compare = {},
success = {},
failure = {},
},
fail_on_http_error = true,
})
print(resp:text())