Compare commits
405 Commits
master
...
release-3.
Author | SHA1 | Date |
---|---|---|
Benjamin Wang | f565a94844 | |
Benjamin Wang | 306c60a083 | |
Marek Siarkowicz | 2c04d51eaa | |
James Blair | b5f07c9b7d | |
Thomas Jungblut | 423f951409 | |
Thomas Jungblut | b2fb75d147 | |
Benjamin Wang | cf00c2df8b | |
kkkkun | 8cffdbafba | |
Benjamin Wang | ffcde60e67 | |
kkkkun | dca13c6d47 | |
Benjamin Wang | ac034d03d7 | |
daljitdokal | 15d2aefb8e | |
scuzk373x@gmai.com | d3d530c562 | |
Benjamin Wang | 4d4984fde8 | |
Hubert Zhang | 98117389d2 | |
Ramil Mirhasanov | 2158f21ad5 | |
Benjamin Wang | 721d9feb0e | |
yellowzf | ecfed91e50 | |
Marek Siarkowicz | bdbbde998b | |
Benjamin Wang | d5069486cc | |
Benjamin Wang | f53707edfa | |
Marek Siarkowicz | 45d8cb254e | |
Hitoshi Mitake | e38eb678bb | |
Hitoshi Mitake | d1b1aa9dbe | |
Benjamin Wang | d6bc827955 | |
James Blair | fb8fba710b | |
James Blair | b91025abbb | |
Benjamin Wang | f4f5ac93ca | |
sharathsivakumar | c0f2954e9f | |
Marek Siarkowicz | 217d183e5a | |
Marek Siarkowicz | 9d2cda4e44 | |
Marek Siarkowicz | 3cd07fe17c | |
Benjamin Wang | cd019255ba | |
Benjamin Wang | 643e6e1993 | |
Benjamin Wang | 5872b80ed5 | |
Marek Siarkowicz | 4501fd88c7 | |
Marek Siarkowicz | 7f4eef09a3 | |
Benjamin Wang | b31caa3f12 | |
Benjamin Wang | b1df3df2b1 | |
Benjamin Wang | e6c2e380a9 | |
Benjamin Wang | 291cb7172a | |
Benjamin Wang | 070341c69f | |
Benjamin Wang | f905e2c264 | |
Hitoshi Mitake | e6eeca6885 | |
Benjamin Wang | 65635e426c | |
Wei Fu | 55bce22e97 | |
Benjamin Wang | 7230b943d0 | |
zhangguanzhang | 77baf66b52 | |
Marek Siarkowicz | 1259884695 | |
Prasad Chandrasekaran | 9e506593bf | |
Marek Siarkowicz | c5b670bff1 | |
Marek Siarkowicz | 073c530989 | |
Marek Siarkowicz | 6637aee804 | |
Marek Siarkowicz | c0421c7330 | |
Marek Siarkowicz | 2d5f48a7ef | |
Marek Siarkowicz | a9e0a04c9a | |
Marek Siarkowicz | 245067b15d | |
Marek Siarkowicz | 63576a25f5 | |
Marek Siarkowicz | 8b4549d534 | |
engow | f7ac9dfcd6 | |
tangcong | dcb1bf6078 | |
Benjamin Wang | 44d78bf9aa | |
Benjamin Wang | fe37277c7e | |
Wei Fu | 9e974792f9 | |
Marek Siarkowicz | 15b3756abd | |
Marek Siarkowicz | 92e56ab61e | |
Bogdan Kanivets | dafdaaedf2 | |
Marek Siarkowicz | 930a450a55 | |
Marek Siarkowicz | 86101d333b | |
Marek Siarkowicz | eb614c35f7 | |
Marek Siarkowicz | 2eeb26083f | |
Marek Siarkowicz | 00e1e5db21 | |
Marek Siarkowicz | 46d6c1d7b2 | |
Marek Siarkowicz | 2f4d75feb1 | |
Marek Siarkowicz | 4e9911ec26 | |
Marek Siarkowicz | 64bc55ef4e | |
Benjamin Wang | 11ca1d356a | |
James Blair | 358bcf3fb6 | |
Marek Siarkowicz | 3a63da9609 | |
Marek Siarkowicz | 55bfad950c | |
Marek Siarkowicz | 3f96014d2d | |
Marek Siarkowicz | 98861410f3 | |
Benjamin Wang | 6ddb23ce7a | |
Marek Siarkowicz | e44995e670 | |
Benjamin Wang | b10adb6abe | |
James Blair | f0aa228dbf | |
Piotr Tabor | c602942246 | |
James Blair | 1ea808b5ba | |
James Blair | 183af509f6 | |
James Blair | 1bd835383b | |
James Blair | 5996b5faa3 | |
Benjamin Wang | d41d8ac1da | |
Benjamin Wang | e896cc7201 | |
Marek Siarkowicz | 346f1d325a | |
Marek Siarkowicz | bc5445c00c | |
Benjamin Wang | 452164a1c7 | |
Marek Siarkowicz | 1664b4f828 | |
James Blair | b9568dba32 | |
Marek Siarkowicz | 238da4b3f5 | |
Paco Xu | 2a0ecd4078 | |
Benjamin Wang | 78e739083e | |
Benjamin Wang | 747de58414 | |
kidsan | 41ed809c38 | |
Iavael | 82004d0197 | |
Marek Siarkowicz | 215b53cf3b | |
Marek Siarkowicz | 638c6f1bb1 | |
Benjamin Wang | 53300ece3b | |
Benjamin Wang | 816c2e2b8a | |
Benjamin Wang | e1fc545d8a | |
Benjamin Wang | 9e3966fbce | |
Benjamin Wang | cff304502c | |
Benjamin Wang | dd30268727 | |
Benjamin Wang | 1293f5d4b7 | |
Benjamin Wang | f12f162587 | |
Piotr Tabor | cf379a79ea | |
Benjamin Wang | 4e0385134e | |
Benjamin Wang | 925c0611e0 | |
Benjamin Wang | 413ec16175 | |
Benjamin Wang | bf1b902111 | |
Benjamin Wang | a612b9285f | |
Benjamin Wang | 69ee8a83ab | |
Benjamin Wang | 3337f35f17 | |
Benjamin Wang | b766840c3b | |
Benjamin Wang | 410a987cbf | |
zsimon | d178292fec | |
Benjamin Wang | 3b7248bc87 | |
ArkaSaha30 | 4d3c840a9b | |
Hitoshi Mitake | f1842b6ecf | |
Benjamin Wang | 1fdfb4292c | |
Tero Saarni | 96ca27a3f2 | |
Benjamin Wang | 127e9c05b0 | |
Benjamin Wang | c1a89973f0 | |
Benjamin Wang | 0b47579263 | |
Vaibhav Mehta | 22f599a2b7 | |
Chao Chen | 378ad6b517 | |
Benjamin Wang | 5454ca67bd | |
Benjamin Wang | ba122c9d56 | |
Marek Siarkowicz | cecbe35ce0 | |
Marek Siarkowicz | d0424a7bf1 | |
Dirkjan Bussink | 1a9742c9c4 | |
Marek Siarkowicz | 7ccca083eb | |
Aleksandr Razumov | c91978077b | |
Marek Siarkowicz | b2821631aa | |
Benjamin Wang | 4097c24783 | |
Benjamin Wang | 9849fa7c66 | |
Benjamin Wang | 69aace20c8 | |
Benjamin Wang | 5f387e6b7d | |
Benjamin Wang | 563713e128 | |
Benjamin Wang | c2378be1b5 | |
kkkkun | 6797856841 | |
Hitoshi Mitake | cc6a082f9e | |
Benjamin Wang | 27707209ae | |
Cenk Alti | be4adc0c55 | |
Benjamin Wang | 8902fe9246 | |
jianfei.zhang | 45e31f6c80 | |
Benjamin Wang | 8e26a1fff1 | |
Hitoshi Mitake | 0a0f0e3617 | |
Benjamin Wang | bd7405a52e | |
Benjamin Wang | 17cb291f15 | |
Hitoshi Mitake | 1e96e0be38 | |
Hitoshi Mitake | efb9480b96 | |
Benjamin Wang | 7cd9e5a338 | |
王霄霄 | d78f6f7f14 | |
Benjamin Wang | ec6f0a74ba | |
Benjamin Wang | 62169d12eb | |
Hisanobu Tomari | d3da22fb1f | |
Benjamin Wang | acc7463fb2 | |
Benjamin Wang | 2fb9be6f7d | |
Benjamin Wang | f6c4c84da3 | |
Benjamin Wang | 3afd0735e0 | |
Sergey Kacheev | e712234a1a | |
Sergey Kacheev | 3e195ba473 | |
Sergey Kacheev | 25ef9b6f46 | |
Manuel Rüger | 5ff0d7fe26 | |
Manuel Rüger | dce3fdbeb1 | |
Hitoshi Mitake | 07c7a98371 | |
Kafuu Chino | dd983c662b | |
Benjamin Wang | 5daf35bb4a | |
Hitoshi Mitake | 528dd82be9 | |
Hitoshi Mitake | 7b568f23ab | |
Sahdev Zala | db55011d7c | |
Benjamin Wang | 89d0fc49fc | |
Haimantika Mitra | 653d6e18c3 | |
Marek Siarkowicz | 19002cfc68 | |
Benjamin Wang | 2ba1bab410 | |
Benjamin Wang | 2f1171ff66 | |
Benjamin Wang | 6c26693ebe | |
Benjamin Wang | 646ba66c5e | |
Thomas Jungblut | 243b7a125b | |
Benjamin Wang | 16d72c0b9b | |
Vladimir Sokolov | eef5e220a6 | |
Benjamin Wang | a5a33cbe4c | |
Hitoshi Mitake | bb3fae4f83 | |
Vivek Patani | 7639d93f15 | |
Dirkjan Bussink | c79f96d6ff | |
Marek Siarkowicz | ba52d5a063 | |
Marek Siarkowicz | 2ddb9e0883 | |
Marek Siarkowicz | 5660bf0e7f | |
Marek Siarkowicz | 21fb173f76 | |
Marek Siarkowicz | a56ec0be4b | |
Marek Siarkowicz | 4a75e3d52d | |
Marek Siarkowicz | 8d4ca10ece | |
Marek Siarkowicz | a8020a0320 | |
Marek Siarkowicz | 037a898ba0 | |
Marek Siarkowicz | 00bc8da0ef | |
Marek Siarkowicz | d3db3bc454 | |
Marek Siarkowicz | 1200b1006d | |
Marek Siarkowicz | 7358362c99 | |
Marek Siarkowicz | 631107285a | |
Marek Siarkowicz | a3f609d742 | |
Marek Siarkowicz | 1ff59923d6 | |
Marek Siarkowicz | 991b429336 | |
Marek Siarkowicz | 2b8dd0de4e | |
Marek Siarkowicz | 21e5d5d2b6 | |
Marek Siarkowicz | f1a759a2c8 | |
Marek Siarkowicz | ea684db535 | |
Marek Siarkowicz | 22d3e4ebd7 | |
Marek Siarkowicz | 679e327d5e | |
Marek Siarkowicz | f5ed371885 | |
Marek Siarkowicz | 3f26995f99 | |
Marek Siarkowicz | bc592c7b01 | |
Marek Siarkowicz | 336fef4ce2 | |
Marek Siarkowicz | 78a6f387cb | |
Marek Siarkowicz | 35cbdf3961 | |
Marek Siarkowicz | d32de2c410 | |
Benjamin Wang | 204c0319a1 | |
Benjamin Wang | 5c8aa08e2c | |
Benjamin Wang | 747bf5ceff | |
Benjamin Wang | 7eb696dfcd | |
Marek Siarkowicz | fbb14f91bf | |
Bogdan Kanivets | 204d883904 | |
Vitalii Levitskii | 67e4c59e01 | |
Benjamin Wang | 74aa38ec10 | |
Benjamin Wang | 9ea5b1ba22 | |
Benjamin Wang | 6bab3677eb | |
Justin Kolberg | eab0b999a8 | |
Benjamin Wang | 9e95685d0a | |
Benjamin Wang | 8fdca41cd8 | |
Benjamin Wang | 8c5f110b59 | |
Benjamin Wang | 2751c61f24 | |
Benjamin Wang | 5a86ae2c33 | |
Benjamin Wang | 2d7e49002c | |
Benjamin Wang | 6145831683 | |
Mike Dame | 4c013c91e9 | |
Marek Siarkowicz | 9d7e10863e | |
Hitoshi Mitake | e15c005fef | |
Benjamin Wang | 3237289fff | |
Jille Timmermans | cbedaf90fe | |
Benjamin Wang | fb71790611 | |
Benjamin Wang | ff447b4a35 | |
Benjamin Wang | 437f3778d0 | |
Benjamin Wang | 40d1a43176 | |
Benjamin Wang | 57c1d92e20 | |
Sahdev Zala | 4df61af2df | |
Marek Siarkowicz | c9f7473173 | |
Benjamin Wang | df632abd8a | |
Benjamin Wang | 4443e14dcd | |
Benjamin Wang | 621cd7b9e5 | |
Benjamin Wang | db0b67e8a0 | |
Marek Siarkowicz | 0be65da6cc | |
Benjamin Wang | acb1ee993a | |
Marek Siarkowicz | 73876b176f | |
Marek Siarkowicz | 6aa934e546 | |
Marek Siarkowicz | c05b9b13a8 | |
Marek Siarkowicz | 2e76dfb657 | |
Marek Siarkowicz | c4b0a569ba | |
Marek Siarkowicz | c76a010b48 | |
Piotr Tabor | b57881a164 | |
cfz | cceb25d758 | |
Piotr Tabor | 8453b10e58 | |
Colleen Murphy | 5c44c3022b | |
Marek Siarkowicz | 08407ff760 | |
Marek Siarkowicz | c3c908e39a | |
ahrtr | 5c68f2e510 | |
Piotr Tabor | b872757492 | |
Jordan Liggitt | 081b4e2a0f | |
Jordan Liggitt | 76564778a9 | |
Marek Siarkowicz | 0452feec71 | |
Marek Siarkowicz | 842cb4b4fc | |
Danielle Lancashire | 50978d5b25 | |
Danielle Lancashire | 5d44f2242f | |
Marek Siarkowicz | cd750e4542 | |
Marek Siarkowicz | 003a310489 | |
Manuel Rüger | 6095cf810a | |
Marek Siarkowicz | 719082e4fc | |
ahrtr | 4002aa51bd | |
ahrtr | bc5307de95 | |
Marek Siarkowicz | b9cbff151c | |
Chris Ayoub | 232fb980a7 | |
Marek Siarkowicz | 383eceb885 | |
Marek Siarkowicz | bf22ef3b03 | |
ahrtr | 66c7aab4d3 | |
Marek Siarkowicz | 3ace622792 | |
Marek Siarkowicz | 780ec338f0 | |
Marek Siarkowicz | 238b18c110 | |
Piotr Tabor | 5f1968887c | |
Marek Siarkowicz | 83538f342d | |
Manuel Rüger | 3b8c6512df | |
Marek Siarkowicz | 8b9ce3e150 | |
Marek Siarkowicz | a060b42e47 | |
Marek Siarkowicz | 25556a08a8 | |
Piotr Tabor | 12ceac6fdd | |
Manuel Rüger | 462aefdfe1 | |
Marek Siarkowicz | fed325a95a | |
Manuel Rüger | c51c8d24e1 | |
Manuel Rüger | 1801ef8d71 | |
Marek Siarkowicz | d5161347da | |
kkkkun | 58374b83a1 | |
Marek Siarkowicz | 39baf36ca3 | |
Marek Siarkowicz | 541635e36a | |
Piotr Tabor | 3c2ef71358 | |
Piotr Tabor | 1eb8b6a75c | |
leoyang.yl | 7cec92a281 | |
Chao Chen | f634b44046 | |
ahrtr | 7345d4211b | |
Marek Siarkowicz | fa191c64bd | |
Marek Siarkowicz | 31c8e3c7a5 | |
ahrtr | 4f51cc1d9a | |
ahrtr | 7db1051774 | |
Bogdan Kanivets | 631fa6fd65 | |
Max Sokolovsky | f4708ae3d4 | |
Marek Siarkowicz | 99018a77be | |
Piotr Tabor | a624446907 | |
Piotr Tabor | 74f33d6665 | |
Piotr Tabor | 7291ed3c4a | |
leoyang.yl | 55c16df997 | |
Piotr Tabor | 73080a7166 | |
Piotr Tabor | e84c61104c | |
Marek Siarkowicz | d00e89db2e | |
Michał Jasionowski | eddfb4232f | |
Michał Jasionowski | 21634a98c6 | |
ahrtr | 8c81598455 | |
Sam Batschelet | eac7f98699 | |
Hitoshi Mitake | dec6f72d68 | |
Ashish Ranjan | 79bbc8fdb7 | |
Sam Batschelet | 77d760bf1b | |
Chao Chen | 7d44a7cd6e | |
Piotr Tabor | e8732fb5f3 | |
Geeta Gharpure | 446f7d6b6e | |
Sam Batschelet | d42e8589e1 | |
Sam Batschelet | ec562294f7 | |
Sam Batschelet | bad9a52c4c | |
Piotr Tabor | edb3b5a794 | |
Marek Siarkowicz | 79f9a45574 | |
Marek Siarkowicz | 7f25a500e3 | |
Marek Siarkowicz | 58d2b12a50 | |
Marek Siarkowicz | 6e04e8ae42 | |
Marek Siarkowicz | 7272a9585d | |
Marek Siarkowicz | 0bac49bda4 | |
Marek Siarkowicz | f324894e8f | |
Marek Siarkowicz | 994bd08723 | |
Marek Siarkowicz | c1f48d8077 | |
Arda Güçlü | 6e2fe84ebd | |
Piotr Tabor | 4312298b73 | |
Marek Siarkowicz | e68c7ab4bc | |
Sam Batschelet | d7eeda09f7 | |
Marek Siarkowicz | 921f78d56f | |
Sam Batschelet | 2fe94b19d3 | |
tangcong | 627d91c89d | |
tangcong | dfd2fea4c5 | |
Gyuho Lee | beae2e1801 | |
Sam Batschelet | 946a5a6f25 | |
Sam Batschelet | 1e2cab929c | |
spacewander | 53e04b2615 | |
Sam Batschelet | 8139dd3e55 | |
Sam Batschelet | 5d52faec47 | |
Mr-Mu | 98bbc0107f | |
Mr-Mu | fed3bc3084 | |
Sam Batschelet | b327edf521 | |
Lili Cosic | 9fee8bf95e | |
Gyuho Lee | e721e4eb10 | |
J. David Lowe | e27effa250 | |
Gyuho Lee | abe57c1aed | |
J. David Lowe | ae194c1470 | |
Sam Batschelet | ab20aa29a0 | |
Gyuho Lee | a6b37e2642 | |
Wilson Wang | 4563cebaa4 | |
Sam Batschelet | 3a82198773 | |
Piotr Tabor | a5523be415 | |
Piotr Tabor | fea5ace182 | |
Marek Siarkowicz | 9a18742bd7 | |
Sam Batschelet | 6cd7c02873 | |
Piotr Tabor | 3f13d3a2d5 | |
Gyuho Lee | 7b244ae558 | |
Piotr Tabor | 4af7fc393c | |
Sam Batschelet | b3f16d6691 | |
Gyuho Lee | 16214c3443 | |
Piotr Tabor | e6baf6d751 | |
Piotr Tabor | 8bddbdc1d6 | |
Piotr Tabor | d3b3228c1f | |
mlmhl | 261f8b1daf | |
Gyuho Lee | dd22bd747e | |
Wilson Wang | 7a7d6f94a7 | |
Gyuho Lee | c0d1450b45 | |
Piotr Tabor | c4ebac0c57 | |
Sam Batschelet | 379c361bc6 | |
Sam Batschelet | 163d9fd6f4 | |
Sam Batschelet | d06c97209c | |
Sam Batschelet | 1a8a063a31 | |
Sam Batschelet | e46bcb5ad9 | |
Sam Batschelet | 535a9447ce | |
Gyuho Lee | 84d9187dbf | |
Chao Chen | 2042d2abc4 | |
Sam Batschelet | cf54fab42f | |
Sam Batschelet | c49444d5d0 |
|
@ -1,23 +0,0 @@
|
|||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/go
|
||||
{
|
||||
"name": "Go",
|
||||
|
||||
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
|
||||
"image": "mcr.microsoft.com/devcontainers/go:1.19-bullseye",
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
|
||||
"ghcr.io/devcontainers/features/github-cli:1": {}
|
||||
},
|
||||
|
||||
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
||||
"forwardPorts": [2379, 2380],
|
||||
|
||||
// Use 'postCreateCommand' to run commands after the container is created.
|
||||
"postCreateCommand": "make build"
|
||||
|
||||
// Configure tool-specific properties.
|
||||
// "customizations": {},
|
||||
}
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
Please read https://etcd.io/docs/latest/reporting_bugs/
|
|
@ -1,102 +0,0 @@
|
|||
---
|
||||
name: Bug Report
|
||||
description: Report a bug encountered while operating etcd
|
||||
labels:
|
||||
- type/bug
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: confirmations
|
||||
attributes:
|
||||
label: Bug report criteria
|
||||
description: Please confirm this bug report meets the following criteria.
|
||||
options:
|
||||
- label: This bug report is not security related, security issues should be disclosed privately via security@etcd.io.
|
||||
- label: This is not a support request, support requests should be raised in the etcd [discussion forums](https://github.com/etcd-io/etcd/discussions).
|
||||
- label: You have read the etcd [bug reporting guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md).
|
||||
- label: Existing open issues along with etcd [frequently asked questions](https://etcd.io/docs/latest/faq) have been checked and this is not a duplicate.
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please fill the form below and provide as much information as possible.
|
||||
Not doing so may result in your bug not being addressed in a timely manner.
|
||||
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: What happened?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: What did you expect to happen?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: repro
|
||||
attributes:
|
||||
label: How can we reproduce it (as minimally and precisely as possible)?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
||||
|
||||
- type: textarea
|
||||
id: etcdVersion
|
||||
attributes:
|
||||
label: Etcd version (please run commands below)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
```console
|
||||
$ etcd --version
|
||||
# paste output here
|
||||
|
||||
$ etcdctl version
|
||||
# paste output here
|
||||
```
|
||||
|
||||
</details>
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: config
|
||||
attributes:
|
||||
label: Etcd configuration (command line flags or environment variables)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
# paste your configuration here
|
||||
|
||||
</details>
|
||||
|
||||
- type: textarea
|
||||
id: etcdDebugInformation
|
||||
attributes:
|
||||
label: Etcd debug information (please run commands below, feel free to obfuscate the IP address or FQDN in the output)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
```console
|
||||
$ etcdctl member list -w table
|
||||
# paste output here
|
||||
|
||||
$ etcdctl --endpoints=<member list> endpoint status -w table
|
||||
# paste output here
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: Shell
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Question
|
||||
url: https://github.com/etcd-io/etcd/discussions
|
||||
about: Question relating to Etcd
|
|
@ -0,0 +1,28 @@
|
|||
---
|
||||
name: Distributors Application
|
||||
title: Distributors Application for <YOUR DISTRIBUTION HERE>
|
||||
about: Apply for membership of security@etcd.io
|
||||
---
|
||||
|
||||
<!--
|
||||
Please answer the following questions and provide supporting evidence for
|
||||
meeting the membership criteria.
|
||||
-->
|
||||
|
||||
**Actively monitored security email alias for our project:**
|
||||
|
||||
**1. Have a user base not limited to your own organization.**
|
||||
|
||||
**2. Have a publicly verifiable track record up to present day of fixing security issues.**
|
||||
|
||||
**3. Not be a downstream or rebuild of another distribution.**
|
||||
|
||||
**4. Be a participant and active contributor in the community.**
|
||||
|
||||
**5. Accept the Embargo Policy.**
|
||||
<!-- https://github.com/etcd-io/etcd/blob/main/security/security-release-process.md#disclosures -->
|
||||
|
||||
**6. Be willing to contribute back.**
|
||||
<!-- Per https://github.com/etcd-io/etcd/blob/main/security/security-release-process.md#patch-release-and-public-communication -->
|
||||
|
||||
**7. Have someone already on the list vouch for the person requesting membership on behalf of your distribution.**
|
|
@ -1,19 +0,0 @@
|
|||
---
|
||||
name: Feature request
|
||||
description: Provide idea for a new feature
|
||||
labels:
|
||||
- type/feature
|
||||
body:
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: What would you like to be added?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: Why is this needed?
|
||||
validations:
|
||||
required: true
|
|
@ -1,31 +0,0 @@
|
|||
---
|
||||
name: Membership nomination
|
||||
description: Nominate new etcd members
|
||||
labels:
|
||||
- area/community
|
||||
body:
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: Who would you like to nominate?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- id: requirements
|
||||
type: checkboxes
|
||||
attributes:
|
||||
label: Requirements
|
||||
options:
|
||||
- label: I have reviewed the [community membership guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md)
|
||||
required: true
|
||||
- label: The members are actively contributing to 1 or more etcd subprojects
|
||||
required: true
|
||||
- label: The members are being sponsored by two current reviewers or a current maintainer.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: How do the new members meet the regular active contribution requirements?
|
||||
validations:
|
||||
required: true
|
|
@ -1,34 +0,0 @@
|
|||
---
|
||||
name: Flaking Test
|
||||
description: Report flaky tests
|
||||
labels:
|
||||
- type/flake
|
||||
body:
|
||||
- type: textarea
|
||||
id: workflows
|
||||
attributes:
|
||||
label: Which github workflows are flaking?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: tests
|
||||
attributes:
|
||||
label: Which tests are flaking?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: link
|
||||
attributes:
|
||||
label: Github Action link
|
||||
|
||||
- type: textarea
|
||||
id: reason
|
||||
attributes:
|
||||
label: Reason for failure (if possible)
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
|
@ -1,21 +0,0 @@
|
|||
---
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: github-actions
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
|
||||
- package-ecosystem: gomod
|
||||
directory: /
|
||||
schedule:
|
||||
interval: weekly
|
||||
allow:
|
||||
- dependency-type: all
|
||||
|
||||
- package-ecosystem: gomod
|
||||
directory: /tools/mod # Not linked from /go.mod
|
||||
schedule:
|
||||
interval: weekly
|
||||
allow:
|
||||
- dependency-type: all
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
|
@ -13,7 +12,8 @@ onlyLabels: []
|
|||
|
||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
||||
exemptLabels:
|
||||
- "stage/tracked"
|
||||
- "area/security"
|
||||
- "Investigating"
|
||||
|
||||
# Set to true to ignore issues in a project (defaults to false)
|
||||
exemptProjects: false
|
||||
|
@ -28,7 +28,11 @@ exemptAssignees: false
|
|||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking as stale. Set to `false` to disable
|
||||
markComment: This issue has been automatically marked as stale because it has not had recent activity. It will be closed after 21 days if no further activity occurs. Thank you for your contributions.
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed after 21 days if no further activity
|
||||
occurs. Thank you for your contributions.
|
||||
|
||||
# Comment to post when removing the stale label.
|
||||
# unmarkComment: >
|
||||
# Your comment here.
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
name: Publish Release Assets to Asset Transparency Log
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [published, created, edited, released]
|
||||
|
||||
jobs:
|
||||
github_release_asset_transparency_log_publish_job:
|
||||
runs-on: ubuntu-latest
|
||||
name: Publish GitHub release asset digests to https://beta-asset.transparencylog.net
|
||||
steps:
|
||||
- name: Gather URLs from GitHub release and publish
|
||||
id: asset-transparency
|
||||
uses: transparencylog/github-releases-asset-transparency-verify-action@v11
|
||||
- name: List verified and published URLs
|
||||
run: echo "Verified URLs ${{ steps.asset-transparency.outputs.verified }}"
|
||||
- name: List failed URLs
|
||||
run: echo "Failed URLs ${{ steps.asset-transparency.outputs.failed }}"
|
|
@ -1,67 +0,0 @@
|
|||
---
|
||||
name: Build
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64
|
||||
- linux-386
|
||||
- darwin-amd64
|
||||
- darwin-arm64
|
||||
- windows-amd64
|
||||
- linux-arm
|
||||
- linux-arm64
|
||||
- linux-ppc64le
|
||||
- linux-s390x
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64)
|
||||
GOOS=linux GOARCH=amd64 make build
|
||||
;;
|
||||
linux-386)
|
||||
GOOS=linux GOARCH=386 make build
|
||||
;;
|
||||
darwin-amd64)
|
||||
GOOS=darwin GOARCH=amd64 make build
|
||||
;;
|
||||
darwin-arm64)
|
||||
GOOS=darwin GOARCH=arm64 make build
|
||||
;;
|
||||
windows-amd64)
|
||||
GOOS=windows GOARCH=amd64 make build
|
||||
;;
|
||||
linux-arm)
|
||||
GOOS=linux GOARCH=arm make build
|
||||
;;
|
||||
linux-arm64)
|
||||
GOOS=linux GOARCH=arm64 make build
|
||||
;;
|
||||
linux-ppc64le)
|
||||
GOOS=linux GOARCH=ppc64le make build
|
||||
;;
|
||||
linux-s390x)
|
||||
GOOS=linux GOARCH=s390x make build
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
|
@ -11,45 +10,58 @@
|
|||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, release-3.4, release-3.5, release-3.6]
|
||||
branches: [ main, release-0.4, release-2.0, release-2.1, release-2.2, release-2.3, release-3.0, release-3.1 ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [main]
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: '20 14 * * 5'
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'go' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
language: ['go']
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
uses: github/codeql-action/analyze@v1
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
---
|
||||
name: Test contrib/mixin
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
make -C contrib/mixin tools test
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
name: Coverage
|
||||
on: [push]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
coverage:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-coverage
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
mkdir "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-coverage)
|
||||
GOARCH=amd64 ./scripts/codecov_upload.sh
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
|
@ -1,45 +0,0 @@
|
|||
---
|
||||
name: E2E-arm64
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 1 * * *' # runs daily at 1am.
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
# this is to prevent the job to run at forked projects
|
||||
if: github.repository == 'etcd-io/etcd'
|
||||
runs-on: [self-hosted, Linux, ARM64]
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-arm64-e2e
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-arm64-e2e)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
name: E2E
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -12,25 +10,25 @@ jobs:
|
|||
- linux-amd64-e2e
|
||||
- linux-386-e2e
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- uses: actions/checkout@v2
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-e2e)
|
||||
VERBOSE=1 GOOS=linux GOARCH=amd64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
PASSES='build release e2e' MANUAL_VER=v3.4.7 CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./test.sh
|
||||
;;
|
||||
linux-386-e2e)
|
||||
VERBOSE=1 GOOS=linux GOARCH=386 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e
|
||||
GOARCH=386 PASSES='build e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./test.sh
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
name: functional-tests
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-functional
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-functional)
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' ./build && GOARCH=amd64 PASSES='functional' ./test
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
|
@ -1,26 +0,0 @@
|
|||
---
|
||||
name: Fuzzing v3rpc
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
fuzzing:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
env:
|
||||
TARGET_PATH: ./server/etcdserver/api/v3rpc
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
GOARCH=amd64 CPU=4 make fuzz
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: failure()
|
||||
with:
|
||||
path: "${{env.TARGET_PATH}}/testdata/fuzz/**/*"
|
|
@ -1,19 +0,0 @@
|
|||
---
|
||||
name: Go Vulnerability Checker
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
go install golang.org/x/vuln/cmd/govulncheck@latest && govulncheck ./...
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
name: grpcProxy-tests
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -9,15 +7,15 @@ jobs:
|
|||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-grpcproxy-integration
|
||||
- linux-amd64-grpcproxy-e2e
|
||||
- linux-amd64-grpcproxy
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- uses: actions/checkout@v2
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
|
@ -25,11 +23,8 @@ jobs:
|
|||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-grpcproxy-integration)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-integration
|
||||
;;
|
||||
linux-amd64-grpcproxy-e2e)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-e2e
|
||||
linux-amd64-grpcproxy)
|
||||
PASSES='build grpcproxy' CPU='4' COVER='false' RACE='true' ./test.sh
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
---
|
||||
name: Measure Test Flakiness
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * 0" # run every Sunday at midnight
|
||||
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
measure-test-flakiness:
|
||||
name: Measure Test Flakiness
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
./scripts/measure-test-flakiness.sh
|
||||
make bin/etcd-test-analyzer
|
||||
bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main
|
|
@ -1,15 +1,13 @@
|
|||
---
|
||||
name: Release
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- uses: actions/checkout@v2
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: release
|
||||
|
@ -28,7 +26,7 @@ jobs:
|
|||
Name-Email: github-action@etcd.io
|
||||
Expire-Date: 0
|
||||
EOF
|
||||
DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99
|
||||
DRY_RUN=true ./scripts/release --no-upload --no-docker-push --in-place 3.5.99
|
||||
- name: test-image
|
||||
run: |
|
||||
VERSION=3.6.99 ./scripts/test_images.sh
|
||||
VERSION=3.5.99 ./scripts/test_images.sh
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
---
|
||||
name: Robustness Nightly
|
||||
permissions: read-all
|
||||
on:
|
||||
# schedules always run against the main branch, hence we have to create separate jobs
|
||||
# with individual checkout actions for each of the active release branches
|
||||
schedule:
|
||||
- cron: '25 9 * * *' # runs every day at 09:25 UTC
|
||||
jobs:
|
||||
main:
|
||||
# GHA has a maximum amount of 6h execution time, we try to get done within 3h
|
||||
uses: ./.github/workflows/robustness-template.yaml
|
||||
with:
|
||||
etcdBranch: main
|
||||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: main
|
||||
main-arm64:
|
||||
uses: ./.github/workflows/robustness-template-arm64.yaml
|
||||
with:
|
||||
etcdBranch: main
|
||||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: main-arm64
|
||||
runs-on: "['self-hosted', 'Linux', 'ARM64']"
|
||||
release-35:
|
||||
uses: ./.github/workflows/robustness-template.yaml
|
||||
with:
|
||||
etcdBranch: release-3.5
|
||||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: release-35
|
||||
release-34:
|
||||
uses: ./.github/workflows/robustness-template.yaml
|
||||
with:
|
||||
etcdBranch: release-3.4
|
||||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: release-34
|
|
@ -1,72 +0,0 @@
|
|||
---
|
||||
name: Reusable Robustness Workflow
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
etcdBranch:
|
||||
required: true
|
||||
type: string
|
||||
count:
|
||||
required: true
|
||||
type: number
|
||||
testTimeout:
|
||||
required: false
|
||||
type: string
|
||||
default: '30m'
|
||||
artifactName:
|
||||
required: true
|
||||
type: string
|
||||
runs-on:
|
||||
required: false
|
||||
type: string
|
||||
default: "['ubuntu-latest']"
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 210
|
||||
runs-on: ${{ fromJson(inputs.runs-on) }}
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: test-robustness
|
||||
env:
|
||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
# Use --failfast to avoid overriding report generated by failed test
|
||||
GO_TEST_FLAGS="-v --count ${{ inputs.count }} --timeout ${{ inputs.testTimeout }} --failfast --run TestRobustness"
|
||||
case "${ETCD_BRANCH}" in
|
||||
release-3.5)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.5
|
||||
;;
|
||||
release-3.4)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.4
|
||||
;;
|
||||
main)
|
||||
make gofail-enable
|
||||
make build
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target ${ETCD_BRANCH}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ inputs.artifactName }}
|
||||
path: /tmp/results/*
|
|
@ -1,65 +0,0 @@
|
|||
---
|
||||
name: Reusable Robustness Workflow
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
etcdBranch:
|
||||
required: true
|
||||
type: string
|
||||
count:
|
||||
required: true
|
||||
type: number
|
||||
testTimeout:
|
||||
required: false
|
||||
type: string
|
||||
default: '30m'
|
||||
artifactName:
|
||||
required: true
|
||||
type: string
|
||||
runs-on:
|
||||
required: false
|
||||
type: string
|
||||
default: "['ubuntu-latest']"
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 210
|
||||
runs-on: ${{ fromJson(inputs.runs-on) }}
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: test-robustness
|
||||
env:
|
||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
# Use --failfast to avoid overriding report generated by failed test
|
||||
GO_TEST_FLAGS="-v --count ${{ inputs.count }} --timeout ${{ inputs.testTimeout }} --failfast --run TestRobustness"
|
||||
case "${ETCD_BRANCH}" in
|
||||
release-3.5)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.5
|
||||
;;
|
||||
release-3.4)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.4
|
||||
;;
|
||||
main)
|
||||
make gofail-enable
|
||||
make build
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target ${ETCD_BRANCH}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ inputs.artifactName }}
|
||||
path: /tmp/results/*
|
|
@ -1,12 +0,0 @@
|
|||
---
|
||||
name: Robustness
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
main:
|
||||
uses: ./.github/workflows/robustness-template.yaml
|
||||
with:
|
||||
etcdBranch: main
|
||||
count: 15
|
||||
testTimeout: 30m
|
||||
artifactName: main
|
|
@ -1,55 +0,0 @@
|
|||
---
|
||||
name: Scorecards supply-chain security
|
||||
on:
|
||||
# Only the default branch is supported.
|
||||
branch_protection_rule:
|
||||
schedule:
|
||||
- cron: '45 1 * * 0'
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
# Declare default permissions as read only.
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
analysis:
|
||||
name: Scorecards analysis
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
# Needed to upload the results to code-scanning dashboard.
|
||||
security-events: write
|
||||
# Used to receive a badge.
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # tag=v3.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: "Run analysis"
|
||||
uses: ossf/scorecard-action@80e868c13c90f172d68d1f4501dee99e2479f7af # tag=v2.1.3
|
||||
with:
|
||||
results_file: results.sarif
|
||||
results_format: sarif
|
||||
|
||||
# Publish the results for public repositories to enable scorecard badges. For more details, see
|
||||
# https://github.com/ossf/scorecard-action#publishing-results.
|
||||
# For private repositories, `publish_results` will automatically be set to `false`, regardless
|
||||
# of the value entered here.
|
||||
publish_results: true
|
||||
|
||||
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
||||
# format to the repository Actions tab.
|
||||
- name: "Upload artifact"
|
||||
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # tag=v3.0.0
|
||||
with:
|
||||
name: SARIF file
|
||||
path: results.sarif
|
||||
retention-days: 5
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # tag=v1.0.26
|
||||
with:
|
||||
sarif_file: results.sarif
|
|
@ -1,32 +0,0 @@
|
|||
---
|
||||
name: Static Analysis
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
run:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3.6.0
|
||||
with:
|
||||
version: v1.49.0
|
||||
args: --config tools/.golangci.yaml
|
||||
- name: protoc
|
||||
uses: arduino/setup-protoc@149f6c87b92550901b26acd1632e11c3662e381f # v1.3.0
|
||||
with:
|
||||
version: '3.14.0'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
make verify
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
make fix
|
|
@ -1,62 +0,0 @@
|
|||
---
|
||||
name: Tests-arm64
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *' # runs daily at 1:30 am.
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
# this is to prevent the job to run at forked projects
|
||||
if: github.repository == 'etcd-io/etcd'
|
||||
runs-on: [self-hosted, Linux, ARM64]
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-arm64-integration-1-cpu
|
||||
- linux-arm64-integration-2-cpu
|
||||
- linux-arm64-integration-4-cpu
|
||||
- linux-arm64-unit-4-cpu-race
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
case "${TARGET}" in
|
||||
linux-arm64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=1 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=2 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 make test-integration
|
||||
;;
|
||||
linux-arm64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
|
@ -1,7 +1,5 @@
|
|||
---
|
||||
name: Tests
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
@ -9,48 +7,59 @@ jobs:
|
|||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-fmt
|
||||
- linux-amd64-integration-1-cpu
|
||||
- linux-amd64-integration-2-cpu
|
||||
- linux-amd64-integration-4-cpu
|
||||
- linux-amd64-unit-4-cpu-race
|
||||
- all-build
|
||||
- linux-386-unit-1-cpu
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- uses: actions/checkout@v2
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/setup-go@v2
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-fmt)
|
||||
GOARCH=amd64 PASSES='fmt bom dep' ./test.sh
|
||||
;;
|
||||
linux-amd64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=1 make test-integration
|
||||
GOARCH=amd64 CPU=1 PASSES='integration' RACE='false' ./test.sh
|
||||
;;
|
||||
linux-amd64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=2 make test-integration
|
||||
GOARCH=amd64 CPU=2 PASSES='integration' RACE='false' ./test.sh
|
||||
;;
|
||||
linux-amd64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 make test-integration
|
||||
GOARCH=amd64 CPU=4 PASSES='integration' RACE='false' ./test.sh
|
||||
;;
|
||||
linux-amd64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
GOARCH=amd64 PASSES='unit' RACE='true' CPU='4' ./test.sh -p=2
|
||||
;;
|
||||
all-build)
|
||||
GOARCH=amd64 PASSES='build' ./test.sh
|
||||
GOARCH=386 PASSES='build' ./test.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOOS=darwin GOARCH=amd64 ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOOS=darwin GOARCH=arm64 ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOOS=windows GOARCH=amd64 ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOARCH=arm ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOARCH=arm64 ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOARCH=ppc64le ./build.sh
|
||||
GO_BUILD_FLAGS='-v -mod=readonly' GOARCH=s390x ./build.sh
|
||||
;;
|
||||
linux-386-unit-1-cpu)
|
||||
GOOS=linux GOARCH=386 CPU=1 GO_TEST_FLAGS='-p=4' make test-unit
|
||||
GOARCH=386 PASSES='unit' RACE='false' CPU='1' ./test -p=4
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
name: Trivy Nightly Scan
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 2 * * *' # run at 2 AM UTC
|
||||
|
||||
permissions: read-all
|
||||
jobs:
|
||||
nightly-scan:
|
||||
name: Trivy Scan nightly
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# maintain the versions of etcd that need to be actively
|
||||
# security scanned
|
||||
versions: [v3.5.6]
|
||||
permissions:
|
||||
security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0
|
||||
with:
|
||||
ref: release-3.5
|
||||
- name: Run Trivy vulnerability scanner
|
||||
uses: aquasecurity/trivy-action@9ab158e8597f3b310480b9a69402b419bc03dbd5 # master
|
||||
with:
|
||||
image-ref: 'gcr.io/etcd-development/etcd:${{ matrix.versions }}'
|
||||
severity: 'CRITICAL,HIGH'
|
||||
format: 'template'
|
||||
template: '@/contrib/sarif.tpl'
|
||||
output: 'trivy-results-3-5.sarif'
|
||||
|
||||
- name: Upload Trivy scan results to GitHub Security tab
|
||||
uses: github/codeql-action/upload-sarif@a669cc5936cc5e1b6a362ec1ff9e410dc570d190 # v2.1.36
|
||||
with:
|
||||
sarif_file: 'trivy-results-3-5.sarif'
|
|
@ -14,8 +14,6 @@
|
|||
*.test
|
||||
hack/tls-setup/certs
|
||||
.idea
|
||||
*.iml
|
||||
/contrib/mixin/manifests
|
||||
/contrib/raftexample/raftexample
|
||||
/contrib/raftexample/raftexample-*
|
||||
/vendor
|
||||
|
@ -23,15 +21,3 @@ hack/tls-setup/certs
|
|||
*.tmp
|
||||
*.bak
|
||||
.gobincache/
|
||||
.DS_Store
|
||||
/Documentation/dev-guide/api_reference_v3.md
|
||||
/Documentation/dev-guide/api_concurrency_reference_v3.md
|
||||
|
||||
/tools/etcd-dump-db/etcd-dump-db
|
||||
/tools/etcd-dump-logs/etcd-dump-logs
|
||||
/tools/etcd-dump-metrics/etcd-dump-metrics
|
||||
/tools/local-tester/bridge/bridge
|
||||
/tools/proto-annotations/proto-annotations
|
||||
/tools/benchmark/benchmark
|
||||
/out
|
||||
/etcd-dump-logs
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
accessors
|
||||
addrConns
|
||||
args
|
||||
atomics
|
||||
backoff
|
||||
BackoffFunc
|
||||
BackoffLinearWithJitter
|
||||
Balancer
|
||||
BidiStreams
|
||||
blackhole
|
||||
blackholed
|
||||
CallOptions
|
||||
cancelable
|
||||
cancelation
|
||||
ccBalancerWrapper
|
||||
clientURLs
|
||||
clusterName
|
||||
cluster_proxy
|
||||
consistentIndex
|
||||
ConsistentIndexGetter
|
||||
DefaultMaxRequestBytes
|
||||
defragment
|
||||
defragmenting
|
||||
deleter
|
||||
dev
|
||||
/dev/null
|
||||
dev/null
|
||||
DNS
|
||||
errClientDisconnected
|
||||
ErrCodeEnhanceYourCalm
|
||||
ErrConnClosing
|
||||
ErrRequestTooLarge
|
||||
ErrTimeout
|
||||
etcd
|
||||
FIXME
|
||||
github
|
||||
GoAway
|
||||
goroutine
|
||||
goroutines
|
||||
gRPC
|
||||
grpcAddr
|
||||
hasleader
|
||||
healthcheck
|
||||
hostname
|
||||
iff
|
||||
inflight
|
||||
InfoLevel
|
||||
jitter
|
||||
jitter
|
||||
jitter
|
||||
keepalive
|
||||
Keepalive
|
||||
KeepAlive
|
||||
keepalives
|
||||
keyspace
|
||||
lexically
|
||||
lexicographically
|
||||
linearizable
|
||||
linearization
|
||||
linearized
|
||||
liveness
|
||||
localhost
|
||||
__lostleader
|
||||
MaxRequestBytes
|
||||
MiB
|
||||
middleware
|
||||
mutators
|
||||
mutex
|
||||
nils
|
||||
nondeterministically
|
||||
nop
|
||||
OutputWALDir
|
||||
parsedTarget
|
||||
passthrough
|
||||
PermitWithoutStream
|
||||
prefetching
|
||||
prometheus
|
||||
protobuf
|
||||
racey
|
||||
rafthttp
|
||||
rebalanced
|
||||
reconnection
|
||||
repin
|
||||
ResourceExhausted
|
||||
retriable
|
||||
retriable
|
||||
rpc
|
||||
RPC
|
||||
RPCs
|
||||
saveWALAndSnap
|
||||
serializable
|
||||
ServerStreams
|
||||
SHA
|
||||
SRV
|
||||
statusError
|
||||
subConn
|
||||
subconns
|
||||
SubConns
|
||||
teardown
|
||||
TestBalancerDoNotBlockOnClose
|
||||
todo
|
||||
too_many_pings
|
||||
transactional
|
||||
transferee
|
||||
transientFailure
|
||||
unbuffered
|
||||
uncontended
|
||||
unfreed
|
||||
unlisting
|
||||
unprefixed
|
||||
WatchProgressNotifyInterval
|
||||
WAL
|
||||
WithBackoff
|
||||
WithDialer
|
||||
WithMax
|
||||
WithRequireLeader
|
250
ADOPTERS.md
250
ADOPTERS.md
|
@ -1,250 +0,0 @@
|
|||
---
|
||||
title: Production users
|
||||
---
|
||||
|
||||
This document tracks people and use cases for etcd in production. By creating a list of production use cases we hope to build a community of advisors that we can reach out to with experience using various etcd applications, operation environments, and cluster sizes. The etcd development team may reach out periodically to check-in on how etcd is working in the field and update this list.
|
||||
|
||||
## All Kubernetes Users
|
||||
|
||||
- *Application*: https://kubernetes.io/
|
||||
- *Environments*: AWS, OpenStack, Azure, Google Cloud, Huawei Cloud, Bare Metal, etc
|
||||
|
||||
**This is a meta user; please feel free to document specific Kubernetes clusters!**
|
||||
|
||||
All Kubernetes clusters use etcd as their primary data store. This means etcd's users include such companies as [Niantic, Inc Pokemon Go](https://cloudplatform.googleblog.com/2016/09/bringing-Pokemon-GO-to-life-on-Google-Cloud.html), [Box](https://blog.box.com/blog/kubernetes-box-microservices-maximum-velocity/), [CoreOS](https://coreos.com/tectonic), [Ticketmaster](https://www.youtube.com/watch?v=wqXVKneP0Hg), [Salesforce](https://www.salesforce.com) and many many more.
|
||||
|
||||
## discovery.etcd.io
|
||||
|
||||
- *Application*: https://github.com/coreos/discovery.etcd.io
|
||||
- *Launched*: Feb. 2014
|
||||
- *Cluster Size*: 5 members, 5 discovery proxies
|
||||
- *Order of Data Size*: 100s of Megabytes
|
||||
- *Operator*: CoreOS, brandon.philips@coreos.com
|
||||
- *Environment*: AWS
|
||||
- *Backups*: Periodic async to S3
|
||||
|
||||
discovery.etcd.io is the longest continuously running etcd backed service that we know about. It is the basis of automatic cluster bootstrap and was launched in Feb. 2014: https://coreos.com/blog/etcd-0.3.0-released/.
|
||||
|
||||
## OpenTable
|
||||
|
||||
- *Application*: OpenTable internal service discovery and cluster configuration management
|
||||
- *Launched*: May 2014
|
||||
- *Cluster Size*: 3 members each in 6 independent clusters; approximately 50 nodes reading / writing
|
||||
- *Order of Data Size*: 10s of MB
|
||||
- *Operator*: OpenTable, Inc; sschlansker@opentable.com
|
||||
- *Environment*: AWS, VMWare
|
||||
- *Backups*: None, all data can be re-created if necessary.
|
||||
|
||||
## cycoresys.com
|
||||
|
||||
- *Application*: multiple
|
||||
- *Launched*: Jul. 2014
|
||||
- *Cluster Size*: 3 members, _n_ proxies
|
||||
- *Order of Data Size*: 100s of kilobytes
|
||||
- *Operator*: CyCore Systems, Inc, sys@cycoresys.com
|
||||
- *Environment*: Baremetal
|
||||
- *Backups*: Periodic sync to Ceph RadosGW and DigitalOcean VM
|
||||
|
||||
CyCore Systems provides architecture and engineering for computing systems. This cluster provides microservices, virtual machines, databases, storage clusters to a number of clients. It is built on CoreOS machines, with each machine in the cluster running etcd as a peer or proxy.
|
||||
|
||||
## Radius Intelligence
|
||||
|
||||
- *Application*: multiple internal tools, Kubernetes clusters, bootstrappable system configs
|
||||
- *Launched*: June 2015
|
||||
- *Cluster Size*: 2 clusters of 5 and 3 members; approximately a dozen nodes read/write
|
||||
- *Order of Data Size*: 100s of kilobytes
|
||||
- *Operator*: Radius Intelligence; jcderr@radius.com
|
||||
- *Environment*: AWS, CoreOS, Kubernetes
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
Radius Intelligence uses Kubernetes running CoreOS to containerize and scale internal toolsets. Examples include running [JetBrains TeamCity][teamcity] and internal AWS security and cost reporting tools. etcd clusters back these clusters as well as provide some basic environment bootstrapping configuration keys.
|
||||
|
||||
## Vonage
|
||||
|
||||
- *Application*: kubernetes, vault backend, system configuration for microservices, scheduling, locks (future - service discovery)
|
||||
- *Launched*: August 2015
|
||||
- *Cluster Size*: 2 clusters of 5 members in 2 DCs, n local proxies 1-to-1 with microservice, (ssl and SRV look up)
|
||||
- *Order of Data Size*: kilobytes
|
||||
- *Operator*: Vonage [devAdmin][raoofm]
|
||||
- *Environment*: VMWare, AWS
|
||||
- *Backups*: Daily snapshots on VMs. Backups done for upgrades.
|
||||
|
||||
## PD
|
||||
|
||||
- *Application*: embed etcd
|
||||
- *Launched*: Mar 2016
|
||||
- *Cluster Size*: 3 or 5 members
|
||||
- *Order of Data Size*: megabytes
|
||||
- *Operator*: PingCAP, Inc.
|
||||
- *Environment*: Bare Metal, AWS, etc.
|
||||
- *Backups*: None.
|
||||
|
||||
PD(Placement Driver) is the central controller in the TiDB cluster. It saves the cluster meta information, schedule the data, allocate the global unique timestamp for the distributed transaction, etc. It embeds etcd to supply high availability and auto failover.
|
||||
|
||||
## Huawei
|
||||
|
||||
- *Application*: System configuration for overlay network (Canal)
|
||||
- *Launched*: June 2016
|
||||
- *Cluster Size*: 3 members for each cluster
|
||||
- *Order of Data Size*: kilobytes
|
||||
- *Operator*: Huawei Euler Department
|
||||
- *Environment*: [Huawei Cloud](http://www.hwclouds.com/product/cce.html)
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
[teamcity]: https://www.jetbrains.com/teamcity/
|
||||
[raoofm]:https://github.com/raoofm
|
||||
|
||||
## Qiniu Cloud
|
||||
|
||||
- *Application*: system configuration for microservices, distributed locks
|
||||
- *Launched*: Jan. 2016
|
||||
- *Cluster Size*: 3 members each with several clusters
|
||||
- *Order of Data Size*: kilobytes
|
||||
- *Operator*: Pandora, chenchao@qiniu.com
|
||||
- *Environment*: Baremetal
|
||||
- *Backups*: None, all data can be recreated if necessary
|
||||
|
||||
## QingCloud
|
||||
|
||||
- *Application*: [QingCloud][qingcloud] appcenter cluster for service discovery as [metad][metad] backend.
|
||||
- *Launched*: December 2016
|
||||
- *Cluster Size*: 1 cluster of 3 members per user.
|
||||
- *Order of Data Size*: kilobytes
|
||||
- *Operator*: [yunify][yunify]
|
||||
- *Environment*: QingCloud IaaS
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
[metad]:https://github.com/yunify/metad
|
||||
[yunify]:https://github.com/yunify
|
||||
[qingcloud]:https://qingcloud.com/
|
||||
|
||||
|
||||
## Yandex
|
||||
|
||||
- *Application*: system configuration for services, service discovery
|
||||
- *Launched*: March 2016
|
||||
- *Cluster Size*: 3 clusters of 5 members
|
||||
- *Order of Data Size*: several gigabytes
|
||||
- *Operator*: Yandex; [nekto0n][nekto0n]
|
||||
- *Environment*: Bare Metal
|
||||
- *Backups*: None
|
||||
|
||||
[nekto0n]:https://github.com/nekto0n
|
||||
|
||||
## Tencent Games
|
||||
|
||||
- *Application*: Meta data and configuration data for service discovery, Kubernetes, etc.
|
||||
- *Launched*: Jan. 2015
|
||||
- *Cluster Size*: 3 members each with 10s of clusters
|
||||
- *Order of Data Size*: 10s of Megabytes
|
||||
- *Operator*: Tencent Game Operations Department
|
||||
- *Environment*: Baremetal
|
||||
- *Backups*: Periodic sync to backup server
|
||||
|
||||
In Tencent games, we use Docker and Kubernetes to deploy and run our applications, and use etcd to save meta data for service discovery, Kubernetes, etc.
|
||||
|
||||
## Hyper.sh
|
||||
|
||||
- *Application*: Kubernetes, distributed locks, etc.
|
||||
- *Launched*: April 2016
|
||||
- *Cluster Size*: 1 cluster of 3 members
|
||||
- *Order of Data Size*: 10s of MB
|
||||
- *Operator*: Hyper.sh
|
||||
- *Environment*: Baremetal
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
In [hyper.sh][hyper.sh], the container service is backed by [hypernetes][hypernetes], a multi-tenant kubernetes distro. Moreover, we use etcd to coordinate the multiple manage services and store global meta data.
|
||||
|
||||
[hypernetes]:https://github.com/hyperhq/hypernetes
|
||||
[Hyper.sh]:https://www.hyper.sh
|
||||
|
||||
## Meitu
|
||||
- *Application*: system configuration for services, service discovery, kubernetes in test environment
|
||||
- *Launched*: October 2015
|
||||
- *Cluster Size*: 1 cluster of 3 members
|
||||
- *Order of Data Size*: megabytes
|
||||
- *Operator*: Meitu, hxj@meitu.com, [shafreeck][shafreeck]
|
||||
- *Environment*: Bare Metal
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
[shafreeck]:https://github.com/shafreeck
|
||||
|
||||
## Grab
|
||||
- *Application*: system configuration for services, service discovery
|
||||
- *Launched*: June 2016
|
||||
- *Cluster Size*: 1 cluster of 7 members
|
||||
- *Order of Data Size*: megabytes
|
||||
- *Operator*: Grab, [taxitan][taxitan], [reterVision][reterVision]
|
||||
- *Environment*: AWS
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
[taxitan]:https://github.com/taxitan
|
||||
[reterVision]:https://github.com/reterVision
|
||||
|
||||
## DaoCloud.io
|
||||
|
||||
- *Application*: container management
|
||||
- *Launched*: Sep. 2015
|
||||
- *Cluster Size*: 1000+ deployments, each deployment contains a 3 node cluster.
|
||||
- *Order of Data Size*: 100s of Megabytes
|
||||
- *Operator*: daocloud.io
|
||||
- *Environment*: Baremetal and virtual machines
|
||||
- *Backups*: None, all data can be recreated if necessary.
|
||||
|
||||
In [DaoCloud][DaoCloud], we use Docker and Swarm to deploy and run our applications, and we use etcd to save metadata for service discovery.
|
||||
|
||||
[DaoCloud]:https://www.daocloud.io
|
||||
|
||||
## Branch.io
|
||||
|
||||
- *Application*: Kubernetes
|
||||
- *Launched*: April 2016
|
||||
- *Cluster Size*: Multiple clusters, multiple sizes
|
||||
- *Order of Data Size*: 100s of Megabytes
|
||||
- *Operator*: branch.io
|
||||
- *Environment*: AWS, Kubernetes
|
||||
- *Backups*: EBS volume backups
|
||||
|
||||
At [Branch][branch], we use kubernetes heavily as our core microservice platform for staging and production.
|
||||
|
||||
[branch]: https://branch.io
|
||||
|
||||
## Baidu Waimai
|
||||
|
||||
- *Application*: SkyDNS, Kubernetes, UDC, CMDB and other distributed systems
|
||||
- *Launched*: April. 2016
|
||||
- *Cluster Size*: 3 clusters of 5 members
|
||||
- *Order of Data Size*: several gigabytes
|
||||
- *Operator*: Baidu Waimai Operations Department
|
||||
- *Environment*: CentOS 6.5
|
||||
- *Backups*: backup scripts
|
||||
|
||||
## Salesforce.com
|
||||
|
||||
- *Application*: Kubernetes
|
||||
- *Launched*: Jan 2017
|
||||
- *Cluster Size*: Multiple clusters of 3 members
|
||||
- *Order of Data Size*: 100s of Megabytes
|
||||
- *Operator*: Salesforce.com (krmayankk@github)
|
||||
- *Environment*: BareMetal
|
||||
- *Backups*: None, all data can be recreated
|
||||
|
||||
## Hosted Graphite
|
||||
|
||||
- *Application*: Service discovery, locking, ephemeral application data
|
||||
- *Launched*: January 2017
|
||||
- *Cluster Size*: 2 clusters of 7 members
|
||||
- *Order of Data Size*: Megabytes
|
||||
- *Operator*: Hosted Graphite (sre@hostedgraphite.com)
|
||||
- *Environment*: Bare Metal
|
||||
- *Backups*: None, all data is considered ephemeral.
|
||||
|
||||
## Transwarp
|
||||
|
||||
- *Application*: Transwarp Data Cloud, Transwarp Operating System, Transwarp Data Hub, Sophon
|
||||
- *Launched*: January 2016
|
||||
- *Cluster Size*: Multiple clusters, multiple sizes
|
||||
- *Order of Data Size*: Megabytes
|
||||
- *Operator*: Trasnwarp Operating System
|
||||
- *Environment*: Bare Metal, Container
|
||||
- *Backups*: backup scripts
|
|
@ -1,16 +0,0 @@
|
|||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v2.3.8](https://github.com/etcd-io/etcd/releases/tag/v2.3.8) (2017-02-17)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v2.3.7...v2.3.8).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
|
@ -1,291 +0,0 @@
|
|||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.16](https://github.com/etcd-io/etcd/releases/tag/v3.0.16) (2016-11-13)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.15...v3.0.16) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.4*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.15](https://github.com/etcd-io/etcd/releases/tag/v3.0.15) (2016-11-11)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.14...v3.0.15) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix cancel watch request with wrong range end.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.14](https://github.com/etcd-io/etcd/releases/tag/v3.0.14) (2016-11-04)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.13...v3.0.14) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Added
|
||||
|
||||
- v3 `etcdctl migrate` command now supports `--no-ttl` flag to discard keys on transform.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.13](https://github.com/etcd-io/etcd/releases/tag/v3.0.13) (2016-10-24)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.12...v3.0.13) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.12](https://github.com/etcd-io/etcd/releases/tag/v3.0.12) (2016-10-07)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.11...v3.0.12) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.11](https://github.com/etcd-io/etcd/releases/tag/v3.0.11) (2016-10-07)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.10...v3.0.11) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Added
|
||||
|
||||
- Server returns previous key-value (optional)
|
||||
- `clientv3.WithPrevKV` option
|
||||
- v3 etcdctl `put,watch,del --prev-kv` flag
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.10](https://github.com/etcd-io/etcd/releases/tag/v3.0.10) (2016-09-23)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.9...v3.0.10) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.9](https://github.com/etcd-io/etcd/releases/tag/v3.0.9) (2016-09-15)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.8...v3.0.9) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Added
|
||||
|
||||
- Warn on domain names on listen URLs (v3.2 will reject domain names).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.8](https://github.com/etcd-io/etcd/releases/tag/v3.0.8) (2016-09-09)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.7...v3.0.8) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Other
|
||||
|
||||
- Allow only IP addresses in listen URLs (domain names are rejected).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.7](https://github.com/etcd-io/etcd/releases/tag/v3.0.7) (2016-08-31)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.6...v3.0.7) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Other
|
||||
|
||||
- SRV records only allow A records (RFC 2052).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.6](https://github.com/etcd-io/etcd/releases/tag/v3.0.6) (2016-08-19)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.5...v3.0.6) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.5](https://github.com/etcd-io/etcd/releases/tag/v3.0.5) (2016-08-19)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.4...v3.0.5) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Other
|
||||
|
||||
- SRV records (e.g., infra1.example.com) must match the discovery domain (i.e., example.com) if no custom certificate authority is given.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.4](https://github.com/etcd-io/etcd/releases/tag/v3.0.4) (2016-07-27)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.3...v3.0.4) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Added
|
||||
|
||||
- v2 `etcdctl ls` command now supports `--output=json`.
|
||||
- Add /var/lib/etcd directory to etcd official Docker image.
|
||||
|
||||
### Other
|
||||
|
||||
- v2 auth can now use common name from TLS certificate when `--client-cert-auth` is enabled.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.3*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.3](https://github.com/etcd-io/etcd/releases/tag/v3.0.3) (2016-07-15)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.2...v3.0.3) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Other
|
||||
|
||||
- Revert Dockerfile to use `CMD`, instead of `ENTRYPOINT`, to support `etcdctl` run.
|
||||
- Docker commands for v3.0.2 won't work without specifying executable binary paths.
|
||||
- v3 etcdctl default endpoints are now `127.0.0.1:2379`.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.2*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.2](https://github.com/etcd-io/etcd/releases/tag/v3.0.2) (2016-07-08)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.1...v3.0.2) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Other
|
||||
|
||||
- Dockerfile uses `ENTRYPOINT`, instead of `CMD`, to run etcd without binary path specified.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.2*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.1](https://github.com/etcd-io/etcd/releases/tag/v3.0.1) (2016-07-01)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.0...v3.0.1) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.2*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.0.0](https://github.com/etcd-io/etcd/releases/tag/v3.0.0) (2016-06-30)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v2.3.0...v3.0.0) and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_0/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.6.2*](https://golang.org/doc/devel/release.html#go1.6).
|
||||
|
||||
|
||||
<hr>
|
||||
|
|
@ -1,574 +0,0 @@
|
|||
|
||||
|
||||
Previous change logs can be found at [CHANGELOG-3.0](https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.0.md).
|
||||
|
||||
<hr>
|
||||
|
||||
## [v3.1.21](https://github.com/etcd-io/etcd/releases/tag/v3.1.21) (2019-TBD)
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- [Strip out insecure endpoints from DNS SRV records when using discovery](https://github.com/etcd-io/etcd/pull/10443) with etcdctl v2
|
||||
- Add [`etcdctl endpoint health --write-out` support](https://github.com/etcd-io/etcd/pull/9540).
|
||||
- Previously, [`etcdctl endpoint health --write-out json` did not work](https://github.com/etcd-io/etcd/issues/9532).
|
||||
- The command output is changed. Previously, if endpoint is unreachable, the command output is
|
||||
"\<endpoint\> is unhealthy: failed to connect: \<error message\>". This change unified the error message, all error types
|
||||
now have the same output "\<endpoint\> is unhealthy: failed to commit proposal: \<error message\>".
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Fix bug where [db_compaction_total_duration_milliseconds metric incorrectly measured duration as 0](https://github.com/etcd-io/etcd/pull/10646).
|
||||
|
||||
<hr>
|
||||
|
||||
## [v3.1.20](https://github.com/etcd-io/etcd/releases/tag/v3.1.20) (2018-10-10)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.19...v3.1.20) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Improved
|
||||
|
||||
- Improve ["became inactive" warning log](https://github.com/etcd-io/etcd/pull/10024), which indicates message send to a peer failed.
|
||||
- Improve [read index wait timeout warning log](https://github.com/etcd-io/etcd/pull/10026), which indicates that local node might have slow network.
|
||||
- Add [gRPC interceptor for debugging logs](https://github.com/etcd-io/etcd/pull/9990); enable `etcd --debug` flag to see per-request debug information.
|
||||
- Add [consistency check in snapshot status](https://github.com/etcd-io/etcd/pull/10109). If consistency check on snapshot file fails, `snapshot status` returns `"snapshot file integrity check failed..."` error.
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Improve [`etcd_network_peer_round_trip_time_seconds`](https://github.com/etcd-io/etcd/pull/10155) Prometheus metric to track leader heartbeats.
|
||||
- Previously, it only samples the TCP connection for snapshot messages.
|
||||
- Display all registered [gRPC metrics at start](https://github.com/etcd-io/etcd/pull/10034).
|
||||
- Add [`etcd_snap_db_fsync_duration_seconds_count`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_snap_db_save_total_duration_seconds_bucket`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_send_success`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_send_failures`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_send_total_duration_seconds`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_receive_success`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_receive_failures`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_network_snapshot_receive_total_duration_seconds`](https://github.com/etcd-io/etcd/pull/9997) Prometheus metric.
|
||||
- Add [`etcd_server_id`](https://github.com/etcd-io/etcd/pull/9998) Prometheus metric.
|
||||
- Add [`etcd_server_health_success`](https://github.com/etcd-io/etcd/pull/10156) Prometheus metric.
|
||||
- Add [`etcd_server_health_failures`](https://github.com/etcd-io/etcd/pull/10156) Prometheus metric.
|
||||
- Add [`etcd_server_read_indexes_failed_total`](https://github.com/etcd-io/etcd/pull/10094) Prometheus metric.
|
||||
|
||||
### client v3
|
||||
|
||||
- Fix logic on [release lock key if cancelled](https://github.com/etcd-io/etcd/pull/10153) in `clientv3/concurrency` package.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.19](https://github.com/etcd-io/etcd/releases/tag/v3.1.19) (2018-07-24)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.18...v3.1.19) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Improved
|
||||
|
||||
- Improve [Raft Read Index timeout warning messages](https://github.com/etcd-io/etcd/pull/9897).
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Add [`etcd_server_go_version`](https://github.com/etcd-io/etcd/pull/9957) Prometheus metric.
|
||||
- Add [`etcd_server_slow_read_indexes_total`](https://github.com/etcd-io/etcd/pull/9897) Prometheus metric.
|
||||
- Add [`etcd_server_quota_backend_bytes`](https://github.com/etcd-io/etcd/pull/9820) Prometheus metric.
|
||||
- Use it with `etcd_mvcc_db_total_size_in_bytes` and `etcd_mvcc_db_total_size_in_use_in_bytes`.
|
||||
- `etcd_server_quota_backend_bytes 2.147483648e+09` means current quota size is 2 GB.
|
||||
- `etcd_mvcc_db_total_size_in_bytes 20480` means current physically allocated DB size is 20 KB.
|
||||
- `etcd_mvcc_db_total_size_in_use_in_bytes 16384` means future DB size if defragment operation is complete.
|
||||
- `etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_use_in_bytes` is the number of bytes that can be saved on disk with defragment operation.
|
||||
- Add [`etcd_mvcc_db_total_size_in_bytes`](https://github.com/etcd-io/etcd/pull/9819) Prometheus metric.
|
||||
- In addition to [`etcd_debugging_mvcc_db_total_size_in_bytes`](https://github.com/etcd-io/etcd/pull/9819).
|
||||
- Add [`etcd_mvcc_db_total_size_in_use_in_bytes`](https://github.com/etcd-io/etcd/pull/9256) Prometheus metric.
|
||||
- Use it with `etcd_mvcc_db_total_size_in_bytes` and `etcd_mvcc_db_total_size_in_use_in_bytes`.
|
||||
- `etcd_server_quota_backend_bytes 2.147483648e+09` means current quota size is 2 GB.
|
||||
- `etcd_mvcc_db_total_size_in_bytes 20480` means current physically allocated DB size is 20 KB.
|
||||
- `etcd_mvcc_db_total_size_in_use_in_bytes 16384` means future DB size if defragment operation is complete.
|
||||
- `etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_use_in_bytes` is the number of bytes that can be saved on disk with defragment operation.
|
||||
|
||||
### client v3
|
||||
|
||||
- Fix [lease keepalive interval updates when response queue is full](https://github.com/etcd-io/etcd/pull/9952).
|
||||
- If `<-chan *clientv3LeaseKeepAliveResponse` from `clientv3.Lease.KeepAlive` was never consumed or channel is full, client was [sending keepalive request every 500ms](https://github.com/etcd-io/etcd/issues/9911) instead of expected rate of every "TTL / 3" duration.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.18](https://github.com/etcd-io/etcd/releases/tag/v3.1.18) (2018-06-15)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.17...v3.1.18) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Add [`etcd_server_version`](https://github.com/etcd-io/etcd/pull/8960) Prometheus metric.
|
||||
- To replace [Kubernetes `etcd-version-monitor`](https://github.com/etcd-io/etcd/issues/8948).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.17](https://github.com/etcd-io/etcd/releases/tag/v3.1.17) (2018-06-06)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.16...v3.1.17) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fix [v3 snapshot recovery](https://github.com/etcd-io/etcd/issues/7628).
|
||||
- A follower receives a leader snapshot to be persisted as a `[SNAPSHOT-INDEX].snap.db` file on disk.
|
||||
- Now, server [ensures that the incoming snapshot be persisted on disk before loading it](https://github.com/etcd-io/etcd/pull/7876).
|
||||
- Otherwise, index mismatch happens and triggers server-side panic (e.g. newer WAL entry with outdated snapshot index).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.16](https://github.com/etcd-io/etcd/releases/tag/v3.1.16) (2018-05-31)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.15...v3.1.16) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fix [`mvcc` server panic from restore operation](https://github.com/etcd-io/etcd/pull/9775).
|
||||
- Let's assume that a watcher had been requested with a future revision X and sent to node A that became network-partitioned thereafter. Meanwhile, cluster makes progress. Then when the partition gets removed, the leader sends a snapshot to node A. Previously if the snapshot's latest revision is still lower than the watch revision X, **etcd server panicked** during snapshot restore operation.
|
||||
- Now, this server-side panic has been fixed.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.15](https://github.com/etcd-io/etcd/releases/tag/v3.1.15) (2018-05-09)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.14...v3.1.15) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Purge old [`*.snap.db` snapshot files](https://github.com/etcd-io/etcd/pull/7967).
|
||||
- Previously, etcd did not respect `--max-snapshots` flag to purge old `*.snap.db` files.
|
||||
- Now, etcd purges old `*.snap.db` files to keep maximum `--max-snapshots` number of files on disk.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.14](https://github.com/etcd-io/etcd/releases/tag/v3.1.14) (2018-04-24)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.13...v3.1.14) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Add [`etcd_server_is_leader`](https://github.com/etcd-io/etcd/pull/9587) Prometheus metric.
|
||||
|
||||
### etcd server
|
||||
|
||||
- Add [`--initial-election-tick-advance`](https://github.com/etcd-io/etcd/pull/9591) flag to configure initial election tick fast-forward.
|
||||
- By default, `--initial-election-tick-advance=true`, then local member fast-forwards election ticks to speed up "initial" leader election trigger.
|
||||
- This benefits the case of larger election ticks. For instance, cross datacenter deployment may require longer election timeout of 10-second. If true, local node does not need wait up to 10-second. Instead, forwards its election ticks to 8-second, and have only 2-second left before leader election.
|
||||
- Major assumptions are that: cluster has no active leader thus advancing ticks enables faster leader election. Or cluster already has an established leader, and rejoining follower is likely to receive heartbeats from the leader after tick advance and before election timeout.
|
||||
- However, when network from leader to rejoining follower is congested, and the follower does not receive leader heartbeat within left election ticks, disruptive election has to happen thus affecting cluster availabilities.
|
||||
- Now, this can be disabled by setting `--initial-election-tick-advance=false`.
|
||||
- Disabling this would slow down initial bootstrap process for cross datacenter deployments. Make tradeoffs by configuring `--initial-election-tick-advance` at the cost of slow initial bootstrap.
|
||||
- If single-node, it advances ticks regardless.
|
||||
- Address [disruptive rejoining follower node](https://github.com/etcd-io/etcd/issues/9333).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.13](https://github.com/etcd-io/etcd/releases/tag/v3.1.13) (2018-03-29)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.12...v3.1.13) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Improved
|
||||
|
||||
- Adjust [election timeout on server restart](https://github.com/etcd-io/etcd/pull/9415) to reduce [disruptive rejoining servers](https://github.com/etcd-io/etcd/issues/9333).
|
||||
- Previously, etcd fast-forwards election ticks on server start, with only one tick left for leader election. This is to speed up start phase, without having to wait until all election ticks elapse. Advancing election ticks is useful for cross datacenter deployments with larger election timeouts. However, it was affecting cluster availability if the last tick elapses before leader contacts the restarted node.
|
||||
- Now, when etcd restarts, it adjusts election ticks with more than one tick left, thus more time for leader to prevent disruptive restart.
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://github.com/etcd-io/etcd/tree/main/Documentation/metrics) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Add missing [`etcd_network_peer_sent_failures_total` count](https://github.com/etcd-io/etcd/pull/9437).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.12](https://github.com/etcd-io/etcd/releases/tag/v3.1.12) (2018-03-08)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.11...v3.1.12) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fix [`mvcc` "unsynced" watcher restore operation](https://github.com/etcd-io/etcd/pull/9297).
|
||||
- "unsynced" watcher is watcher that needs to be in sync with events that have happened.
|
||||
- That is, "unsynced" watcher is the slow watcher that was requested on old revision.
|
||||
- "unsynced" watcher restore operation was not correctly populating its underlying watcher group.
|
||||
- Which possibly causes [missing events from "unsynced" watchers](https://github.com/etcd-io/etcd/issues/9086).
|
||||
- A node gets network partitioned with a watcher on a future revision, and falls behind receiving a leader snapshot after partition gets removed. When applying this snapshot, etcd watch storage moves current synced watchers to unsynced since sync watchers might have become stale during network partition. And reset synced watcher group to restart watcher routines. Previously, there was a bug when moving from synced watcher group to unsynced, thus client would miss events when the watcher was requested to the network-partitioned node.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.7*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.11](https://github.com/etcd-io/etcd/releases/tag/v3.1.11) (2017-11-28)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.10...v3.1.11) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- [#8411](https://github.com/etcd-io/etcd/issues/8411),[#8806](https://github.com/etcd-io/etcd/pull/8806) backport "mvcc: sending events after restore"
|
||||
- [#8009](https://github.com/etcd-io/etcd/issues/8009),[#8902](https://github.com/etcd-io/etcd/pull/8902) backport coreos/bbolt v1.3.1-coreos.5
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.5*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.10](https://github.com/etcd-io/etcd/releases/tag/v3.1.10) (2017-07-14)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.9...v3.1.10) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Added
|
||||
|
||||
- Tag docker images with minor versions.
|
||||
- e.g. `docker pull quay.io/coreos/etcd:v3.1` to fetch latest v3.1 versions.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.8.3*](https://golang.org/doc/devel/release.html#go1.8).
|
||||
- Fix panic on `net/http.CloseNotify`
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.9](https://github.com/etcd-io/etcd/releases/tag/v3.1.9) (2017-06-09)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.8...v3.1.9) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Allow v2 snapshot over 512MB.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.6*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.8](https://github.com/etcd-io/etcd/releases/tag/v3.1.8) (2017-05-19)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.7...v3.1.8) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.7](https://github.com/etcd-io/etcd/releases/tag/v3.1.7) (2017-04-28)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.6...v3.1.7) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.6](https://github.com/etcd-io/etcd/releases/tag/v3.1.6) (2017-04-19)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.5...v3.1.6) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fill in Auth API response header.
|
||||
- Remove auth check in Status API.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.5](https://github.com/etcd-io/etcd/releases/tag/v3.1.5) (2017-03-27)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.4...v3.1.5) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fix raft memory leak issue.
|
||||
- Fix Windows file path issues.
|
||||
|
||||
### Other
|
||||
|
||||
- Add `/etc/nsswitch.conf` file to alpine-based Docker image.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.4](https://github.com/etcd-io/etcd/releases/tag/v3.1.4) (2017-03-22)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.3...v3.1.4) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.3](https://github.com/etcd-io/etcd/releases/tag/v3.1.3) (2017-03-10)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.2...v3.1.3) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd gateway
|
||||
|
||||
- Fix `etcd gateway` schema handling in DNS discovery.
|
||||
- Fix sd_notify behaviors in `gateway`, `grpc-proxy`.
|
||||
|
||||
### gRPC Proxy
|
||||
|
||||
- Fix sd_notify behaviors in `gateway`, `grpc-proxy`.
|
||||
|
||||
### Other
|
||||
|
||||
- Use machine default host when advertise URLs are default values(`localhost:2379,2380`) AND if listen URL is `0.0.0.0`.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.2](https://github.com/etcd-io/etcd/releases/tag/v3.1.2) (2017-02-24)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.1...v3.1.2) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### etcd gateway
|
||||
|
||||
- Fix `etcd gateway` with multiple endpoints.
|
||||
|
||||
### Other
|
||||
|
||||
- Use IPv4 default host, by default (when IPv4 and IPv6 are available).
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.1](https://github.com/etcd-io/etcd/releases/tag/v3.1.1) (2017-02-17)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.1.0...v3.1.1) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.5*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
## [v3.1.0](https://github.com/etcd-io/etcd/releases/tag/v3.1.0) (2017-01-20)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.0.0...v3.1.0) and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.1 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_1/).**
|
||||
|
||||
### Improved
|
||||
|
||||
- Faster linearizable reads (implements Raft [read-index](https://github.com/etcd-io/etcd/pull/6212)).
|
||||
- v3 authentication API is now stable.
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- Deprecated following gRPC metrics in favor of [go-grpc-prometheus](https://github.com/grpc-ecosystem/go-grpc-prometheus).
|
||||
- `etcd_grpc_requests_total`
|
||||
- `etcd_grpc_requests_failed_total`
|
||||
- `etcd_grpc_active_streams`
|
||||
- `etcd_grpc_unary_requests_duration_seconds`
|
||||
|
||||
### Dependency
|
||||
|
||||
- Upgrade [`github.com/ugorji/go/codec`](https://github.com/ugorji/go) to [**`ugorji/go@9c7f9b7`**](https://github.com/ugorji/go/commit/9c7f9b7a2bc3a520f7c7b30b34b7f85f47fe27b6), and [regenerate v2 `client`](https://github.com/etcd-io/etcd/pull/6945).
|
||||
|
||||
### Security, Authentication
|
||||
|
||||
See [security doc](https://etcd.io/docs/latest/op-guide/security/) for more details.
|
||||
|
||||
- SRV records (e.g., infra1.example.com) must match the discovery domain (i.e., example.com) if no custom certificate authority is given.
|
||||
- `TLSConfig.ServerName` is ignored with user-provided certificates for backwards compatibility; to be deprecated.
|
||||
- For example, `etcd --discovery-srv=example.com` will only authenticate peers/clients when the provided certs have root domain `example.com` as an entry in Subject Alternative Name (SAN) field.
|
||||
|
||||
### etcd server
|
||||
|
||||
- Automatic leadership transfer when leader steps down.
|
||||
- etcd flags
|
||||
- `--strict-reconfig-check` flag is set by default.
|
||||
- Add `--log-output` flag.
|
||||
- Add `--metrics` flag.
|
||||
- etcd uses default route IP if advertise URL is not given.
|
||||
- Cluster rejects removing members if quorum will be lost.
|
||||
- Discovery now has upper limit for waiting on retries.
|
||||
- Warn on binding listeners through domain names; to be deprecated.
|
||||
- v3.0 and v3.1 with `--auto-compaction-retention=10` run periodic compaction on v3 key-value store for every 10-hour.
|
||||
- Compactor only supports periodic compaction.
|
||||
- Compactor records latest revisions every 5-minute, until it reaches the first compaction period (e.g. 10-hour).
|
||||
- In order to retain key-value history of last compaction period, it uses the last revision that was fetched before compaction period, from the revision records that were collected every 5-minute.
|
||||
- When `--auto-compaction-retention=10`, compactor uses revision 100 for compact revision where revision 100 is the latest revision fetched from 10 hours ago.
|
||||
- If compaction succeeds or requested revision has already been compacted, it resets period timer and starts over with new historical revision records (e.g. restart revision collect and compact for the next 10-hour period).
|
||||
- If compaction fails, it retries in 5 minutes.
|
||||
|
||||
### client v3
|
||||
|
||||
- Add `SetEndpoints` method; update endpoints at runtime.
|
||||
- Add `Sync` method; auto-update endpoints at runtime.
|
||||
- Add `Lease TimeToLive` API; fetch lease information.
|
||||
- replace Config.Logger field with global logger.
|
||||
- Get API responses are sorted in ascending order by default.
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- Add `lease timetolive` command.
|
||||
- Add `--print-value-only` flag to get command.
|
||||
- Add `--dest-prefix` flag to make-mirror command.
|
||||
- `get` command responses are sorted in ascending order by default.
|
||||
|
||||
### gRPC Proxy
|
||||
|
||||
- Experimental gRPC proxy feature.
|
||||
|
||||
### Other
|
||||
|
||||
- `recipes` now conform to sessions defined in `clientv3/concurrency`.
|
||||
- ACI has symlinks to `/usr/local/bin/etcd*`.
|
||||
|
||||
### Go
|
||||
|
||||
- Compile with [*Go 1.7.4*](https://golang.org/doc/devel/release.html#go1.7).
|
||||
|
||||
|
||||
<hr>
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,508 +0,0 @@
|
|||
|
||||
|
||||
Previous change logs can be found at [CHANGELOG-3.4](https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.4.md).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.10 (tbd)
|
||||
|
||||
### etcd server
|
||||
- Fix [corruption check may get a `ErrCompacted` error when server has just been compacted](https://github.com/etcd-io/etcd/pull/16048)
|
||||
- Improve [Lease put performance for the case that auth is disabled or the user is admin](https://github.com/etcd-io/etcd/pull/16019)
|
||||
|
||||
### etcd grpc-proxy
|
||||
- Fix [Memberlist results not updated when proxy node down](https://github.com/etcd-io/etcd/pull/15907).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.9 (2023-05-11)
|
||||
|
||||
### etcd server
|
||||
- Fix [LeaseTimeToLive API may return keys to clients which have no read permission on the keys](https://github.com/etcd-io/etcd/pull/15815).
|
||||
|
||||
### Dependencies
|
||||
- Compile binaries using [go 1.19.9](https://github.com/etcd-io/etcd/pull/15822).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.8 (2023-04-13)
|
||||
|
||||
### etcd server
|
||||
- Add [`etcd --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15483) to enable support for TLS 1.3.
|
||||
- Add [`etcd --listen-client-http-urls`](https://github.com/etcd-io/etcd/pull/15589) flag to support separating http server from grpc one, thus giving full immunity to [watch stream starvation under high read load](https://github.com/etcd-io/etcd/issues/15402).
|
||||
- Change [http2 frame scheduler to random algorithm](https://github.com/etcd-io/etcd/pull/15452)
|
||||
- Fix [Watch response traveling back in time when reconnecting member downloads snapshot from the leader](https://github.com/etcd-io/etcd/pull/15515)
|
||||
- Fix [race when starting both secure & insecure gRPC servers on the same address](https://github.com/etcd-io/etcd/pull/15517)
|
||||
- Fix [server/auth: disallow creating empty permission ranges](https://github.com/etcd-io/etcd/pull/15619)
|
||||
- Fix [aligning zap log timestamp resolution to microseconds](https://github.com/etcd-io/etcd/pull/15240). Etcd now uses zap timestamp format: `2006-01-02T15:04:05.999999Z0700` (microsecond instead of milliseconds precision).
|
||||
- Fix [wsproxy did not print log in JSON format](https://github.com/etcd-io/etcd/pull/15661).
|
||||
- Fix [CVE-2021-28235](https://nvd.nist.gov/vuln/detail/CVE-2021-28235) by [clearing password after authenticating the user](https://github.com/etcd-io/etcd/pull/15653).
|
||||
- Fix [etcdserver may panic when parsing a JWT token without username or revision](https://github.com/etcd-io/etcd/pull/15676).
|
||||
- Fix [Requested watcher progress notifications are not synchronised with stream](https://github.com/etcd-io/etcd/pull/15695).
|
||||
|
||||
### Package `netutil`
|
||||
- Fix [consistently format IPv6 addresses for comparison](https://github.com/etcd-io/etcd/pull/15187).
|
||||
|
||||
### Package `clientv3`
|
||||
- Fix [etcd might send duplicated events to watch clients](https://github.com/etcd-io/etcd/pull/15274).
|
||||
|
||||
### Dependencies
|
||||
- Recommend [Go 1.19+](https://github.com/etcd-io/etcd/pull/15337).
|
||||
- Compile binaries using [go to 1.19.8](https://github.com/etcd-io/etcd/pull/15651)
|
||||
- Upgrade [golang.org/x/net to v0.7.0](https://github.com/etcd-io/etcd/pull/15337)
|
||||
- Upgrade [bbolt to v1.3.7](https://github.com/etcd-io/etcd/pull/15222).
|
||||
|
||||
### Docker image
|
||||
- [Remove nsswitch.conf from docker image](https://github.com/etcd-io/etcd/pull/15161)
|
||||
- Fix [etcd docker images all tagged with amd64 architecture](https://github.com/etcd-io/etcd/pull/15612)
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.7 (2023-01-20)
|
||||
|
||||
### etcd server
|
||||
- Fix [Remove memberID from data corrupt alarm](https://github.com/etcd-io/etcd/pull/14852).
|
||||
- Fix [Allow non mutating requests pass through quotaKVServer when NOSPACE](https://github.com/etcd-io/etcd/pull/14884).
|
||||
- Fix [nil pointer panic for readonly txn due to nil response](https://github.com/etcd-io/etcd/pull/14899).
|
||||
- Fix [The last record which was partially synced to disk isn't automatically repaired](https://github.com/etcd-io/etcd/pull/15069).
|
||||
- Fix [etcdserver might promote a non-started learner](https://github.com/etcd-io/etcd/pull/15096).
|
||||
|
||||
### Package `clientv3`
|
||||
- Reverted the fix to [auth invalid token and old revision errors in watch](https://github.com/etcd-io/etcd/pull/14995).
|
||||
|
||||
### Dependencies
|
||||
- Recommend [Go 1.17+](https://github.com/etcd-io/etcd/pull/15019).
|
||||
- Compile binaries using [Go 1.17.13](https://github.com/etcd-io/etcd/pull/15019)
|
||||
- Bumped [some dependencies](https://github.com/etcd-io/etcd/pull/15018) to address some HIGH Vulnerabilities.
|
||||
|
||||
### Docker image
|
||||
- Use [distroless base image](https://github.com/etcd-io/etcd/pull/15016) to address critical Vulnerabilities.
|
||||
- Updated [base image from base-debian11 to static-debian11 and removed dependency on busybox](https://github.com/etcd-io/etcd/pull/15037).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.6 (2022-11-21)
|
||||
|
||||
### etcd server
|
||||
- Fix [auth invalid token and old revision errors in watch](https://github.com/etcd-io/etcd/pull/14547)
|
||||
- Fix [avoid closing a watch with ID 0 incorrectly](https://github.com/etcd-io/etcd/pull/14563)
|
||||
- Fix [auth: fix data consistency issue caused by recovery from snapshot](https://github.com/etcd-io/etcd/pull/14648)
|
||||
- Fix [revision might be inconsistency between members when etcd crashes during processing defragmentation operation](https://github.com/etcd-io/etcd/pull/14733)
|
||||
- Fix [timestamp in inconsistent format](https://github.com/etcd-io/etcd/pull/14799)
|
||||
- Fix [Failed resolving host due to lost DNS record](https://github.com/etcd-io/etcd/pull/14573)
|
||||
|
||||
### Package `clientv3`
|
||||
- Fix [Add backoff before retry when watch stream returns unavailable](https://github.com/etcd-io/etcd/pull/14582).
|
||||
- Fix [stack overflow error in double barrier](https://github.com/etcd-io/etcd/pull/14658)
|
||||
- Fix [Refreshing token on CommonName based authentication causes segmentation violation in client](https://github.com/etcd-io/etcd/pull/14790).
|
||||
|
||||
### etcd grpc-proxy
|
||||
- Add [`etcd grpc-proxy start --listen-cipher-suites`](https://github.com/etcd-io/etcd/pull/14500) flag to support adding configurable cipher list.
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.5 (2022-09-15)
|
||||
|
||||
### Deprecations
|
||||
- Deprecated [SetKeepAlive and SetKeepAlivePeriod in limitListenerConn](https://github.com/etcd-io/etcd/pull/14366).
|
||||
|
||||
### Package `clientv3`
|
||||
- Fix [do not overwrite authTokenBundle on dial](https://github.com/etcd-io/etcd/pull/14132).
|
||||
- Fix [IsOptsWithPrefix returns false even if WithPrefix() is included](https://github.com/etcd-io/etcd/pull/14187).
|
||||
|
||||
### etcd server
|
||||
- [Build official darwin/arm64 artifacts](https://github.com/etcd-io/etcd/pull/14436).
|
||||
- Add [`etcd --max-concurrent-streams`](https://github.com/etcd-io/etcd/pull/14219) flag to configure the max concurrent streams each client can open at a time, and defaults to math.MaxUint32.
|
||||
- Add [`etcd --experimental-compact-hash-check-enabled --experimental-compact-hash-check-time`](https://github.com/etcd-io/etcd/issues/14039) flags to support enabling reliable corruption detection on compacted revisions.
|
||||
- Fix [unexpected error during txn](https://github.com/etcd-io/etcd/issues/14110).
|
||||
- Fix [lease leak issue due to tokenProvider isn't enabled when restoring auth store from a snapshot](https://github.com/etcd-io/etcd/pull/13205).
|
||||
- Fix [the race condition between goroutine and channel on the same leases to be revoked](https://github.com/etcd-io/etcd/pull/14087).
|
||||
- Fix [lessor may continue to schedule checkpoint after stepping down leader role](https://github.com/etcd-io/etcd/pull/14087).
|
||||
- Fix [Restrict the max size of each WAL entry to the remaining size of the WAL file](https://github.com/etcd-io/etcd/pull/14127).
|
||||
- Fix [Protect rangePermCache with a RW lock correctly](https://github.com/etcd-io/etcd/pull/14227)
|
||||
- Fix [memberID equals zero in corruption alarm](https://github.com/etcd-io/etcd/pull/14272)
|
||||
- Fix [Durability API guarantee broken in single node cluster](https://github.com/etcd-io/etcd/pull/14424)
|
||||
- Fix [etcd fails to start after performing alarm list operation and then power off/on](https://github.com/etcd-io/etcd/pull/14429)
|
||||
- Fix [authentication data not loaded on member startup](https://github.com/etcd-io/etcd/pull/14409)
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- Fix [etcdctl move-leader may fail for multiple endpoints](https://github.com/etcd-io/etcd/pull/14434)
|
||||
|
||||
|
||||
### Other
|
||||
- [Bump golang.org/x/crypto to latest version](https://github.com/etcd-io/etcd/pull/13996) to address [CVE-2022-27191](https://github.com/advisories/GHSA-8c26-wmh5-6g9v).
|
||||
- [Bump OpenTelemetry to 1.0.1 and gRPC to 1.41.0](https://github.com/etcd-io/etcd/pull/14312).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.4 (2022-04-24)
|
||||
|
||||
### etcd server
|
||||
- Fix [etcd panic on startup (auth enabled)](https://github.com/etcd-io/etcd/pull/13946)
|
||||
|
||||
### package `client/pkg/v3`
|
||||
|
||||
- [Revert the change of trimming the trailing dot from SRV.Target](https://github.com/etcd-io/etcd/pull/13950) returned by DNS lookup
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.3 (2022-04-13)
|
||||
|
||||
### etcd server
|
||||
- Fix [Provide a better liveness probe for when etcd runs as a Kubernetes pod](https://github.com/etcd-io/etcd/pull/13706)
|
||||
- Fix [inconsistent log format](https://github.com/etcd-io/etcd/pull/13864)
|
||||
- Fix [Inconsistent revision and data occurs](https://github.com/etcd-io/etcd/pull/13908)
|
||||
- Fix [Etcdserver is still in progress of processing LeaseGrantRequest when it receives a LeaseKeepAliveRequest on the same leaseID](https://github.com/etcd-io/etcd/pull/13932)
|
||||
- Fix [consistent_index coming from snapshot is overwritten by the old local value](https://github.com/etcd-io/etcd/pull/13933)
|
||||
- [Update container base image snapshot](https://github.com/etcd-io/etcd/pull/13862)
|
||||
- Fix [Defrag unsets backend options](https://github.com/etcd-io/etcd/pull/13701).
|
||||
|
||||
### package `client/pkg/v3`
|
||||
|
||||
- [Trim the suffix dot from the target](https://github.com/etcd-io/etcd/pull/13714) in SRV records returned by DNS lookup
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- [Always print the raft_term in decimal](https://github.com/etcd-io/etcd/pull/13727) when displaying member list in json.
|
||||
|
||||
<hr>
|
||||
|
||||
## [v3.5.2](https://github.com/etcd-io/etcd/releases/tag/v3.5.2) (2022-02-01)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.5.1...v3.5.2) and [v3.5 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_5/) for any breaking changes.
|
||||
|
||||
### etcd server
|
||||
- Fix [exclude the same alarm type activated by multiple peers](https://github.com/etcd-io/etcd/pull/13476).
|
||||
- Add [`etcd --experimental-enable-lease-checkpoint-persist`](https://github.com/etcd-io/etcd/pull/13508) flag to enable checkpoint persisting.
|
||||
- Fix [Lease checkpoints don't prevent to reset ttl on leader change](https://github.com/etcd-io/etcd/pull/13508), requires enabling checkpoint persisting.
|
||||
- Fix [assertion failed due to tx closed when recovering v3 backend from a snapshot db](https://github.com/etcd-io/etcd/pull/13501)
|
||||
- Fix [segmentation violation(SIGSEGV) error due to premature unlocking of watchableStore](https://github.com/etcd-io/etcd/pull/13541)
|
||||
|
||||
<hr>
|
||||
|
||||
## [v3.5.1](https://github.com/etcd-io/etcd/releases/tag/v3.5.1) (2021-10-15)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0...v3.5.1) and [v3.5 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_5/) for any breaking changes.
|
||||
|
||||
### etcd server
|
||||
|
||||
- Fix [self-signed-cert-validity parameter cannot be specified in the config file](https://github.com/etcd-io/etcd/pull/13237).
|
||||
- Fix [ensure that cluster members stored in v2store and backend are in sync](https://github.com/etcd-io/etcd/pull/13348)
|
||||
|
||||
### etcd client
|
||||
|
||||
- [Fix etcd client sends invalid :authority header](https://github.com/etcd-io/etcd/issues/13192)
|
||||
|
||||
### package clientv3
|
||||
|
||||
- Endpoints self identify now as `etcd-endpoints://{id}/{authority}` where authority is based on first endpoint passed, for example `etcd-endpoints://0xc0009d8540/localhost:2079`
|
||||
|
||||
### Other
|
||||
|
||||
- Updated [base image](https://github.com/etcd-io/etcd/pull/13386) from `debian:buster-v1.4.0` to `debian:bullseye-20210927` to fix the following critical CVEs:
|
||||
- [CVE-2021-3711](https://nvd.nist.gov/vuln/detail/CVE-2021-3711): miscalculation of a buffer size in openssl's SM2 decryption
|
||||
- [CVE-2021-35942](https://nvd.nist.gov/vuln/detail/CVE-2021-35942): integer overflow flaw in glibc
|
||||
- [CVE-2019-9893](https://nvd.nist.gov/vuln/detail/CVE-2019-9893): incorrect syscall argument generation in libseccomp
|
||||
- [CVE-2021-36159](https://nvd.nist.gov/vuln/detail/CVE-2021-36159): libfetch in apk-tools mishandles numeric strings in FTP and HTTP protocols to allow out of bound reads.
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.0 (2021-06)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.4.0...v3.5.0) and [v3.5 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_5/) for any breaking changes.
|
||||
|
||||
- [v3.5.0](https://github.com/etcd-io/etcd/releases/tag/v3.5.0) (2021 TBD), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-rc.1...v3.5.0).
|
||||
- [v3.5.0-rc.1](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-rc.1) (2021-06-10), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-rc.0...v3.5.0-rc.1).
|
||||
- [v3.5.0-rc.0](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-rc.0) (2021-06-04), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-beta.4...v3.5.0-rc.0).
|
||||
- [v3.5.0-beta.4](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-beta.4) (2021-05-26), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-beta.3...v3.5.0-beta.4).
|
||||
- [v3.5.0-beta.3](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-beta.3) (2021-05-18), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-beta.2...v3.5.0-beta.3).
|
||||
- [v3.5.0-beta.2](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-beta.2) (2021-05-18), see [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0-beta.1...v3.5.0-beta.2).
|
||||
- [v3.5.0-beta.1](https://github.com/etcd-io/etcd/releases/tag/v3.5.0-beta.1) (2021-05-18), see [code changes](https://github.com/etcd-io/etcd/compare/v3.4.0...v3.5.0-beta.1).
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v3.5 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_3_5/).**
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- `go.etcd.io/etcd` Go packages have moved to `go.etcd.io/etcd/{api,pkg,raft,client,etcdctl,server,raft,tests}/v3` to follow the [Go modules](https://github.com/golang/go/wiki/Modules) conventions
|
||||
- `go.etcd.io/clientv3/snapshot` SnapshotManager class have moved to `go.etcd.io/clientv3/etcdctl`.
|
||||
The method `snapshot.Save` to download a snapshot from the remote server was preserved in 'go.etcd.io/clientv3/snapshot`.
|
||||
- `go.etcd.io/client' package got migrated to 'go.etcd.io/client/v2'.
|
||||
- Changed behavior of clientv3 API [MemberList](https://github.com/etcd-io/etcd/pull/11639).
|
||||
- Previously, it is directly served with server's local data, which could be stale.
|
||||
- Now, it is served with linearizable guarantee. If the server is disconnected from quorum, `MemberList` call will fail.
|
||||
- [gRPC gateway](https://github.com/grpc-ecosystem/grpc-gateway) only supports [`/v3`](TODO) endpoint.
|
||||
- Deprecated [`/v3beta`](https://github.com/etcd-io/etcd/pull/9298).
|
||||
- `curl -L http://localhost:2379/v3beta/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'` doesn't work in v3.5. Use `curl -L http://localhost:2379/v3/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'` instead.
|
||||
- **`etcd --experimental-enable-v2v3` flag remains experimental and to be deprecated.**
|
||||
- v2 storage emulation feature will be deprecated in the next release.
|
||||
- etcd 3.5 is the last version that supports V2 API. Flags `--enable-v2` and `--experimental-enable-v2v3` [are now deprecated](https://github.com/etcd-io/etcd/pull/12940) and will be removed in etcd v3.6 release.
|
||||
- **`etcd --experimental-backend-bbolt-freelist-type` flag has been deprecated.** Use **`etcd --backend-bbolt-freelist-type`** instead. The default type is hashmap and it is stable now.
|
||||
- **`etcd --debug` flag has been deprecated.** Use **`etcd --log-level=debug`** instead.
|
||||
- Remove [`embed.Config.Debug`](https://github.com/etcd-io/etcd/pull/10947).
|
||||
- **`etcd --log-output` flag has been deprecated.** Use **`etcd --log-outputs`** instead.
|
||||
- **`etcd --logger=zap --log-outputs=stderr`** is now the default.
|
||||
- **`etcd --logger=capnslog` flag value has been deprecated.**
|
||||
- **`etcd --logger=zap --log-outputs=default` flag value is not supported.**.
|
||||
- Use `etcd --logger=zap --log-outputs=stderr`.
|
||||
- Or, use `etcd --logger=zap --log-outputs=systemd/journal` to send logs to the local systemd journal.
|
||||
- Previously, if etcd parent process ID (PPID) is 1 (e.g. run with systemd), `etcd --logger=capnslog --log-outputs=default` redirects server logs to local systemd journal. And if write to journald fails, it writes to `os.Stderr` as a fallback.
|
||||
- However, even with PPID 1, it can fail to dial systemd journal (e.g. run embedded etcd with Docker container). Then, [every single log write will fail](https://github.com/etcd-io/etcd/pull/9729) and fall back to `os.Stderr`, which is inefficient.
|
||||
- To avoid this problem, systemd journal logging must be configured manually.
|
||||
- **`etcd --log-outputs=stderr`** is now the default.
|
||||
- **`etcd --log-package-levels` flag for `capnslog` has been deprecated.** Now, **`etcd --logger=zap --log-outputs=stderr`** is the default.
|
||||
- **`[CLIENT-URL]/config/local/log` endpoint has been deprecated, as is `etcd --log-package-levels` flag.**
|
||||
- `curl http://127.0.0.1:2379/config/local/log -XPUT -d '{"Level":"DEBUG"}'` won't work.
|
||||
- Please use `etcd --logger=zap --log-outputs=stderr` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_db_total_size_in_bytes` Prometheus metric. Use `etcd_mvcc_db_total_size_in_bytes` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_put_total` Prometheus metric. Use `etcd_mvcc_put_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_delete_total` Prometheus metric. Use `etcd_mvcc_delete_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_txn_total` Prometheus metric. Use `etcd_mvcc_txn_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_range_total` Prometheus metric. Use `etcd_mvcc_range_total` instead.
|
||||
- Main branch `/version` outputs `3.5.0-pre`, instead of `3.4.0+git`.
|
||||
- Changed `proxy` package function signature to [support structured logger](https://github.com/etcd-io/etcd/pull/11614).
|
||||
- Previously, `NewClusterProxy(c *clientv3.Client, advaddr string, prefix string) (pb.ClusterServer, <-chan struct{})`, now `NewClusterProxy(lg *zap.Logger, c *clientv3.Client, advaddr string, prefix string) (pb.ClusterServer, <-chan struct{})`.
|
||||
- Previously, `Register(c *clientv3.Client, prefix string, addr string, ttl int)`, now `Register(lg *zap.Logger, c *clientv3.Client, prefix string, addr string, ttl int) <-chan struct{}`.
|
||||
- Previously, `NewHandler(t *http.Transport, urlsFunc GetProxyURLs, failureWait time.Duration, refreshInterval time.Duration) http.Handler`, now `NewHandler(lg *zap.Logger, t *http.Transport, urlsFunc GetProxyURLs, failureWait time.Duration, refreshInterval time.Duration) http.Handler`.
|
||||
- Changed `pkg/flags` function signature to [support structured logger](https://github.com/etcd-io/etcd/pull/11616).
|
||||
- Previously, `SetFlagsFromEnv(prefix string, fs *flag.FlagSet) error`, now `SetFlagsFromEnv(lg *zap.Logger, prefix string, fs *flag.FlagSet) error`.
|
||||
- Previously, `SetPflagsFromEnv(prefix string, fs *pflag.FlagSet) error`, now `SetPflagsFromEnv(lg *zap.Logger, prefix string, fs *pflag.FlagSet) error`.
|
||||
- ClientV3 supports [grpc resolver API](https://github.com/etcd-io/etcd/blob/main/client/v3/naming/resolver/resolver.go).
|
||||
- Endpoints can be managed using [endpoints.Manager](https://github.com/etcd-io/etcd/blob/main/client/v3/naming/endpoints/endpoints.go)
|
||||
- Previously supported [GRPCResolver was decomissioned](https://github.com/etcd-io/etcd/pull/12675). Use [resolver](https://github.com/etcd-io/etcd/blob/main/client/v3/naming/resolver/resolver.go) instead.
|
||||
- Turned on [--pre-vote by default](https://github.com/etcd-io/etcd/pull/12770). Should prevent disrupting RAFT leader by an individual member.
|
||||
- [ETCD_CLIENT_DEBUG env](https://github.com/etcd-io/etcd/pull/12786): Now supports log levels (debug, info, warn, error, dpanic, panic, fatal). Only when set, overrides application-wide grpc logging settings.
|
||||
- [Embed Etcd.Close()](https://github.com/etcd-io/etcd/pull/12828) needs to called exactly once and closes Etcd.Err() stream.
|
||||
- [Embed Etcd does not override global/grpc logger](https://github.com/etcd-io/etcd/pull/12861) be default any longer. If desired, please call `embed.Config::SetupGlobalLoggers()` explicitly.
|
||||
- [Embed Etcd custom logger should be configured using simpler builder `NewZapLoggerBuilder`](https://github.com/etcd-io/etcd/pull/12973).
|
||||
- Client errors of `context cancelled` or `context deadline exceeded` are exposed as `codes.Canceled` and `codes.DeadlineExceeded`, instead of `codes.Unknown`.
|
||||
|
||||
|
||||
### Storage format changes
|
||||
- [WAL log's snapshots persists raftpb.ConfState](https://github.com/etcd-io/etcd/pull/12735)
|
||||
- [Backend persists raftpb.ConfState](https://github.com/etcd-io/etcd/pull/12962) in the `meta` bucket `confState` key.
|
||||
- [Backend persists applied term](https://github.com/etcd-io/etcd/pull/) in the `meta` bucket.
|
||||
- Backend persists `downgrade` in the `cluster` bucket
|
||||
|
||||
### Security
|
||||
|
||||
- Add [`TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256` and `TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256` to `etcd --cipher-suites`](https://github.com/etcd-io/etcd/pull/11864).
|
||||
- Changed [the format of WAL entries related to auth for not keeping password as a plain text](https://github.com/etcd-io/etcd/pull/11943).
|
||||
- Add third party [Security Audit Report](https://github.com/etcd-io/etcd/pull/12201).
|
||||
- A [log warning](https://github.com/etcd-io/etcd/pull/12242) is added when etcd uses any existing directory that has a permission different than 700 on Linux and 777 on Windows.
|
||||
- Add optional [`ClientCertFile` and `ClientKeyFile`](https://github.com/etcd-io/etcd/pull/12705) options for peer and client tls configuration when split certificates are used.
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://etcd.io/docs/latest/metrics/) for all metrics per release.
|
||||
|
||||
Note that any `etcd_debugging_*` metrics are experimental and subject to change.
|
||||
|
||||
- Deprecated `etcd_debugging_mvcc_db_total_size_in_bytes` Prometheus metric. Use `etcd_mvcc_db_total_size_in_bytes` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_put_total` Prometheus metric. Use `etcd_mvcc_put_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_delete_total` Prometheus metric. Use `etcd_mvcc_delete_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_txn_total` Prometheus metric. Use `etcd_mvcc_txn_total` instead.
|
||||
- Deprecated `etcd_debugging_mvcc_range_total` Prometheus metric. Use `etcd_mvcc_range_total` instead.
|
||||
- Add [`etcd_debugging_mvcc_current_revision`](https://github.com/etcd-io/etcd/pull/11126) Prometheus metric.
|
||||
- Add [`etcd_debugging_mvcc_compact_revision`](https://github.com/etcd-io/etcd/pull/11126) Prometheus metric.
|
||||
- Change [`etcd_cluster_version`](https://github.com/etcd-io/etcd/pull/11254) Prometheus metrics to include only major and minor version.
|
||||
- Add [`etcd_debugging_mvcc_total_put_size_in_bytes`](https://github.com/etcd-io/etcd/pull/11374) Prometheus metric.
|
||||
- Add [`etcd_server_client_requests_total` with `"type"` and `"client_api_version"` labels](https://github.com/etcd-io/etcd/pull/11687).
|
||||
- Add [`etcd_wal_write_bytes_total`](https://github.com/etcd-io/etcd/pull/11738).
|
||||
- Add [`etcd_debugging_auth_revision`](https://github.com/etcd-io/etcd/commit/f14d2a087f7b0fd6f7980b95b5e0b945109c95f3).
|
||||
- Add [`os_fd_used` and `os_fd_limit` to monitor current OS file descriptors](https://github.com/etcd-io/etcd/pull/12214).
|
||||
- Add [`etcd_disk_defrag_inflight`](https://github.com/etcd-io/etcd/pull/13395).
|
||||
|
||||
### etcd server
|
||||
|
||||
- Add [don't attempt to grant nil permission to a role](https://github.com/etcd-io/etcd/pull/13086).
|
||||
- Add [don't activate alarms w/missing AlarmType](https://github.com/etcd-io/etcd/pull/13084).
|
||||
- Add [`TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256` and `TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256` to `etcd --cipher-suites`](https://github.com/etcd-io/etcd/pull/11864).
|
||||
- Automatically [create parent directory if it does not exist](https://github.com/etcd-io/etcd/pull/9626) (fix [issue#9609](https://github.com/etcd-io/etcd/issues/9609)).
|
||||
- v4.0 will configure `etcd --enable-v2=true --enable-v2v3=/aaa` to enable v2 API server that is backed by **v3 storage**.
|
||||
- [`etcd --backend-bbolt-freelist-type`] flag is now stable.
|
||||
- `etcd --experimental-backend-bbolt-freelist-type` has been deprecated.
|
||||
- Support [downgrade API](https://github.com/etcd-io/etcd/pull/11715).
|
||||
- Deprecate v2 apply on cluster version. [Use v3 request to set cluster version and recover cluster version from v3 backend](https://github.com/etcd-io/etcd/pull/11427).
|
||||
- [Use v2 api to update cluster version to support mixed version cluster during upgrade](https://github.com/etcd-io/etcd/pull/12988).
|
||||
- [Fix corruption bug in defrag](https://github.com/etcd-io/etcd/pull/11613).
|
||||
- Fix [quorum protection logic when promoting a learner](https://github.com/etcd-io/etcd/pull/11640).
|
||||
- Improve [peer corruption checker](https://github.com/etcd-io/etcd/pull/11621) to work when peer mTLS is enabled.
|
||||
- Log [`[CLIENT-PORT]/health` check in server side](https://github.com/etcd-io/etcd/pull/11704).
|
||||
- Log [successful etcd server-side health check in debug level](https://github.com/etcd-io/etcd/pull/12677).
|
||||
- Improve [compaction performance when latest index is greater than 1-million](https://github.com/etcd-io/etcd/pull/11734).
|
||||
- [Refactor consistentindex](https://github.com/etcd-io/etcd/pull/11699).
|
||||
- [Add log when etcdserver failed to apply command](https://github.com/etcd-io/etcd/pull/11670).
|
||||
- Improve [count-only range performance](https://github.com/etcd-io/etcd/pull/11771).
|
||||
- Remove [redundant storage restore operation to shorten the startup time](https://github.com/etcd-io/etcd/pull/11779).
|
||||
- With 40 million key test data,it can shorten the startup time from 5 min to 2.5 min.
|
||||
- [Fix deadlock bug in mvcc](https://github.com/etcd-io/etcd/pull/11817).
|
||||
- Fix [inconsistency between WAL and server snapshot](https://github.com/etcd-io/etcd/pull/11888).
|
||||
- Previously, server restore fails if it had crashed after persisting raft hard state but before saving snapshot.
|
||||
- See https://github.com/etcd-io/etcd/issues/10219 for more.
|
||||
- Add [missing CRC checksum check in WAL validate method otherwise causes panic](https://github.com/etcd-io/etcd/pull/11924).
|
||||
- See https://github.com/etcd-io/etcd/issues/11918.
|
||||
- Improve logging around snapshot send and receive.
|
||||
- [Push down RangeOptions.limit argv into index tree to reduce memory overhead](https://github.com/etcd-io/etcd/pull/11990).
|
||||
- Add [reason field for /health response](https://github.com/etcd-io/etcd/pull/11983).
|
||||
- Add [exclude alarms from health check conditionally](https://github.com/etcd-io/etcd/pull/12880).
|
||||
- Add [`etcd --unsafe-no-fsync`](https://github.com/etcd-io/etcd/pull/11946) flag.
|
||||
- Setting the flag disables all uses of fsync, which is unsafe and will cause data loss. This flag makes it possible to run an etcd node for testing and development without placing lots of load on the file system.
|
||||
- Add [`etcd --auth-token-ttl`](https://github.com/etcd-io/etcd/pull/11980) flag to customize `simpleTokenTTL` settings.
|
||||
- Improve [`runtime.FDUsage` call pattern to reduce objects malloc of Memory Usage and CPU Usage](https://github.com/etcd-io/etcd/pull/11986).
|
||||
- Improve [mvcc.watchResponse channel Memory Usage](https://github.com/etcd-io/etcd/pull/11987).
|
||||
- Log [expensive request info in UnaryInterceptor](https://github.com/etcd-io/etcd/pull/12086).
|
||||
- [Fix invalid Go type in etcdserverpb](https://github.com/etcd-io/etcd/pull/12000).
|
||||
- [Improve healthcheck by using v3 range request and its corresponding timeout](https://github.com/etcd-io/etcd/pull/12195).
|
||||
- Add [`etcd --experimental-watch-progress-notify-interval`](https://github.com/etcd-io/etcd/pull/12216) flag to make watch progress notify interval configurable.
|
||||
- Fix [server panic in slow writes warnings](https://github.com/etcd-io/etcd/issues/12197).
|
||||
- Fixed via [PR#12238](https://github.com/etcd-io/etcd/pull/12238).
|
||||
- [Fix server panic](https://github.com/etcd-io/etcd/pull/12288) when force-new-cluster flag is enabled in a cluster which had learner node.
|
||||
- Add [`etcd --self-signed-cert-validity`](https://github.com/etcd-io/etcd/pull/12429) flag to support setting certificate expiration time.
|
||||
- Notice, certificates generated by etcd are valid for 1 year by default when specifying the auto-tls or peer-auto-tls option.
|
||||
- Add [`etcd --experimental-warning-apply-duration`](https://github.com/etcd-io/etcd/pull/12448) flag which allows apply duration threshold to be configurable.
|
||||
- Add [`etcd --experimental-memory-mlock`](https://github.com/etcd-io/etcd/pull/TODO) flag which prevents etcd memory pages to be swapped out.
|
||||
- Add [`etcd --socket-reuse-port`](https://github.com/etcd-io/etcd/pull/12702) flag
|
||||
- Setting this flag enables `SO_REUSEPORT` which allows rebind of a port already in use. User should take caution when using this flag to ensure flock is properly enforced.
|
||||
- Add [`etcd --socket-reuse-address`](https://github.com/etcd-io/etcd/pull/12702) flag
|
||||
- Setting this flag enables `SO_REUSEADDR` which allows binding to an address in `TIME_WAIT` state, improving etcd restart time.
|
||||
- Reduce [around 30% memory allocation by logging range response size without marshal](https://github.com/etcd-io/etcd/pull/12871).
|
||||
- `ETCD_VERIFY="all"` environment triggers [additional verification of consistency](https://github.com/etcd-io/etcd/pull/12901) of etcd data-dir files.
|
||||
- Add [`etcd --enable-log-rotation`](https://github.com/etcd-io/etcd/pull/12774) boolean flag which enables log rotation if true.
|
||||
- Add [`etcd --log-rotation-config-json`](https://github.com/etcd-io/etcd/pull/12774) flag which allows passthrough of JSON config to configure log rotation for a file output target.
|
||||
- Add experimental distributed tracing boolean flag [`--experimental-enable-distributed-tracing`](https://github.com/etcd-io/etcd/pull/12919) which enables tracing.
|
||||
- Add [`etcd --experimental-distributed-tracing-address`](https://github.com/etcd-io/etcd/pull/12919) string flag which allows configuring the OpenTelemetry collector address.
|
||||
- Add [`etcd --experimental-distributed-tracing-service-name`](https://github.com/etcd-io/etcd/pull/12919) string flag which allows changing the default "etcd" service name.
|
||||
- Add [`etcd --experimental-distributed-tracing-instance-id`](https://github.com/etcd-io/etcd/pull/12919) string flag which configures an instance ID, which must be unique per etcd instance.
|
||||
- Add [`--experimental-bootstrap-defrag-threshold-megabytes`](https://github.com/etcd-io/etcd/pull/12941) which configures a threshold for the unused db size and etcdserver will automatically perform defragmentation on bootstrap when it exceeds this value. The functionality is disabled if the value is 0.
|
||||
|
||||
### Package `runtime`
|
||||
|
||||
- Optimize [`runtime.FDUsage` by removing unnecessary sorting](https://github.com/etcd-io/etcd/pull/12214).
|
||||
|
||||
### Package `embed`
|
||||
|
||||
- Remove [`embed.Config.Debug`](https://github.com/etcd-io/etcd/pull/10947).
|
||||
- Use `embed.Config.LogLevel` instead.
|
||||
- Add [`embed.Config.ZapLoggerBuilder`](https://github.com/etcd-io/etcd/pull/11147) to allow creating a custom zap logger.
|
||||
- Replace [global `*zap.Logger` with etcd server logger object](https://github.com/etcd-io/etcd/pull/12212).
|
||||
- Add [`embed.Config.EnableLogRotation`](https://github.com/etcd-io/etcd/pull/12774) which enables log rotation if true.
|
||||
- Add [`embed.Config.LogRotationConfigJSON`](https://github.com/etcd-io/etcd/pull/12774) to allow passthrough of JSON config to configure log rotation for a file output target.
|
||||
- Add [`embed.Config.ExperimentalEnableDistributedTracing`](https://github.com/etcd-io/etcd/pull/12919) which enables experimental distributed tracing if true.
|
||||
- Add [`embed.Config.ExperimentalDistributedTracingAddress`](https://github.com/etcd-io/etcd/pull/12919) which allows overriding default collector address.
|
||||
- Add [`embed.Config.ExperimentalDistributedTracingServiceName`](https://github.com/etcd-io/etcd/pull/12919) which allows overriding default "etcd" service name.
|
||||
- Add [`embed.Config.ExperimentalDistributedTracingServiceInstanceID`](https://github.com/etcd-io/etcd/pull/12919) which allows configuring an instance ID, which must be uniquer per etcd instance.
|
||||
|
||||
### Package `clientv3`
|
||||
|
||||
- Remove [excessive watch cancel logging messages](https://github.com/etcd-io/etcd/pull/12187).
|
||||
- See [kubernetes/kubernetes#93450](https://github.com/kubernetes/kubernetes/issues/93450).
|
||||
- Add [`TryLock`](https://github.com/etcd-io/etcd/pull/11104) method to `clientv3/concurrency/Mutex`. A non-blocking method on `Mutex` which does not wait to get lock on the Mutex, returns immediately if Mutex is locked by another session.
|
||||
- Fix [client balancer failover against multiple endpoints](https://github.com/etcd-io/etcd/pull/11184).
|
||||
- Fix [`"kube-apiserver: failover on multi-member etcd cluster fails certificate check on DNS mismatch"`](https://github.com/kubernetes/kubernetes/issues/83028).
|
||||
- Fix [IPv6 endpoint parsing in client](https://github.com/etcd-io/etcd/pull/11211).
|
||||
- Fix ["1.16: etcd client does not parse IPv6 addresses correctly when members are joining" (kubernetes#83550)](https://github.com/kubernetes/kubernetes/issues/83550).
|
||||
- Fix [errors caused by grpc changing balancer/resolver API](https://github.com/etcd-io/etcd/pull/11564). This change is compatible with grpc >= [v1.26.0](https://github.com/grpc/grpc-go/releases/tag/v1.26.0), but is not compatible with < v1.26.0 version.
|
||||
- Use [ServerName as the authority](https://github.com/etcd-io/etcd/pull/11574) after bumping to grpc v1.26.0. Remove workaround in [#11184](https://github.com/etcd-io/etcd/pull/11184).
|
||||
- Fix [`"hasleader"` metadata embedding](https://github.com/etcd-io/etcd/pull/11687).
|
||||
- Previously, `clientv3.WithRequireLeader(ctx)` was overwriting existing context keys.
|
||||
- Fix [watch leak caused by lazy cancellation](https://github.com/etcd-io/etcd/pull/11850). When clients cancel their watches, a cancel request will now be immediately sent to the server instead of waiting for the next watch event.
|
||||
- Make sure [save snapshot downloads checksum for integrity checks](https://github.com/etcd-io/etcd/pull/11896).
|
||||
- Fix [auth token invalid after watch reconnects](https://github.com/etcd-io/etcd/pull/12264). Get AuthToken automatically when clientConn is ready.
|
||||
- Improve [clientv3:get AuthToken gracefully without extra connection](https://github.com/etcd-io/etcd/pull/12165).
|
||||
- Changed [clientv3 dialing code](https://github.com/etcd-io/etcd/pull/12671) to use grpc resolver API instead of custom balancer.
|
||||
- Endpoints self identify now as `etcd-endpoints://{id}/#initially={list of endpoints}` e.g. `etcd-endpoints://0xc0009d8540/#initially=[localhost:2079]`
|
||||
- Make sure [save snapshot downloads checksum for integrity checks](https://github.com/etcd-io/etcd/pull/11896).
|
||||
|
||||
### Package `lease`
|
||||
|
||||
- Fix [memory leak in follower nodes](https://github.com/etcd-io/etcd/pull/11731).
|
||||
- https://github.com/etcd-io/etcd/issues/11495
|
||||
- https://github.com/etcd-io/etcd/issues/11730
|
||||
- Make sure [grant/revoke won't be applied repeatedly after restarting etcd](https://github.com/etcd-io/etcd/pull/11935).
|
||||
|
||||
### Package `wal`
|
||||
|
||||
- Add [`etcd_wal_write_bytes_total`](https://github.com/etcd-io/etcd/pull/11738).
|
||||
- Handle [out-of-range slice bound in `ReadAll` and entry limit in `decodeRecord`](https://github.com/etcd-io/etcd/pull/11793).
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- Fix `etcdctl member add` command to prevent potential timeout. ([PR#11194](https://github.com/etcd-io/etcd/pull/11194) and [PR#11638](https://github.com/etcd-io/etcd/pull/11638))
|
||||
- Add [`etcdctl watch --progress-notify`](https://github.com/etcd-io/etcd/pull/11462) flag.
|
||||
- Add [`etcdctl auth status`](https://github.com/etcd-io/etcd/pull/11536) command to check if authentication is enabled
|
||||
- Add [`etcdctl get --count-only`](https://github.com/etcd-io/etcd/pull/11743) flag for output type `fields`.
|
||||
- Add [`etcdctl member list -w=json --hex`](https://github.com/etcd-io/etcd/pull/11812) flag to print memberListResponse in hex format json.
|
||||
- Changed [`etcdctl lock <lockname> exec-command`](https://github.com/etcd-io/etcd/pull/12829) to return exit code of exec-command.
|
||||
- [New tool: `etcdutl`](https://github.com/etcd-io/etcd/pull/12971) incorporated functionality of: `etcdctl snapshot status|restore`, `etcdctl backup`, `etcdctl defrag --data-dir ...`.
|
||||
- [ETCDCTL_API=3 `etcdctl migrate`](https://github.com/etcd-io/etcd/pull/12971) has been decommissioned. Use etcd <=v3.4 to restore v2 storage.
|
||||
|
||||
### gRPC gateway
|
||||
|
||||
- [gRPC gateway](https://github.com/grpc-ecosystem/grpc-gateway) only supports [`/v3`](TODO) endpoint.
|
||||
- Deprecated [`/v3beta`](https://github.com/etcd-io/etcd/pull/9298).
|
||||
- `curl -L http://localhost:2379/v3beta/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'` does work in v3.5. Use `curl -L http://localhost:2379/v3/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'` instead.
|
||||
- Set [`enable-grpc-gateway`](https://github.com/etcd-io/etcd/pull/12297) flag to true when using a config file to keep the defaults the same as the command line configuration.
|
||||
|
||||
### gRPC Proxy
|
||||
|
||||
- Fix [`panic on error`](https://github.com/etcd-io/etcd/pull/11694) for metrics handler.
|
||||
- Add [gRPC keepalive related flags](https://github.com/etcd-io/etcd/pull/11711) `grpc-keepalive-min-time`, `grpc-keepalive-interval` and `grpc-keepalive-timeout`.
|
||||
- [Fix grpc watch proxy hangs when failed to cancel a watcher](https://github.com/etcd-io/etcd/pull/12030) .
|
||||
- Add [metrics handler for grpcproxy self](https://github.com/etcd-io/etcd/pull/12107).
|
||||
- Add [health handler for grpcproxy self](https://github.com/etcd-io/etcd/pull/12114).
|
||||
|
||||
### Auth
|
||||
|
||||
- Fix [NoPassword check when adding user through GRPC gateway](https://github.com/etcd-io/etcd/pull/11418) ([issue#11414](https://github.com/etcd-io/etcd/issues/11414))
|
||||
- Fix bug where [some auth related messages are logged at wrong level](https://github.com/etcd-io/etcd/pull/11586)
|
||||
- [Fix a data corruption bug by saving consistent index](https://github.com/etcd-io/etcd/pull/11652).
|
||||
- [Improve checkPassword performance](https://github.com/etcd-io/etcd/pull/11735).
|
||||
- [Add authRevision field in AuthStatus](https://github.com/etcd-io/etcd/pull/11659).
|
||||
- Fix [a bug of not refreshing expired tokens](https://github.com/etcd-io/etcd/pull/13308).
|
||||
-
|
||||
### API
|
||||
|
||||
- Add [`/v3/auth/status`](https://github.com/etcd-io/etcd/pull/11536) endpoint to check if authentication is enabled
|
||||
- [Add `Linearizable` field to `etcdserverpb.MemberListRequest`](https://github.com/etcd-io/etcd/pull/11639).
|
||||
- [Learner support Snapshot RPC](https://github.com/etcd-io/etcd/pull/12890/).
|
||||
|
||||
### Package `netutil`
|
||||
|
||||
- Remove [`netutil.DropPort/RecoverPort/SetLatency/RemoveLatency`](https://github.com/etcd-io/etcd/pull/12491).
|
||||
- These are not used anymore. They were only used for older versions of functional testing.
|
||||
- Removed to adhere to best security practices, minimize arbitrary shell invocation.
|
||||
|
||||
### `tools/etcd-dump-metrics`
|
||||
|
||||
- Implement [input validation to prevent arbitrary shell invocation](https://github.com/etcd-io/etcd/pull/12491).
|
||||
|
||||
### Dependency
|
||||
|
||||
- Upgrade [`google.golang.org/grpc`](https://github.com/grpc/grpc-go/releases) from [**`v1.23.0`**](https://github.com/grpc/grpc-go/releases/tag/v1.23.0) to [**`v1.37.0`**](https://github.com/grpc/grpc-go/releases/tag/v1.37.0).
|
||||
- Upgrade [`go.uber.org/zap`](https://github.com/uber-go/zap/releases) from [**`v1.14.1`**](https://github.com/uber-go/zap/releases/tag/v1.14.1) to [**`v1.16.0`**](https://github.com/uber-go/zap/releases/tag/v1.16.0).
|
||||
|
||||
### Platforms
|
||||
|
||||
- etcd now [officially supports `arm64`](https://github.com/etcd-io/etcd/pull/12929).
|
||||
- See https://github.com/etcd-io/etcd/pull/12928 for adding automated tests with `arm64` EC2 instances (Graviton 2).
|
||||
- See https://github.com/etcd-io/website/pull/273 for new platform support tier policies.
|
||||
|
||||
### Release
|
||||
|
||||
- Add s390x build support ([PR#11548](https://github.com/etcd-io/etcd/pull/11548) and [PR#11358](https://github.com/etcd-io/etcd/pull/11358))
|
||||
|
||||
### Go
|
||||
|
||||
- Require [*Go 1.16+*](https://github.com/etcd-io/etcd/pull/11110).
|
||||
- Compile with [*Go 1.16+*](https://golang.org/doc/devel/release.html#go1.16)
|
||||
- etcd uses [go modules](https://github.com/etcd-io/etcd/pull/12279) (instead of vendor dir) to track dependencies.
|
||||
|
||||
### Project Governance
|
||||
|
||||
- The etcd team has added, a well defined and openly discussed, project [governance](https://github.com/etcd-io/etcd/pull/11175).
|
||||
|
||||
|
||||
<hr>
|
||||
|
|
@ -1,103 +0,0 @@
|
|||
|
||||
|
||||
Previous change logs can be found at [CHANGELOG-3.5](https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.5.md).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.6.0 (TBD)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0...v3.6.0).
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- `etcd` will no longer start on data dir created by newer versions (for example etcd v3.6 will not run on v3.7+ data dir). To downgrade data dir please check out `etcdutl migrate` command.
|
||||
- `etcd` doesn't support serving client requests on the peer listen endpoints (--listen-peer-urls). See [pull/13565](https://github.com/etcd-io/etcd/pull/13565).
|
||||
- `etcdctl` will sleep(2s) in case of range delete without `--range` flag. See [pull/13747](https://github.com/etcd-io/etcd/pull/13747)
|
||||
- Applications which depend on etcd v3.6 packages must be built with go version >= v1.18.
|
||||
|
||||
### Deprecations
|
||||
|
||||
- Deprecated [V2 discovery](https://etcd.io/docs/v3.5/dev-internal/discovery_protocol/).
|
||||
- Deprecated [SetKeepAlive and SetKeepAlivePeriod in limitListenerConn](https://github.com/etcd-io/etcd/pull/14356).
|
||||
- Removed [etcdctl defrag --data-dir](https://github.com/etcd-io/etcd/pull/13793).
|
||||
- Removed [etcdctl snapshot status](https://github.com/etcd-io/etcd/pull/13809).
|
||||
- Removed [etcdctl snapshot restore](https://github.com/etcd-io/etcd/pull/13809).
|
||||
- Removed [etcdutl snapshot save](https://github.com/etcd-io/etcd/pull/13809).
|
||||
|
||||
|
||||
### etcdctl v3
|
||||
|
||||
- Add command to generate [shell completion](https://github.com/etcd-io/etcd/pull/13133).
|
||||
- When print endpoint status, [show db size in use](https://github.com/etcd-io/etcd/pull/13639)
|
||||
- [Always print the raft_term in decimal](https://github.com/etcd-io/etcd/pull/13711) when displaying member list in json.
|
||||
- [Add one more field `storageVersion`](https://github.com/etcd-io/etcd/pull/13773) into the response of command `etcdctl endpoint status`.
|
||||
- Add [`--max-txn-ops`](https://github.com/etcd-io/etcd/pull/14340) flag to make-mirror command.
|
||||
- Add [`--consistency`](https://github.com/etcd-io/etcd/pull/15261) flag to member list command.
|
||||
- Display [field `hash_revision`](https://github.com/etcd-io/etcd/pull/14812) for `etcdctl endpoint hash` command.
|
||||
|
||||
### etcdutl v3
|
||||
|
||||
- Add command to generate [shell completion](https://github.com/etcd-io/etcd/pull/13142).
|
||||
- Add `migrate` command for downgrading/upgrading etcd data dir files.
|
||||
|
||||
### Package `clientv3`
|
||||
|
||||
- [Support serializable `MemberList` operation](https://github.com/etcd-io/etcd/pull/15261).
|
||||
|
||||
### Package `server`
|
||||
|
||||
- Package `mvcc` was moved to `storage/mvcc`
|
||||
- Package `mvcc/backend` was moved to `storage/backend`
|
||||
- Package `mvcc/buckets` was moved to `storage/schema`
|
||||
- Package `wal` was moved to `storage/wal`
|
||||
- Package `datadir` was moved to `storage/datadir`
|
||||
|
||||
### Package `raft`
|
||||
- Send empty `MsgApp` when entry in-flight limits are exceeded. See [pull/14633](https://github.com/etcd-io/etcd/pull/14633).
|
||||
- Add [MaxInflightBytes](https://github.com/etcd-io/etcd/pull/14624) setting in `raft.Config` for better flow control of entries.
|
||||
- [Decouple raft from etcd](https://github.com/etcd-io/etcd/issues/14713). Migrated raft to a separate [repository](https://github.com/etcd-io/raft), and renamed raft module to `go.etcd.io/raft/v3`.
|
||||
|
||||
### etcd server
|
||||
|
||||
- Add [`etcd --log-format`](https://github.com/etcd-io/etcd/pull/13339) flag to support log format.
|
||||
- Add [`etcd --experimental-max-learners`](https://github.com/etcd-io/etcd/pull/13377) flag to allow configuration of learner max membership.
|
||||
- Add [`etcd --experimental-enable-lease-checkpoint-persist`](https://github.com/etcd-io/etcd/pull/13508) flag to handle upgrade from v3.5.2 clusters with this feature enabled.
|
||||
- Add [`etcdctl make-mirror --rev`](https://github.com/etcd-io/etcd/pull/13519) flag to support incremental mirror.
|
||||
- Add [`etcd --experimental-wait-cluster-ready-timeout`](https://github.com/etcd-io/etcd/pull/13525) flag to wait for cluster to be ready before serving client requests.
|
||||
- Add [v3 discovery](https://github.com/etcd-io/etcd/pull/13635) to bootstrap a new etcd cluster.
|
||||
- Add [field `storage`](https://github.com/etcd-io/etcd/pull/13772) into the response body of endpoint `/version`.
|
||||
- Add [`etcd --max-concurrent-streams`](https://github.com/etcd-io/etcd/pull/14169) flag to configure the max concurrent streams each client can open at a time, and defaults to math.MaxUint32.
|
||||
- Add [`etcd grpc-proxy --experimental-enable-grpc-logging`](https://github.com/etcd-io/etcd/pull/14266) flag to logging all grpc requests and responses.
|
||||
- Add [`etcd --experimental-compact-hash-check-enabled --experimental-compact-hash-check-time`](https://github.com/etcd-io/etcd/issues/14039) flags to support enabling reliable corruption detection on compacted revisions.
|
||||
- Add [Protection on maintenance request when auth is enabled](https://github.com/etcd-io/etcd/pull/14663).
|
||||
- Graduated [`--experimental-warning-unary-request-duration` to `--warning-unary-request-duration`](https://github.com/etcd-io/etcd/pull/14414). Note the experimental flag is deprecated and will be decommissioned in v3.7.
|
||||
- Add [field `hash_revision` into `HashKVResponse`](https://github.com/etcd-io/etcd/pull/14537).
|
||||
- Add [`etcd --experimental-snapshot-catch-up-entries`](https://github.com/etcd-io/etcd/pull/15033) flag to configure number of entries for a slow follower to catch up after compacting the the raft storage entries and defaults to 5k.
|
||||
- Decreased [`--snapshot-count` default value from 100,000 to 10,000](https://github.com/etcd-io/etcd/pull/15408)
|
||||
- Add [`etcd --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15156) to enable support for TLS 1.3.
|
||||
|
||||
### etcd grpc-proxy
|
||||
|
||||
- Add [`etcd grpc-proxy start --endpoints-auto-sync-interval`](https://github.com/etcd-io/etcd/pull/14354) flag to enable and configure interval of auto sync of endpoints with server.
|
||||
- Add [`etcd grpc-proxy start --listen-cipher-suites`](https://github.com/etcd-io/etcd/pull/14308) flag to support adding configurable cipher list.
|
||||
|
||||
### tools/benchmark
|
||||
|
||||
- [Add etcd client autoSync flag](https://github.com/etcd-io/etcd/pull/13416)
|
||||
|
||||
### Metrics, Monitoring
|
||||
|
||||
See [List of metrics](https://etcd.io/docs/latest/metrics/) for all metrics per release.
|
||||
|
||||
- Add [`etcd_disk_defrag_inflight`](https://github.com/etcd-io/etcd/pull/13371).
|
||||
- Add [`etcd_debugging_server_alarms`](https://github.com/etcd-io/etcd/pull/14276).
|
||||
|
||||
### Go
|
||||
- Require [Go 1.19+](https://github.com/etcd-io/etcd/pull/14463).
|
||||
- Compile with [Go 1.19+](https://golang.org/doc/devel/release.html#go1.19). Please refer to [gc-guide](https://go.dev/doc/gc-guide) to configure `GOGC` and `GOMEMLIMIT` properly.
|
||||
|
||||
### Other
|
||||
|
||||
- Use Distroless as base image to make the image less vulnerable and reduce image size.
|
||||
|
||||
<hr>
|
|
@ -1,44 +0,0 @@
|
|||
|
||||
|
||||
Previous change logs can be found at [CHANGELOG-3.x](https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.x.md).
|
||||
|
||||
<hr>
|
||||
|
||||
## v4.0.0 (TBD)
|
||||
|
||||
See [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0...v4.0.0) and [v4.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_4_0/) for any breaking changes.
|
||||
|
||||
**Again, before running upgrades from any previous release, please make sure to read change logs below and [v4.0 upgrade guide](https://etcd.io/docs/latest/upgrades/upgrade_4_0/).**
|
||||
|
||||
### Breaking Changes
|
||||
|
||||
- [Secure etcd by default](https://github.com/etcd-io/etcd/issues/9475)?
|
||||
- Deprecate [`etcd --proxy*`](TODO) flags; **no more v2 proxy**.
|
||||
- Deprecate [v2 storage backend](https://github.com/etcd-io/etcd/issues/9232); **no more v2 store**.
|
||||
- v2 API is still supported via [v2 emulation](TODO).
|
||||
- Deprecate [`etcdctl backup`](TODO) command.
|
||||
- `clientv3.Client.KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error)` is now [`clientv4.Client.KeepAlive(ctx context.Context, id LeaseID) <-chan *LeaseKeepAliveResponse`](TODO).
|
||||
- Similar to `Watch`, [`KeepAlive` does not return errors](https://github.com/etcd-io/etcd/issues/7488).
|
||||
- If there's an unknown server error, kill all open channels and create a new stream on the next `KeepAlive` call.
|
||||
- Rename `github.com/coreos/client` to `github.com/coreos/clientv2`.
|
||||
- [`etcd --experimental-initial-corrupt-check`](TODO) has been deprecated.
|
||||
- Use [`etcd --initial-corrupt-check`](TODO) instead.
|
||||
- [`etcd --experimental-corrupt-check-time`](TODO) has been deprecated.
|
||||
- Use [`etcd --corrupt-check-time`](TODO) instead.
|
||||
- Enable TLS 1.13, deprecate TLS cipher suites.
|
||||
|
||||
### etcd server
|
||||
|
||||
- [`etcd --initial-corrupt-check`](TODO) flag is now stable (`etcd --experimental-initial-corrupt-check` has been deprecated).
|
||||
- `etcd --initial-corrupt-check=true` by default, to check cluster database hashes before serving client/peer traffic.
|
||||
- [`etcd --corrupt-check-time`](TODO) flag is now stable (`etcd --experimental-corrupt-check-time` has been deprecated).
|
||||
- `etcd --corrupt-check-time=12h` by default, to check cluster database hashes for every 12-hour.
|
||||
- Enable TLS 1.13, deprecate TLS cipher suites.
|
||||
|
||||
### Go
|
||||
|
||||
- Require [*Go 2*](https://blog.golang.org/go2draft).
|
||||
|
||||
|
||||
<hr>
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
# Change logs
|
||||
|
||||
## Production recommendation
|
||||
|
||||
The minimum recommended etcd versions to run in **production** are v3.4.22+ and v3.5.6+. Refer to the [versioning policy](https://etcd.io/docs/v3.5/op-guide/versioning/) for more details.
|
||||
|
||||
### v3.5 data corruption issue
|
||||
|
||||
Running etcd v3.5.2, v3.5.1 and v3.5.0 under high load can cause a data corruption issue.
|
||||
If etcd process is killed, occasionally some committed transactions are not reflected on all the members.
|
||||
Recommendation is to upgrade to v3.5.4+.
|
||||
|
||||
If you have encountered data corruption, please follow instructions on https://etcd.io/docs/v3.5/op-guide/data_corruption/.
|
||||
|
||||
## Change log rules
|
||||
1. Each patch release only includes changes against previous patch release.
|
||||
For example, the change log of v3.5.5 should only include items which are new to v3.5.4.
|
||||
2. For the first release (e.g. 3.4.0, 3.5.0, 3.6.0, 4.0.0 etc.) for each minor or major
|
||||
version, it only includes changes which are new to the first release of previous minor
|
||||
or major version. For example, v3.5.0 should only include items which are new to v3.4.0,
|
||||
and v3.6.0 should only include items which are new to v3.5.0.
|
182
CONTRIBUTING.md
182
CONTRIBUTING.md
|
@ -1,121 +1,47 @@
|
|||
# How to contribute
|
||||
|
||||
etcd is Apache 2.0 licensed and accepts contributions via GitHub pull requests.
|
||||
This document outlines basics of contributing to etcd.
|
||||
etcd is Apache 2.0 licensed and accepts contributions via GitHub pull requests. This document outlines some of the conventions on commit message formatting, contact points for developers, and other resources to help get contributions into etcd.
|
||||
|
||||
# Email and chat
|
||||
|
||||
- Email: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
||||
- IRC: #[etcd](irc://irc.freenode.org:6667/#etcd) IRC channel on freenode.org
|
||||
- Slack: [#etcd](https://kubernetes.slack.com/messages/C3HD8ARJ5/details/)
|
||||
|
||||
## Getting started
|
||||
|
||||
- Fork the repository on GitHub
|
||||
- Read the README.md for build instructions
|
||||
|
||||
## Reporting bugs and creating issues
|
||||
|
||||
Reporting bugs is one of the best ways to contribute. However, a good bug report has some very specific qualities, so please read over our short document on [reporting bugs](https://etcd.io/docs/latest/reporting_bugs) before submitting a bug report. This document might contain links to known issues, another good reason to take a look there before reporting a bug.
|
||||
|
||||
## Contribution flow
|
||||
|
||||
This is a rough outline of what a contributor's workflow looks like:
|
||||
* [Find something to work on](#Find-something-to-work-on)
|
||||
* [Setup development environment](#Setup-development-environment)
|
||||
* [Implement your change](#Implement-your-change)
|
||||
* [Commit your change](#Commit-your-change)
|
||||
* [Create a pull request](#Create-a-pull-request)
|
||||
* [Get your pull request reviewed](#Get-your-pull-request-reviewed)
|
||||
|
||||
If you have any questions about, please reach out using one of the methods listed in [contact].
|
||||
- Create a topic branch from where to base the contribution. This is usually main.
|
||||
- Make commits of logical units.
|
||||
- Make sure commit messages are in the proper format (see below).
|
||||
- Push changes in a topic branch to a personal fork of the repository.
|
||||
- Submit a pull request to etcd-io/etcd.
|
||||
- The PR must receive a LGTM from two maintainers found in the MAINTAINERS file.
|
||||
|
||||
[contact]: ./README.md#Contact
|
||||
Thanks for contributing!
|
||||
|
||||
## Learn more about etcd
|
||||
### Code style
|
||||
|
||||
Before making a change please look through resources below to learn more about etcd and tools used for development.
|
||||
The coding style suggested by the Golang community is used in etcd. See the [style doc](https://github.com/golang/go/wiki/CodeReviewComments) for details.
|
||||
|
||||
* Please learn about [Git](https://github.com/git-guides) version control system used in etcd.
|
||||
* Read the [etcd learning resources](https://etcd.io/docs/v3.5/learning/)
|
||||
* Read the [etcd community membership](/Documentation/contributor-guide/community-membership.md)
|
||||
* Watch [etcd deep dive](https://www.youtube.com/watch?v=D2pm6ufIt98&t=927s)
|
||||
* Watch [etcd code walk through](https://www.youtube.com/watch?v=H3XaSF6wF7w)
|
||||
Please follow this style to make etcd easy to review, maintain and develop.
|
||||
|
||||
## Find something to work on
|
||||
### Format of the commit message
|
||||
|
||||
All the work in etcd project is tracked in [github issue tracker].
|
||||
Issues should be properly labeled making it easy to find something for you.
|
||||
We follow a rough convention for commit messages that is designed to answer two
|
||||
questions: what changed and why. The subject line should feature the what and
|
||||
the body of the commit should describe the why.
|
||||
|
||||
Depending on your interest and experience you should check different labels:
|
||||
* If you are just starting, check issues labeled with [good first issue].
|
||||
* When you feel more conformable in your contributions, checkout [help wanted].
|
||||
* Advanced contributors can try to help with issues labeled [priority/important] covering most relevant work at the time.
|
||||
|
||||
If any of aforementioned labels don't have unassigned issues, please [contact] one of the [maintainers] asking to triage more issues.
|
||||
|
||||
[github issue tracker]: https://github.com/etcd-io/etcd/issues
|
||||
[good first issue]: https://github.com/etcd-io/etcd/labels/good%20first%20issue
|
||||
[help wanted]: https://github.com/etcd-io/etcd/labels/help%20wanted
|
||||
[maintainers]: https://github.com/etcd-io/etcd/blob/main/MAINTAINERS
|
||||
[priority/important]: https://github.com/etcd-io/etcd/labels/priority%2Fimportant
|
||||
|
||||
## Setup development environment
|
||||
|
||||
The etcd project supports two options for development:
|
||||
|
||||
1. Manually setup local environment.
|
||||
2. Automatically setup [devcontainer](https://containers.dev).
|
||||
|
||||
For both options the only supported architecture is `linux-amd64`. Bug reports for other environments will generally be ignored. Supporting new environments requires introduction of proper tests and mainter support that is currently lacking in the etcd project.
|
||||
|
||||
If you would like etcd to support your preferred environment you can [file an issue].
|
||||
|
||||
### Option 1 - Manually setup local environment
|
||||
|
||||
This is the original etcd development environment, is most supported and is backwards compatible for development of older etcd versions.
|
||||
|
||||
Follow the steps below to setup the environment:
|
||||
|
||||
- [Clone the repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)
|
||||
- Install Go by following [installation](https://go.dev/doc/install). Please check minimal go version in [go.mod file](./go.mod#L3).
|
||||
- Install build tools (`make`):
|
||||
- For debian based distributions you can run `sudo apt-get install build-essential`
|
||||
- Verify that everything is installed by running `make build`
|
||||
|
||||
Note: `make build` runs with `-v`. Other build flags can be added through env `GO_BUILD_FLAGS`, **if required**. Eg.,
|
||||
```console
|
||||
GO_BUILD_FLAGS="-buildmode=pie" make build
|
||||
```
|
||||
|
||||
### Option 2 - Automatically setup devcontainer
|
||||
|
||||
This is a more recently added environmnent that aims to make it faster for new contributors to get started with etcd. This option is supported for etcd versions 3.6 onwards.
|
||||
|
||||
This option can be [used locally](https://code.visualstudio.com/docs/devcontainers/tutorial) on a system running Visual Studio Code and Docker, or in a remote cloud based [Codespaces](https://github.com/features/codespaces) environment.
|
||||
|
||||
To get started, create a codespace for this repository by clicking this 👇
|
||||
|
||||
[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=11225014)
|
||||
|
||||
A codespace will open in a web-based version of Visual Studio Code. The [dev container](.devcontainer/devcontainer.json) is fully configured with software needed for this project.
|
||||
|
||||
**Note**: Dev containers is an open spec which is supported by [GitHub Codespaces](https://github.com/codespaces) and [other tools](https://containers.dev/supporting).
|
||||
|
||||
[file an issue]: https://github.com/etcd-io/etcd/issues/new/choose
|
||||
|
||||
## Implement your change
|
||||
|
||||
etcd code should follow coding style suggested by the Golang community.
|
||||
See the [style doc](https://github.com/golang/go/wiki/CodeReviewComments) for details.
|
||||
|
||||
Please ensure that your change passes static analysis (requires [golangci-lint](https://golangci-lint.run/usage/install/)):
|
||||
- `make verify` to verify if all checks pass.
|
||||
- `make verify-*` to verify a single check, for example `make verify-bom` to verify if bill-of-materials.json file is up-to-date.
|
||||
- `make fix` to fix all checks.
|
||||
- `make fix-*` to fix a single checks, for example `make fix-bom` to update bill-of-materials.json.
|
||||
|
||||
Please ensure that your change passes tests.
|
||||
- `make test-unit` to run unit tests.
|
||||
- `make test-integration` to run integration tests.
|
||||
- `make test-e2e` to run e2e tests.
|
||||
|
||||
All changes are expected to come with unit test.
|
||||
All new features are expected to have either e2e or integration tests.
|
||||
|
||||
## Commit your change
|
||||
|
||||
etcd follows a rough convention for commit messages:
|
||||
* First line:
|
||||
* Should start name of package (for example `etcdserver`, `etcdctl`) followed by `:` character.
|
||||
* Describe the `what` behind the change
|
||||
* Optionally author might provide the `why` behind the change in the main commit message body.
|
||||
* Last line should be `Signed-off-by: firstname lastname <email@example.com>` (can be automatically generate by providing `--signoff` to git commit command).
|
||||
|
||||
Example of commit message:
|
||||
```
|
||||
etcdserver: add grpc interceptor to log info on incoming requests
|
||||
|
||||
|
@ -125,24 +51,44 @@ remote client info, request content (with value field redacted), request
|
|||
handling latency, response size, etc. Uses zap logger if available,
|
||||
otherwise uses capnslog.
|
||||
|
||||
Signed-off-by: FirstName LastName <github@github.com>
|
||||
Fixes #38
|
||||
```
|
||||
|
||||
## Create a pull request
|
||||
The format can be described more formally as follows:
|
||||
|
||||
Please follow [making a pull request](https://docs.github.com/en/get-started/quickstart/contributing-to-projects#making-a-pull-request) guide.
|
||||
```
|
||||
<package>: <what changed>
|
||||
<BLANK LINE>
|
||||
<why this change was made>
|
||||
<BLANK LINE>
|
||||
<footer>
|
||||
```
|
||||
|
||||
If you are still working on the pull request, you can convert it to draft by clicking `Convert to draft` link just below list of reviewers.
|
||||
The first line is the subject and should be no longer than 70 characters, the second
|
||||
line is always blank, and other lines should be wrapped at 80 characters. This allows
|
||||
the message to be easier to read on GitHub as well as in various git tools.
|
||||
|
||||
Multiple small PRs are preferred over single large ones (>500 lines of code).
|
||||
### Pull request across multiple files and packages
|
||||
|
||||
## Get your pull request reviewed
|
||||
If multiple files in a package are changed in a pull request for example:
|
||||
|
||||
Before requesting review please ensure that all GitHub checks were successful.
|
||||
It might happen that some unrelated tests on your PR are failing, due to their flakiness.
|
||||
In such cases please [file an issue] to deflake the problematic test and ask one of [maintainers] to rerun the tests.
|
||||
```
|
||||
etcdserver/config.go
|
||||
etcdserver/corrupt.go
|
||||
```
|
||||
|
||||
If all checks were successful feel free to reach out for review from people that were involved in the original discussion or [maintainers].
|
||||
Depending on complexity of the PR it might require between 1 and 2 maintainers to approve your change before merging.
|
||||
At the end of the review process if multiple commits exist for a single package they
|
||||
should be squashed/rebased into a single commit before being merged.
|
||||
|
||||
Thanks for contributing!
|
||||
```
|
||||
etcdserver: <what changed>
|
||||
[..]
|
||||
```
|
||||
|
||||
If a pull request spans many packages these commits should be squashed/rebased into a single
|
||||
commit using message with a more generic `*:` prefix.
|
||||
|
||||
```
|
||||
*: <what changed>
|
||||
[..]
|
||||
```
|
||||
|
|
14
Dockerfile
14
Dockerfile
|
@ -1,14 +0,0 @@
|
|||
ARG ARCH=amd64
|
||||
FROM --platform=linux/${ARCH} gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/amd64 gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/arm64 gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/ppc64le gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/s390x gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -1,4 +1,6 @@
|
|||
This directory includes etcd project internal documentation for new and existing contributors.
|
||||
# The etcd documentation
|
||||
|
||||
etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data. It enables reliable distributed coordination through distributed locking, leader elections, and write barriers. An etcd cluster is intended for high availability and permanent data storage and retrieval.
|
||||
|
||||
These documents have moved to the [etcd-io/website repo](https://github.com/etcd-io/website/), and can be viewed live at [https://etcd.io/docs/latest/](https://etcd.io/docs/latest/).
|
||||
|
||||
For user and developer documentation please go to [etcd.io](https://etcd.io/),
|
||||
which is developed in [website](https://github.com/etcd-io/website/) repo.
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
# Branch management
|
||||
|
||||
## Guide
|
||||
|
||||
* New development occurs on the [main branch][main].
|
||||
* Main branch should always have a green build!
|
||||
* Backwards-compatible bug fixes should target the main branch and subsequently be ported to stable branches.
|
||||
* Once the main branch is ready for release, it will be tagged and become the new stable branch.
|
||||
|
||||
The etcd team has adopted a *rolling release model* and supports two stable versions of etcd.
|
||||
|
||||
### Main branch
|
||||
|
||||
The `main` branch is our development branch. All new features land here first.
|
||||
|
||||
To try new and experimental features, pull `main` and play with it. Note that `main` may not be stable because new features may introduce bugs.
|
||||
|
||||
Before the release of the next stable version, feature PRs will be frozen. A [release manager](./release.md/#release-management) will be assigned to major/minor version and will lead the etcd community in test, bug-fix and documentation of the release for one to two weeks.
|
||||
|
||||
### Stable branches
|
||||
|
||||
All branches with prefix `release-` are considered _stable_ branches.
|
||||
|
||||
After every minor release ([semver.org](https://semver.org/)), we will have a new stable branch for that release, managed by a [patch release manager](./release.md/#release-management). We will keep fixing the backwards-compatible bugs for the latest two stable releases. A _patch_ release to each supported release branch, incorporating any bug fixes, will be once every two weeks, given any patches.
|
||||
|
||||
[main]: https://github.com/etcd-io/etcd/tree/main
|
||||
|
|
@ -1,168 +0,0 @@
|
|||
# Community membership
|
||||
|
||||
This doc outlines the various responsibilities of contributor roles in etcd.
|
||||
|
||||
| Role | Responsibilities | Requirements | Defined by |
|
||||
|------------|----------------------------------------------|---------------------------------------------------------------|--------------------------------------|
|
||||
| Member | Active contributor in the community | Sponsored by 2 reviewers and multiple contributions | etcd GitHub org member |
|
||||
| Reviewer | Review contributions from other members | History of review and authorship | [MAINTAINERS] file reviewer entry |
|
||||
| Maintainer | Set direction and priorities for the project | Demonstrated responsibility and excellent technical judgement | [MAINTAINERS] file maintainers entry |
|
||||
|
||||
## New contributors
|
||||
|
||||
New contributors should be welcomed to the community by existing members,
|
||||
helped with PR workflow, and directed to relevant documentation and
|
||||
communication channels.
|
||||
|
||||
## Established community members
|
||||
|
||||
Established community members are expected to demonstrate their adherence to the
|
||||
principles in this document, familiarity with project organization, roles,
|
||||
policies, procedures, conventions, etc., and technical and/or writing ability.
|
||||
Role-specific expectations, responsibilities, and requirements are enumerated
|
||||
below.
|
||||
|
||||
## Member
|
||||
|
||||
Members are continuously active contributors in the community. They can have
|
||||
issues and PRs assigned to them. Members are expected to remain active
|
||||
contributors to the community.
|
||||
|
||||
**Defined by:** Member of the etcd GitHub organization.
|
||||
|
||||
### Requirements
|
||||
|
||||
- Enabled [two-factor authentication] on their GitHub account
|
||||
- Have made multiple contributions to the project or community. Contribution may include, but is not limited to:
|
||||
- Authoring or reviewing PRs on GitHub. At least one PR must be **merged**.
|
||||
- Filing or commenting on issues on GitHub
|
||||
- Contributing to community discussions (e.g. meetings, Slack, email discussion
|
||||
forums, Stack Overflow)
|
||||
- Subscribed to [etcd-dev@googlegroups.com]
|
||||
- Have read the [contributor guide]
|
||||
- Sponsored by one active maintainer or two reviewers.
|
||||
- Sponsors must be from multiple member companies to demonstrate integration across community.
|
||||
- With no objections from other maintainers
|
||||
- Open a [membership nomination] issue against the etcd-io/etcd repo
|
||||
- Ensure your sponsors are @mentioned on the issue
|
||||
- Make sure that the list of contributions included is representative of your work on the project.
|
||||
- Members can be removed by a supermajority of the maintainers or can resign by notifying
|
||||
the maintainers.
|
||||
|
||||
### Responsibilities and privileges
|
||||
|
||||
- Responsive to issues and PRs assigned to them
|
||||
- Granted "triage access" to etcd project
|
||||
- Active owner of code they have contributed (unless ownership is explicitly transferred)
|
||||
- Code is well tested
|
||||
- Tests consistently pass
|
||||
- Addresses bugs or issues discovered after code is accepted
|
||||
|
||||
**Note:** members who frequently contribute code are expected to proactively
|
||||
perform code reviews and work towards becoming a *reviewer*.
|
||||
|
||||
## Reviewers
|
||||
|
||||
Reviewers are contributors who have demonstrated greater skill in
|
||||
reviewing the code from other contributors. They are knowledgeable about both
|
||||
the codebase and software engineering principles. Their LGTM counts towards
|
||||
merging a code change into the project. A reviewer is generally on the ladder towards
|
||||
maintainership.
|
||||
|
||||
**Defined by:** *reviewers* entry in the [MAINTAINERS] file.
|
||||
|
||||
### Requirements
|
||||
|
||||
- member for at least 3 months.
|
||||
- Primary reviewer for at least 5 PRs to the codebase.
|
||||
- Reviewed or contributed at least 20 substantial PRs to the codebase.
|
||||
- Knowledgeable about the codebase.
|
||||
- Sponsored by two active maintainers.
|
||||
- Sponsors must be from multiple member companies to demonstrate integration across community.
|
||||
- With no objections from other maintainers
|
||||
- Reviewers can be removed by a supermajority of the maintainers or can resign by notifying
|
||||
the maintainers.
|
||||
|
||||
### Responsibilities and privileges
|
||||
|
||||
- Code reviewer status may be a precondition to accepting large code contributions
|
||||
- Responsible for project quality control via code reviews
|
||||
- Focus on code quality and correctness, including testing and factoring
|
||||
- May also review for more holistic issues, but not a requirement
|
||||
- Expected to be responsive to review requests
|
||||
- Assigned PRs to review related to area of expertise
|
||||
- Assigned test bugs related to area of expertise
|
||||
- Granted "triage access" to etcd project
|
||||
|
||||
## Maintainers
|
||||
|
||||
Maintainers are first and foremost contributors that have shown they
|
||||
are committed to the long term success of a project. Maintainership is about building
|
||||
trust with the current maintainers and being a person that they can
|
||||
depend on to make decisions in the best interest of the project in a consistent manner.
|
||||
|
||||
**Defined by:** *maintainers* entry in the [MAINTAINERS] file.
|
||||
|
||||
### Requirements
|
||||
|
||||
- Deep understanding of the technical goals and direction of the project
|
||||
- Deep understanding of the technical domain of the project
|
||||
- Sustained contributions to design and direction by doing all of:
|
||||
- Authoring and reviewing proposals
|
||||
- Initiating, contributing and resolving discussions (emails, GitHub issues, meetings)
|
||||
- Identifying subtle or complex issues in designs and implementation PRs
|
||||
- Directly contributed to the project through implementation and / or review
|
||||
- Sponsored by two active maintainers and elected by supermajority
|
||||
- Sponsors must be from multiple member companies to demonstrate integration across community.
|
||||
- To become a maintainer send an email with your candidacy to [etcd-maintainers-private@googlegroups.com]
|
||||
- Ensure your sponsors are @mentioned on the email
|
||||
- Include a list of contributions representative of your work on the project.
|
||||
- Existing maintainers vote will privately and respond to the email with either acceptance or with feedback for suggested improvement.
|
||||
- With your membership approved you are expected to:
|
||||
- Open a PR and add an entry to the [MAINTAINERS] file
|
||||
- Subscribe to [etcd-maintainers@googlegroups.com] and [etcd-maintainers-private@googlegroups.com]
|
||||
- Request to join to [etcd-maintainer teams of etcd organization of GitHub](https://github.com/orgs/etcd-io/teams/maintainers-etcd)
|
||||
- Request to join to the private slack channel for etcd maintainers on [kubernetes slack](http://slack.kubernetes.io/)
|
||||
- Request access to etcd-development GCP project where we publish releases
|
||||
- Request access to passwords shared between maintainers
|
||||
|
||||
### Responsibilities and privileges
|
||||
|
||||
- Make and approve technical design decisions
|
||||
- Set technical direction and priorities
|
||||
- Define milestones and releases
|
||||
- Mentor and guide reviewers, and contributors to the project.
|
||||
- Participate when called upon in the [security disclosure and release process]
|
||||
- Ensure continued health of the project
|
||||
- Adequate test coverage to confidently release
|
||||
- Tests are passing reliably (i.e. not flaky) and are fixed when they fail
|
||||
- Ensure a healthy process for discussion and decision making is in place.
|
||||
- Work with other maintainers to maintain the project's overall health and success holistically
|
||||
|
||||
### Retiring
|
||||
|
||||
Life priorities, interests, and passions can change. Maintainers can retire and
|
||||
move to [emeritus maintainers]. If a maintainer needs to step down, they should
|
||||
inform other maintainers, if possible, help find someone to pick up the related
|
||||
work. At the very least, ensure the related work can be continued. Afterward
|
||||
they can remove themselves from list of existing maintainers.
|
||||
|
||||
If a maintainer has not been performing their duties for period of 12 months,
|
||||
they can be removed by other maintainers. In that case inactive maintainer will
|
||||
be first notified via an email. If situation doesn't improve, they will be
|
||||
removed. If an emeritus maintainer wants to regain an active role, they can do
|
||||
so by renewing their contributions. Active maintainers should welcome such a move.
|
||||
Retiring of other maintainers or regaining the status should require approval
|
||||
of at least two active maintainers.
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
Contributor roles and responsibilities were written based on [Kubernetes community membership]
|
||||
|
||||
[MAINTAINERS]: /MAINTAINERS
|
||||
[contributor guide]: /CONTRIBUTING.md
|
||||
[membership nomination]:https://github.com/etcd-io/etcd/issues/new?assignees=&labels=area%2Fcommunity&template=membership-request.yml
|
||||
[Kubernetes community membership]: https://github.com/kubernetes/community/blob/master/community-membership.md
|
||||
[emeritus maintainers]: /README.md#etcd-emeritus-maintainers
|
||||
[security disclosure and release process]: /security/README.md
|
||||
[two-factor authentication]: https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/about-two-factor-authentication
|
|
@ -1,102 +0,0 @@
|
|||
Dependency management
|
||||
======
|
||||
|
||||
# Table of Contents
|
||||
- **[Main branch](#main-branch)**
|
||||
- [Dependencies used in workflows](#dependencies-used-in-workflows)
|
||||
- [Bumping order](#bumping-order)
|
||||
- [Steps to bump a dependency](#steps-to-bump-a-dependency)
|
||||
- [Indirect dependencies](#indirect-dependencies)
|
||||
- [About gRPC](#about-grpc)
|
||||
- [Rotation worksheet](#rotation-worksheet)
|
||||
- **[Stable branches](#stable-branches)**
|
||||
|
||||
# Main branch
|
||||
|
||||
The dependabot is enabled & [configured](https://github.com/etcd-io/etcd/blob/main/.github/dependabot.yml) to
|
||||
manage dependencies for etcd `main` branch. But dependabot doesn't work well for multi-module repository like `etcd`,
|
||||
see [dependabot-core/issues/6678](https://github.com/dependabot/dependabot-core/issues/6678).
|
||||
Usually human intervention is required each time when dependabot automatically opens some PRs to bump dependencies.
|
||||
Please see guidance below.
|
||||
|
||||
## Dependencies used in workflows
|
||||
The PRs which automatically bump dependencies (see examples below) used in workflows are fine, and can be approved & merged directly as long as all checks are successful.
|
||||
- [build(deps): bump github/codeql-action from 2.2.11 to 2.2.12](https://github.com/etcd-io/etcd/pull/15736)
|
||||
- [build(deps): bump actions/checkout from 3.5.0 to 3.5.2](https://github.com/etcd-io/etcd/pull/15735)
|
||||
- [build(deps): bump ossf/scorecard-action from 2.1.2 to 2.1.3](https://github.com/etcd-io/etcd/pull/15607)
|
||||
|
||||
## Bumping order
|
||||
When multiple etcd modules depend on the same package, please bump the package version for all the modules in the correct order. The rule is simple:
|
||||
if module A depends on module B, then bump the dependency for module B before module A. If the two modules do not depend on each other, then
|
||||
it doesn't matter to bump which module first. For example, multiple modules depend on `github.com/spf13/cobra`, we need to bump the dependency
|
||||
in the following order,
|
||||
- go.etcd.io/etcd/pkg/v3
|
||||
- go.etcd.io/etcd/server/v3
|
||||
- go.etcd.io/etcd/etcdctl/v3
|
||||
- go.etcd.io/etcd/etcdutl/v3
|
||||
- go.etcd.io/etcd/tests/v3
|
||||
- go.etcd.io/etcd/v3
|
||||
- go.etcd.io/etcd/tools/v3
|
||||
For more details about etcd Golang modules, please check https://etcd.io/docs/next/dev-internal/modules/
|
||||
|
||||
Note the module `go.etcd.io/etcd/tools/v3` doesn't depend on any other modules, nor by any other modules, so it doesn't matter when to bump dependencies for it.
|
||||
|
||||
## Steps to bump a dependency
|
||||
Use the `github.com/spf13/cobra` as an example, follow steps below to bump it from 1.6.1 to 1.7.0 for module `go.etcd.io/etcd/etcdctl/v3`,
|
||||
```
|
||||
$ cd ${ETCD_ROOT_DIR}/etcdctl
|
||||
$ go get github.com/spf13/cobra@v1.7.0
|
||||
$ go mod tidy
|
||||
$ cd ..
|
||||
$ ./scripts/fix.sh
|
||||
```
|
||||
|
||||
Execute the same steps for all other modules. When you finish bumping the dependency for all modules, then commit the change,
|
||||
```
|
||||
$ git add .
|
||||
$ git commit --signoff -m "dependency: bump github.com/spf13/cobra from 1.6.1 to 1.7.0"
|
||||
```
|
||||
|
||||
Please close the related PRs which were automatically opened by dependabot.
|
||||
|
||||
When you bump multiple dependencies in one PR, it's recommended to create a separate commit for each dependency. But it isn't a must; for example,
|
||||
you can get all dependencies bumping for the module `go.etcd.io/etcd/tools/v3` included in one commit.
|
||||
|
||||
## Indirect dependencies
|
||||
Usually we don't bump a dependency if all modules just indirectly depend on it, such as `github.com/go-logr/logr`.
|
||||
|
||||
If an indirect dependency (e.g. `D1`) causes any CVE or bugs which affect etcd, usually the module (e.g. `M1`, not part of etcd, but used by etcd)
|
||||
which depends on it should bump the dependency (`D1`), and then etcd just needs to bump `M1`. However, if the module (`M1`) somehow doesn't
|
||||
bump the problematic dependency, then etcd can still bump it (`D1`) directly following the same steps above. But as a long-term solution, etcd should
|
||||
try to remove the dependency on such module (`M1`) that lack maintenance.
|
||||
|
||||
For mixed cases, in which some modules directly while others indirectly depend on a dependency, we have multiple options,
|
||||
- Bump the dependency for all modules, no matter it's direct or indirect dependency.
|
||||
- Bump the dependency only for modules which directly depend on it.
|
||||
|
||||
We should try to follow the first way, and temporarily fall back to the second one if we run into any issue on the first way. Eventually we
|
||||
should fix the issue and ensure all modules depend on the same version of the dependency.
|
||||
|
||||
## Known incompatible dependency updates
|
||||
|
||||
### arduino/setup-protoc
|
||||
Please refer to [build(deps): bump arduino/setup-protoc from 1.3.0 to 2.0.0](https://github.com/etcd-io/etcd/pull/16016)
|
||||
|
||||
### About gRPC
|
||||
There is a compatible issue between etcd and gRPC 1.52.0, and there is a pending PR [pull/15131](https://github.com/etcd-io/etcd/pull/15131).
|
||||
|
||||
The plan is to remove the dependency on some grpc-go's experimental API firstly, afterwards try to bump it again. Please get more details in
|
||||
[issues/15145](https://github.com/etcd-io/etcd/issues/15145).
|
||||
|
||||
`go.opentelemetry.io/otel` version update is indirectly blocked due to this gRPC issue. Please get more details in [pull/15810](https://github.com/etcd-io/etcd/pull/15810).
|
||||
|
||||
## Rotation worksheet
|
||||
The dependabot scheduling interval is weekly; it means dependabot will automatically raise a bunch of PRs per week.
|
||||
Usually human intervention is required each time. We have a [rotation worksheet](https://docs.google.com/spreadsheets/d/1DDWzbcOx1p32MhyelaPZ_SfYtAD6xRsrtGRZ9QXPOyQ/edit#gid=0),
|
||||
and everyone is welcome to participate; you just need to register your name in the worksheet.
|
||||
|
||||
# Stable branches
|
||||
Usually we don't proactively bump dependencies for stable releases unless there are any CVEs or bugs that affect etcd.
|
||||
|
||||
If we have to do it, then follow the same guidance above. Note that there is no `./scripts/fix.sh` in release-3.4, so no need to
|
||||
execute it for 3.4.
|
|
@ -1,83 +0,0 @@
|
|||
# Features
|
||||
|
||||
This document provides an overview of etcd features and general development guidelines for adding and deprecating them. The project maintainers can override these guidelines per the need of the project following the project governance.
|
||||
|
||||
## Overview
|
||||
|
||||
The etcd features fall into three stages, experimental, stable, and unsafe.
|
||||
|
||||
### Experimental
|
||||
|
||||
Any new feature is usually added as an experimental feature. An experimental feature is characterized as below:
|
||||
- Might be buggy due to a lack of user testing. Enabling the feature may not work as expected.
|
||||
- Disabled by default when added initially.
|
||||
- Support for such a feature may be dropped at any time without notice
|
||||
- Feature related issues may be given lower priorities.
|
||||
- It can be removed in the next minor or major release without following the feature deprecation policy unless it graduates to the stable future.
|
||||
|
||||
### Stable
|
||||
|
||||
A stable feature is characterized as below:
|
||||
- Supported as part of the supported releases of etcd.
|
||||
- May be enabled by default.
|
||||
- Discontinuation of support must follow the feature deprecation policy.
|
||||
|
||||
### Unsafe
|
||||
|
||||
Unsafe features are rare and listed under the `Unsafe feature:` section in the etcd usage documentation. By default, they are disabled. They should be used with caution following documentation. An unsafe feature can be removed in the next minor or major release without following feature deprecation policy.
|
||||
|
||||
## Development Guidelines
|
||||
|
||||
### Adding a new feature
|
||||
|
||||
Any new enhancements to the etcd are typically added as an experimental feature. The general development requirements are listed below. They can be somewhat flexible depending on the scope of the feature and review discussions, and will evolve over time.
|
||||
- Open an issue
|
||||
- It must provide a clear need for the proposed feature.
|
||||
- It should list development work items as checkboxes. There must be one work item towards future graduation to the stable future.
|
||||
- Label the issue with `type/feature` and `experimental`.
|
||||
- Keep the issue open for tracking purpose until a decision is made on graduation.
|
||||
- Open a Pull Request (PR)
|
||||
- Provide unit tests. Integreation tests are also recommended as possible.
|
||||
- Provide robust e2e test coverage. If the feature being added is complicated or quickly needed, maintainers can decide to go with e2e tests for basic coverage initially and have robust coverage added at the later time before feature graduation to the stable feature.
|
||||
- Provide logs for proper debugging.
|
||||
- Provide metrics and benchmarks as needed.
|
||||
- The Feature should be disabled by default.
|
||||
- Any configuration flags related to the implementation of the feature must be prefixed with `experimental` e.g. `--experimental-feature-name`.
|
||||
- Add a CHANGELOG entry.
|
||||
- At least two maintainers must approve feature requirements and related code changes.
|
||||
|
||||
### Graduating an Experimental feature to Stable
|
||||
|
||||
It is important that experimental features don't get stuck in that stage. They should be revisited and moved to the stable stage following the graduation steps as described here.
|
||||
|
||||
#### Locate graduation candidate
|
||||
Decide if an experimental feature is ready for graduation to the stable stage.
|
||||
- Find the issue that was used to enable the experimental feature initially. One way to find such issues is to search for issues with `type/feature` and `experimental` labels.
|
||||
- Fix any known open issues against the feature.
|
||||
- Make sure the feature was enabled for at least one previous release. Check the PR(s) reference from the issue to see when the feature related code changes were merged.
|
||||
|
||||
#### Provide implementation
|
||||
If an experimental feature is found ready for graduation to the stable stage, open a Pull Request (PR) with the following changes.
|
||||
- Add robust e2e tests if not already provided.
|
||||
- Add a new stable feature flag identical to the experimental feature flag but without the `--experimental` prefix.
|
||||
- Deprecate the experimental feature following the [feature deprecation policy](#Deprecating-a-feature).
|
||||
- Implementation must ensure that both the graduated and deprecated experimental feature flags work as expected. Note that both these flags will co-exist for the timeframe described in the feature deprecation policy.
|
||||
- Enable the graduated feature by default if needed.
|
||||
|
||||
At least two maintainers must approve the work. Patch releases should not be considered for graduation.
|
||||
|
||||
### Deprecating a feature
|
||||
|
||||
#### Experimental
|
||||
An experimental feature deprecates when it graduates to the stable stage.
|
||||
- Add a deprecation message in the documentation of the experimental feature with a recommendation to use related stable feature. e.g. `DEPRECATED. Use <feature-name> instead.`
|
||||
- Add a `deprecated` label in the issue that was initially used to enable the experimental feature.
|
||||
|
||||
#### Stable
|
||||
As the project evolves, a stable feature may sometimes need to be deprecated and removed. Such a situation should be handled using the steps below:
|
||||
- Create an issue for tracking purpose.
|
||||
- Add a deprecation message in the feature usage documentation before a planned release for feature deprecation. e.g. `To be deprecated in <release>.`. If a new feature replaces the `To be deprecated` feature, then also provide a message saying so. e.g. `Use <feature-name> instead.`.
|
||||
- Deprecate the feature in the planned release with a message as part of the feature usage documentation. e.g. `DEPRECATED`. If a new feature replaces the deprecated feature, then also provide a message saying so. e.g. `DEPRECATED. Use <feature-name> instead.`.
|
||||
- Add a `deprecated` label in the related issue.
|
||||
|
||||
Remove the deprecated feature in the following release. Close any related issue(s). At least two maintainers must approve the work. Patch releases should not be considered for deprecation.
|
|
@ -1,150 +0,0 @@
|
|||
# Set up local cluster
|
||||
|
||||
For testing and development deployments, the quickest and easiest way is to configure a local cluster. For a production deployment, refer to the [clustering][clustering] section.
|
||||
|
||||
## Local standalone cluster
|
||||
|
||||
### Starting a cluster
|
||||
|
||||
Run the following to deploy an etcd cluster as a standalone cluster:
|
||||
|
||||
```
|
||||
$ ./etcd
|
||||
...
|
||||
```
|
||||
|
||||
If the `etcd` binary is not present in the current working directory, it might be located either at `$GOPATH/bin/etcd` or at `/usr/local/bin/etcd`. Run the command appropriately.
|
||||
|
||||
The running etcd member listens on `localhost:2379` for client requests.
|
||||
|
||||
### Interacting with the cluster
|
||||
|
||||
Use `etcdctl` to interact with the running cluster:
|
||||
|
||||
1. Store an example key-value pair in the cluster:
|
||||
|
||||
```
|
||||
$ ./etcdctl put foo bar
|
||||
OK
|
||||
```
|
||||
|
||||
If OK is printed, storing key-value pair is successful.
|
||||
|
||||
2. Retrieve the value of `foo`:
|
||||
|
||||
```
|
||||
$ ./etcdctl get foo
|
||||
bar
|
||||
```
|
||||
|
||||
If `bar` is returned, interaction with the etcd cluster is working as expected.
|
||||
|
||||
## Local multi-member cluster
|
||||
|
||||
### Starting a cluster
|
||||
|
||||
A `Procfile` at the base of the etcd git repository is provided to easily configure a local multi-member cluster. To start a multi-member cluster, navigate to the root of the etcd source tree and perform the following:
|
||||
|
||||
1. Install `goreman` to control Procfile-based applications:
|
||||
|
||||
```
|
||||
$ go install github.com/mattn/goreman@latest
|
||||
```
|
||||
The installation will place executables in the $GOPATH/bin. If $GOPATH environment variable is not set, the tool will be installed into the $HOME/go/bin. Make sure that $PATH is set accordingly in your environment.
|
||||
|
||||
2. Start a cluster with `goreman` using etcd's stock Procfile:
|
||||
|
||||
```
|
||||
$ goreman -f Procfile start
|
||||
```
|
||||
|
||||
The members start running. They listen on `localhost:2379`, `localhost:22379`, and `localhost:32379` respectively for client requests.
|
||||
|
||||
### Interacting with the cluster
|
||||
|
||||
Use `etcdctl` to interact with the running cluster:
|
||||
|
||||
1. Print the list of members:
|
||||
|
||||
```
|
||||
$ etcdctl --write-out=table --endpoints=localhost:2379 member list
|
||||
```
|
||||
The list of etcd members are displayed as follows:
|
||||
|
||||
```
|
||||
+------------------+---------+--------+------------------------+------------------------+
|
||||
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS |
|
||||
+------------------+---------+--------+------------------------+------------------------+
|
||||
| 8211f1d0f64f3269 | started | infra1 | http://127.0.0.1:2380 | http://127.0.0.1:2379 |
|
||||
| 91bc3c398fb3c146 | started | infra2 | http://127.0.0.1:22380 | http://127.0.0.1:22379 |
|
||||
| fd422379fda50e48 | started | infra3 | http://127.0.0.1:32380 | http://127.0.0.1:32379 |
|
||||
+------------------+---------+--------+------------------------+------------------------+
|
||||
```
|
||||
|
||||
2. Store an example key-value pair in the cluster:
|
||||
|
||||
```
|
||||
$ etcdctl put foo bar
|
||||
OK
|
||||
```
|
||||
|
||||
If OK is printed, storing key-value pair is successful.
|
||||
|
||||
### Testing fault tolerance
|
||||
|
||||
To exercise etcd's fault tolerance, kill a member and attempt to retrieve the key.
|
||||
|
||||
1. Identify the process name of the member to be stopped.
|
||||
|
||||
The `Procfile` lists the properties of the multi-member cluster. For example, consider the member with the process name, `etcd2`.
|
||||
|
||||
2. Stop the member:
|
||||
|
||||
```
|
||||
# kill etcd2
|
||||
$ goreman run stop etcd2
|
||||
```
|
||||
|
||||
3. Store a key:
|
||||
|
||||
```
|
||||
$ etcdctl put key hello
|
||||
OK
|
||||
```
|
||||
|
||||
4. Retrieve the key that is stored in the previous step:
|
||||
|
||||
```
|
||||
$ etcdctl get key
|
||||
hello
|
||||
```
|
||||
|
||||
5. Retrieve a key from the stopped member:
|
||||
|
||||
```
|
||||
$ etcdctl --endpoints=localhost:22379 get key
|
||||
```
|
||||
|
||||
The command should display an error caused by connection failure:
|
||||
|
||||
```
|
||||
2017/06/18 23:07:35 grpc: Conn.resetTransport failed to create client transport: connection error: desc = "transport: dial tcp 127.0.0.1:22379: getsockopt: connection refused"; Reconnecting to "localhost:22379"
|
||||
Error: grpc: timed out trying to connect
|
||||
```
|
||||
6. Restart the stopped member:
|
||||
|
||||
```
|
||||
$ goreman run restart etcd2
|
||||
```
|
||||
|
||||
7. Get the key from the restarted member:
|
||||
|
||||
```
|
||||
$ etcdctl --endpoints=localhost:22379 get key
|
||||
hello
|
||||
```
|
||||
|
||||
Restarting the member re-establish the connection. `etcdctl` will now be able to retrieve the key successfully. To learn more about interacting with etcd, read [interacting with etcd section][interacting].
|
||||
|
||||
[clustering]: https://etcd.io/docs/latest/op-guide/clustering/
|
||||
[interacting]: https://etcd.io/docs/latest/dev-guide/interacting_v3/
|
|
@ -1,33 +0,0 @@
|
|||
# Logging Conventions
|
||||
|
||||
etcd uses the [zap][zap] library for logging application output categorized into *levels*. A log message's level is determined according to these conventions:
|
||||
|
||||
* Debug: Everything is still fine, but even common operations may be logged, and less helpful but more quantity of notices. Usually not used in production.
|
||||
* Examples:
|
||||
* Send a normal message to a remote peer
|
||||
* Write a log entry to disk
|
||||
|
||||
* Info: Normal, working log information, everything is fine, but helpful notices for auditing or common operations. Should rather not be logged more frequently than once per a few seconds in normal server's operation.
|
||||
* Examples:
|
||||
* Startup configuration
|
||||
* Start to do snapshot
|
||||
|
||||
* Warning: (Hopefully) Temporary conditions that may cause errors, but may work fine. A replica disappearing (that may reconnect) is a warning.
|
||||
* Examples:
|
||||
* Failure to send raft message to a remote peer
|
||||
* Failure to receive heartbeat message within the configured election timeout
|
||||
|
||||
* Error: Data has been lost, a request has failed for a bad reason, or a required resource has been lost.
|
||||
* Examples:
|
||||
* Failure to allocate disk space for WAL
|
||||
|
||||
* Panic: Unrecoverable or unexpected error situation that requires stopping execution.
|
||||
* Examples:
|
||||
* Failure to create the database
|
||||
|
||||
* Fatal: Unrecoverable or unexpected error situation that requires immediate exit. Mostly used in the test.
|
||||
* Examples:
|
||||
* Failure to find the data directory
|
||||
* Failure to run a test function
|
||||
|
||||
[zap]: https://github.com/uber-go/zap
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 129 KiB |
|
@ -1,91 +0,0 @@
|
|||
# Golang modules
|
||||
|
||||
The etcd project (since version 3.5) is organized into multiple
|
||||
[golang modules](https://golang.org/ref/mod) hosted in a [single repository](https://golang.org/ref/mod#vcs-dir).
|
||||
|
||||
![modules graph](modules.svg)
|
||||
|
||||
There are following modules:
|
||||
|
||||
- **go.etcd.io/etcd/api/v3** - contains API definitions
|
||||
(like protos & proto-generated libraries) that defines communication protocol
|
||||
between etcd clients and server.
|
||||
|
||||
- **go.etcd.io/etcd/pkg/v3** - collection of utility packages used by etcd
|
||||
without being specific to etcd itself. A package belongs here
|
||||
only if it could possibly be moved out into its own repository in the future.
|
||||
Please avoid adding here code that has a lot of dependencies on its own, as
|
||||
they automatically becoming dependencies of the client library
|
||||
(that we want to keep lightweight).
|
||||
|
||||
- **go.etcd.io/etcd/client/v3** - client library used to contact etcd over
|
||||
the network (grpc). Recommended for all new usage of etcd.
|
||||
|
||||
- **go.etcd.io/raft/v3** - implementation of distributed consensus
|
||||
protocol. Should have no etcd specific code. Hosted in a separate repository:
|
||||
https://github.com/etcd-io/raft.
|
||||
|
||||
- **go.etcd.io/etcd/server/v3** - etcd implementation.
|
||||
The code in this package is etcd internal and should not be consumed
|
||||
by external projects. The package layout and API can change within the minor versions.
|
||||
|
||||
- **go.etcd.io/etcd/etcdctl/v3** - a command line tool to access and manage etcd.
|
||||
|
||||
- **go.etcd.io/etcd/tests/v3** - a module that contains all integration tests of etcd.
|
||||
Notice: All unit-tests (fast and not requiring cross-module dependencies)
|
||||
should be kept in the local modules to the code under the test.
|
||||
|
||||
- **go.etcd.io/bbolt** - implementation of persistent b-tree.
|
||||
Hosted in a separate repository: https://github.com/etcd-io/bbolt.
|
||||
|
||||
|
||||
### Operations
|
||||
|
||||
1. All etcd modules should be released in the same versions, e.g.
|
||||
`go.etcd.io/etcd/client/v3@v3.5.10` must depend on `go.etcd.io/etcd/api/v3@v3.5.10`.
|
||||
|
||||
The consistent updating of versions can by performed using:
|
||||
```shell script
|
||||
% DRY_RUN=false TARGET_VERSION="v3.5.10" ./scripts/release_mod.sh update_versions
|
||||
```
|
||||
2. The released modules should be tagged according to https://golang.org/ref/mod#vcs-version rules,
|
||||
i.e. each module should get its own tag.
|
||||
The tagging can be performed using:
|
||||
```shell script
|
||||
% DRY_RUN=false REMOTE_REPO="origin" ./scripts/release_mod.sh push_mod_tags
|
||||
```
|
||||
|
||||
3. All etcd modules should depend on the same versions of underlying dependencies.
|
||||
This can be verified using:
|
||||
```shell script
|
||||
% PASSES="dep" ./test.sh
|
||||
```
|
||||
|
||||
4. The go.mod files must not contain dependencies not being used and must
|
||||
conform to `go mod tidy` format.
|
||||
This is being verified by:
|
||||
```
|
||||
% PASSES="mod_tidy" ./test.sh
|
||||
```
|
||||
|
||||
5. To trigger actions across all modules (e.g. auto-format all files), please
|
||||
use/expand the following script:
|
||||
```shell script
|
||||
% ./scripts/fix.sh
|
||||
```
|
||||
|
||||
### Future
|
||||
|
||||
As a North Star, we would like to evaluate etcd modules towards following model:
|
||||
|
||||
![modules graph](modules-future.svg)
|
||||
|
||||
This assumes:
|
||||
- Splitting etcdmigrate/etcdadm out of etcdctl binary.
|
||||
Thanks to this etcdctl would become clearly a command-line wrapper
|
||||
around network client API,
|
||||
while etcdmigrate/etcdadm would support direct physical operations on the
|
||||
etcd storage files.
|
||||
- Splitting etcd-proxy out of ./etcd binary, as it contains more experimental code
|
||||
so carries additional risk & dependencies.
|
||||
- Deprecation of support for v2 protocol.
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 112 KiB |
|
@ -1,75 +0,0 @@
|
|||
# Release
|
||||
|
||||
The guide talks about how to release a new version of etcd.
|
||||
|
||||
The procedure includes some manual steps for sanity checking, but it can probably be further scripted. Please keep this document up-to-date if making changes to the release process.
|
||||
|
||||
## Release management
|
||||
|
||||
etcd community members are assigned to manage the release each etcd major/minor version as well as manage patches
|
||||
and to each stable release branch. The managers are responsible for communicating the timelines and status of each
|
||||
release and for ensuring the stability of the release branch.
|
||||
|
||||
| Releases | Manager |
|
||||
|------------------------|-------------------------------------------------------------|
|
||||
| 3.4 patch (post 3.4.0) | Benjamin Wang [@ahrtr](https://github.com/ahrtr) |
|
||||
| 3.5 patch (post 3.5.0) | Marek Siarkowicz [@serathius](https://github.com/serathius) |
|
||||
|
||||
All releases version numbers follow the format of [semantic versioning 2.0.0](http://semver.org/).
|
||||
|
||||
### Major, minor version release, or its pre-release
|
||||
|
||||
- Ensure the relevant milestone on GitHub is complete. All referenced issues should be closed, or moved elsewhere.
|
||||
- Ensure the latest upgrade documentation is available.
|
||||
- Bump [hardcoded MinClusterVerion in the repository](https://github.com/etcd-io/etcd/blob/v3.4.15/version/version.go#L29), if necessary.
|
||||
- Add feature capability maps for the new version, if necessary.
|
||||
|
||||
### Patch version release
|
||||
|
||||
- To request a backport, devlopers submit cherrypick PRs targeting the release branch. The commits should not include merge commits. The commits should be restricted to bug fixes and security patches.
|
||||
- The cherrypick PRs should target the appropriate release branch (`base:release-<major>-<minor>`). `hack/patch/cherrypick.sh` may be used to automatically generate cherrypick PRs.
|
||||
- The release patch manager reviews the cherrypick PRs. Please discuss carefully what is backported to the patch release. Each patch release should be strictly better than it's predecessor.
|
||||
- The release patch manager will cherry-pick these commits starting from the oldest one into stable branch.
|
||||
|
||||
## Write release note
|
||||
|
||||
- Write introduction for the new release. For example, what major bug we fix, what new features we introduce or what performance improvement we make.
|
||||
- Put `[GH XXXX]` at the head of change line to reference Pull Request that introduces the change. Moreover, add a link on it to jump to the Pull Request.
|
||||
- Find PRs with `release-note` label and explain them in `NEWS` file, as a straightforward summary of changes for end-users.
|
||||
|
||||
## Build and push the release artifacts
|
||||
|
||||
- Ensure `docker` is available.
|
||||
|
||||
Run release script in root directory:
|
||||
|
||||
```
|
||||
DRY_RUN=false ./scripts/release.sh ${VERSION}
|
||||
```
|
||||
|
||||
It generates all release binaries and images under directory ./release.
|
||||
Binaries are pushed to gcr.io and images are pushed to quay.io and gcr.io.
|
||||
|
||||
## Publish release page in GitHub
|
||||
|
||||
- Set release title as the version name.
|
||||
- Follow the format of previous release pages.
|
||||
- Attach the generated binaries and signatures.
|
||||
- Select whether it is a pre-release.
|
||||
- Publish the release!
|
||||
|
||||
## Announce to the etcd-dev Googlegroup
|
||||
|
||||
- Follow the format of [previous release emails](https://groups.google.com/forum/#!forum/etcd-dev).
|
||||
- Make sure to include a list of authors that contributed since the previous release - something like the following might be handy:
|
||||
|
||||
```
|
||||
git log ...${PREV_VERSION} --pretty=format:"%an" | sort | uniq | tr '\n' ',' | sed -e 's#,#, #g' -e 's#, $##'
|
||||
```
|
||||
|
||||
- Send email to etcd-dev@googlegroups.com
|
||||
|
||||
## Post release
|
||||
|
||||
- Create new stable branch through `git push origin ${VERSION_MAJOR}.${VERSION_MINOR}` if this is a major stable release. This assumes `origin` corresponds to "https://github.com/etcd-io/etcd".
|
||||
- Bump [hardcoded Version in the repository](https://github.com/etcd-io/etcd/blob/v3.4.15/version/version.go#L30) to the version `${VERSION}+git`.
|
|
@ -1,45 +0,0 @@
|
|||
# Reporting bugs
|
||||
|
||||
If any part of the etcd project has bugs or documentation mistakes, please let us know by [opening an issue][etcd-issue]. We treat bugs and mistakes very seriously and believe no issue is too small. Before creating a bug report, please check that an issue reporting the same problem does not already exist.
|
||||
|
||||
To make the bug report accurate and easy to understand, please try to create bug reports that are:
|
||||
|
||||
- Specific. Include as much details as possible: which version, what environment, what configuration, etc. If the bug is related to running the etcd server, please attach the etcd log (the starting log with etcd configuration is especially important).
|
||||
|
||||
- Reproducible. Include the steps to reproduce the problem. We understand some issues might be hard to reproduce, please includes the steps that might lead to the problem. If possible, please attach the affected etcd data dir and stack strace to the bug report.
|
||||
|
||||
- Isolated. Please try to isolate and reproduce the bug with minimum dependencies. It would significantly slow down the speed to fix a bug if too many dependencies are involved in a bug report. Debugging external systems that rely on etcd is out of scope, but we are happy to provide guidance in the right direction or help with using etcd itself.
|
||||
|
||||
- Unique. Do not duplicate existing bug report.
|
||||
|
||||
- Scoped. One bug per report. Do not follow up with another bug inside one report.
|
||||
|
||||
It may be worthwhile to read [Elika Etemad’s article on filing good bug reports][filing-good-bugs] before creating a bug report.
|
||||
|
||||
We might ask for further information to locate a bug. A duplicated bug report will be closed.
|
||||
|
||||
## Frequently asked questions
|
||||
|
||||
### How to get a stack trace
|
||||
|
||||
``` bash
|
||||
$ kill -QUIT $PID
|
||||
```
|
||||
|
||||
### How to get etcd version
|
||||
|
||||
``` bash
|
||||
$ etcd --version
|
||||
```
|
||||
|
||||
### How to get etcd configuration and log when it runs as systemd service ‘etcd2.service’
|
||||
|
||||
``` bash
|
||||
$ sudo systemctl cat etcd2
|
||||
$ sudo journalctl -u etcd2
|
||||
```
|
||||
|
||||
Due to an upstream systemd bug, journald may miss the last few log lines when its processes exit. If journalctl says etcd stopped without fatal or panic message, try `sudo journalctl -f -t etcd2` to get full log.
|
||||
|
||||
[etcd-issue]: https://github.com/etcd-io/etcd/issues/new
|
||||
[filing-good-bugs]: http://fantasai.inkedblade.net/style/talks/filing-good-bugs/
|
|
@ -1,180 +0,0 @@
|
|||
# Issue triage guidelines
|
||||
|
||||
## Purpose
|
||||
|
||||
Speed up issue management.
|
||||
|
||||
The `etcd` issues are listed at <https://github.com/etcd-io/etcd/issues> and are identified with labels. For example, an issue that is identified as a bug will be set to label `type/bug`.
|
||||
|
||||
The etcd project uses labels to indicate common attributes such as `area`, `type` and `priority` of incoming issues.
|
||||
|
||||
New issues will often start out without any labels, but typically `etcd` maintainers, reviewers and members will add labels by following these triage guidelines. The detailed list of labels can be found at <https://github.com/etcd-io/etcd/labels>.
|
||||
|
||||
## Scope
|
||||
|
||||
This document serves as the primary guidelines for triaging incoming issues in `etcd`.
|
||||
|
||||
All contributors are encouraged and welcome to help manage issues which will help reduce burden on project maintainers, though the work and responsibilities discussed in this document are created with `etcd` project reviewers and members in mind as these individuals will have triage access to the etcd project which is a requirement for actions like applying labels or closing issues.
|
||||
|
||||
Refer to [etcd community membership](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md) for guidance on becoming and etcd project member or reviewer.
|
||||
|
||||
## Step 1 - Find an issue to triage
|
||||
|
||||
To get started you can use the following recommended issue searches to identify issues that are in need of triage:
|
||||
|
||||
* [Issues that have no labels](https://github.com/etcd-io/etcd/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated+no%3Alabel)
|
||||
* [Issues created recently](https://github.com/etcd-io/etcd/issues?q=is%3Aissue+is%3Aopen+)
|
||||
* [Issues not assigned but linked pr](https://github.com/etcd-io/etcd/issues?q=is%3Aopen+is%3Aissue+no%3Aassignee+linked%3Apr)
|
||||
* [Issues with no comments](https://github.com/etcd-io/etcd/issues?q=is%3Aopen+is%3Aissue+comments%3A0+)
|
||||
* [Issues with help wanted](https://github.com/etcd-io/etcd/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22+)
|
||||
|
||||
## Step 2 - Check the issue is valid
|
||||
|
||||
Before we start adding labels or trying to work out a priority, our first triage step needs to be working out if the issue actually belongs to the etcd project and is not a duplicate.
|
||||
|
||||
### Issues that don't belong to etcd
|
||||
|
||||
Sometime issues are reported that actually belongs to other projects that `etcd` use. For example, `grpc` or `golang` issues. Such issues should be addressed by asking reporter to open issues in appropriate other project.
|
||||
|
||||
These issues can generally be closed unless a maintainer and issue reporter see a need to keep it open for tracking purpose. If you have triage permissions please close it, alternatively mention the @etcd-io/members group to request a member with triage access close the issue.
|
||||
|
||||
### Duplicate issues
|
||||
|
||||
If an issue is a duplicate, add a comment stating so along with a reference for the original issue and if you have triage permissions please close it, alternatively mention the @etcd-io/members group to request a member with triage access close the issue.
|
||||
|
||||
## Step 3 - Apply the appropriate type label
|
||||
|
||||
Adding a `type` label to an issue helps create visibility on the health of the project and helps contributors identify potential priorities, i.e. addressing existing bugs or test flakes before implementing new features.
|
||||
|
||||
### Support requests
|
||||
|
||||
As a general rule the focus for etcd support is to address common themes in a broad way that helps all users, i.e. through channels like known issues, frequently asked questions and high quality documentation. To make the best use of project members time we should avoid providing 1:1 support if a broad approach is available.
|
||||
|
||||
Some people mistakenly use our GitHub bug report or feature request templates to file support requests. Usually they are asking for help operating or configuring some aspect of etcd. Support requests for etcd should instead be raised as [discussions](https://github.com/etcd-io/etcd/discussions).
|
||||
|
||||
Common types of support requests are:
|
||||
|
||||
1. Questions about configuring or operating existing well documented etcd features, for example <https://github.com/etcd-io/etcd/issues/15945>. Note - If an existing feature is not well documented please apply the `area/documentation` label and propose documentation improvements that would prevent future users from stumbling on the problem again.
|
||||
|
||||
2. Bug reports or questions about unspported versions of etcd, for example <https://github.com/etcd-io/etcd/issues/15796>. When responding to these issues please refer to our [supported versions documentation](https://etcd.io/docs/latest/op-guide/versioning) and encourage the reporter to upgrade to a recent patch release of a supported version as soon as possible. We should limit the effort supporting users that do not make the effort to run a supported version of etcd or ensure their version is patched.
|
||||
|
||||
3. Bug reports that do not provide a complete list of steps to reproduce issue and/or contributors are not able to reproduce the issue, for example <https://github.com/etcd-io/etcd/issues/15740>. We should limit the effort we put into reproducing issues ourselves and motivate users to provide necessary information to accept the bug report.
|
||||
|
||||
4. General questions that are filed using feature request or bug report issue templates, for example <https://github.com/etcd-io/etcd/issues/15914>. Note - These types of requests may surface good additions to our [frequently asked questions](https://etcd.io/docs/v3.5/faq).
|
||||
|
||||
If you identify that an issue is a support request please:
|
||||
|
||||
1. Add the `type/support` or `type/question` label.
|
||||
|
||||
2. Add the following comment to inform the issue creator that discussions should be used instead and that this issue will be converted to a discussion.
|
||||
|
||||
> Thank you for your question, this support issue will be moved to our [Discussion Forums](https://github.com/etcd-io/etcd/discussions).
|
||||
>
|
||||
> We are trying to consolidate the channels to which questions for help/support are posted so that we can improve our efficiency in responding to your requests, and to make it easier for you to find answers to frequently asked questions and how to address common use cases.
|
||||
>
|
||||
> We regularly see messages posted in multiple forums, with the full response thread only in one place or, worse, spread across multiple forums. Also, the large volume of support issues on GitHub is making it difficult for us to use issues to identify real bugs.
|
||||
>
|
||||
> Members of the etcd community use Discussion Forums to field support requests. Before posting a new question, please search these for answers to similar questions, and also familiarize yourself with:
|
||||
>
|
||||
> 1. [user documentation](https://etcd.io/docs/latest)
|
||||
> 2. [frequently asked questions](https://etcd.io/docs/v3.5/faq)
|
||||
>
|
||||
> Again, thanks for using etcd and raising this question.
|
||||
>
|
||||
> The etcd team
|
||||
|
||||
3. Finally, click `Convert to discussion` on the right hand panel, selecting the appropriate discussion category.
|
||||
|
||||
### Bug reports
|
||||
|
||||
If an issue has been raised as a bug it should already have the `type/bug` label, however if this is missing for an issue you determine to be a bug please add the label manually.
|
||||
|
||||
The next step is to validate if the issue is indeed a bug. If not, add a comment with findings and close trivial issue. For non-trivial issue, wait to hear back from issue reporter and see if there is any objection. If issue reporter does not reply in 30 days, close the issue.
|
||||
|
||||
If the problem can not be reproduced or requires more information, leave a comment for the issue reporter as soon as possible while the issue will be fresh for the issue reporter.
|
||||
|
||||
### Feature requests
|
||||
|
||||
New feature requests should be created via the etcd feature request template and in theory already have the `type/feature` label, however if this is missing for an issue you determine to be a feature please add the label manually.
|
||||
|
||||
### Test flakes
|
||||
|
||||
Test flakes are a specific type of bug that the etcd project tracks seperately as these are a priority to address. These should be created via the test flake template and in theory already have the `type/flake` label, however if this is missing for an issue you determine to be related to a flaking test please add the label manually.
|
||||
|
||||
## Step 4 - Define the areas impacted
|
||||
|
||||
Adding an `area` label to an issue helps create visibility on which areas of the etcd project require attention and helps contributors find issues to work on relating to their particular skills or knowledge of the etcd codebase.
|
||||
|
||||
If an issue crosses multiple domains please add additional `area` labels to reflect that.
|
||||
|
||||
Below is a brief summary of the area labels in active use by the etcd project along with any notes on their use:
|
||||
|
||||
| Label | Notes |
|
||||
| --- | --- |
|
||||
| area/external | Tracking label for issues raised that are external to etcd. |
|
||||
| area/community | |
|
||||
| area/raft | |
|
||||
| area/clientv3 | |
|
||||
| area/performance | |
|
||||
| area/security | |
|
||||
| area/tls | |
|
||||
| area/auth | |
|
||||
| area/etcdctl | |
|
||||
| area/etcdutl | |
|
||||
| area/contrib | Not to be confused with `area/community` this label is specifically used for issues relating to community maintained scripts or files in the `contrib/` directory which aren't part of the core etcd project. |
|
||||
| area/documentation | |
|
||||
| area/tooling | Generally used in relation to the third party / external utilities or tools that are used in various stages of the etcd build, test or release process, for example tooling to create sboms. |
|
||||
| area/testing | |
|
||||
| area/robustness-testing | |
|
||||
|
||||
## Step 5 - Prioritise the issue
|
||||
|
||||
Placeholder.
|
||||
|
||||
## Step 6 - Support new contributors
|
||||
|
||||
As part of the `etcd` triage process once the `kind` and `area` have been determined, please consider if the issue would be suitable for a less experienced contributor. The `good first issue` label is a subset of the `help wanted` label, indicating that members have committed to providing extra assistance for new contributors. All `good first issue` items also have the `help wanted` label.
|
||||
|
||||
### Help wanted
|
||||
|
||||
Items marked with the `help wanted` label need to ensure that they meet these criteria:
|
||||
|
||||
* **Low Barrier to Entry** - It should be easy for new contributors.
|
||||
|
||||
* **Clear** - The task is agreed upon and does not require further discussions in the community.
|
||||
|
||||
* **Goldilocks priority** - The priority should not be so high that a core contributor should do it, but not too low that it isn’t useful enough for a core contributor to spend time reviewing it, answering questions, helping get it into a release, etc.
|
||||
|
||||
### Good first issue
|
||||
|
||||
Items marked with `good first issue` are intended for first-time contributors. It indicates that members will keep an eye out for these pull requests and shepherd it through our processes.
|
||||
|
||||
New contributors should not be left to find an approver, ping for reviews, decipher test commands, or identify that their build failed due to a flake. It is important to make new contributors feel welcome and valued. We should assure them that they will have an extra level of help with their first contribution.
|
||||
|
||||
After a contributor has successfully completed one or two `good first issue` items, they should be ready to move on to `help wanted` items.
|
||||
|
||||
* **No Barrier to Entry** - The task is something that a new contributor can tackle without advanced setup or domain knowledge.
|
||||
|
||||
* **Solution Explained** - The recommended solution is clearly described in the issue.
|
||||
|
||||
* **Gives Examples** - Link to examples of similar implementations so new contributors have a reference guide for their changes.
|
||||
|
||||
* **Identifies Relevant Code** - The relevant code and tests to be changed should be linked in the issue.
|
||||
|
||||
* **Ready to Test** - There should be existing tests that can be modified, or existing test cases fit to be copied. If the area of code doesn’t have tests, before labeling the issue, add a test fixture. This prep often makes a great help wanted task!
|
||||
|
||||
## Step 7 - Follow up
|
||||
|
||||
Once initial triage has been completed, issues need to be re-evaluated over time to ensure they don't become stale incorrectly.
|
||||
|
||||
### Track important issues
|
||||
|
||||
If an issue is at risk of being closed by stale bot in future, but is an important issuefor the etcd project, then please apply the `stage/tracked` label and remove any `stale` labels that exist. This will ensure the project does not lose sight of the issue.
|
||||
|
||||
### Close incomplete issues
|
||||
|
||||
Issues that lack enough information from the issue reporter should be closed if issue reporter do not provide information in 30 days. Issues can always be re-opened at a later date if new information is provided.
|
||||
|
||||
### Check for incomplete work
|
||||
|
||||
If an issue owned by a developer has no pull request created in 30 days, contact the issue owner and kindly ask about the status of their work, or to release ownership on the issue if needed.
|
|
@ -1,28 +0,0 @@
|
|||
# PR management
|
||||
|
||||
## Purpose
|
||||
|
||||
Speed up PR management.
|
||||
|
||||
The `etcd` PRs are listed at https://github.com/etcd-io/etcd/pulls
|
||||
A PR can have various labels, milestone, reviewer etc. The detailed list of labels can be found at
|
||||
https://github.com/kubernetes/kubernetes/labels
|
||||
|
||||
Following are few example searches on PR for convenience:
|
||||
* [Open PRS for milestone etcd-v3.6](https://github.com/etcd-io/etcd/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+milestone%3Aetcd-v3.6)
|
||||
* [PRs under investigation](https://github.com/etcd-io/etcd/labels/Investigating)
|
||||
|
||||
## Scope
|
||||
|
||||
These guidelines serves as a primary document for managing PRs in `etcd`. Everyone is welcome to help manage PRs but the work and responsibilities discussed in this document is created with `etcd` maintainers and active contributors in mind.
|
||||
|
||||
## Handle inactive PRs
|
||||
Poke PR owner if review comments are not addressed in 15 days. If PR owner does not reply in 90 days, update the PR with a new commit if possible. If not, inactive PR should be closed after 180 days.
|
||||
|
||||
## Poke reviewer if needed
|
||||
|
||||
Reviewers are responsive in a timely fashion, but considering everyone is busy, give them some time after requesting review if quick response is not provided. If response is not provided in 10 days, feel free to contact them via adding a comment in the PR or sending an email or message on the Slack.
|
||||
|
||||
## Verify important labels are in place
|
||||
|
||||
Make sure that appropriate reviewers are added to the PR. Also, make sure that a milestone is identified. If any of these or other important labels are missing, add them. If a correct label cannot be decided, leave a comment for the maintainers to do so as needed.
|
File diff suppressed because it is too large
Load Diff
|
@ -23,7 +23,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -56,7 +56,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -98,7 +98,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -131,7 +131,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -164,7 +164,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -203,7 +203,7 @@
|
|||
"revision": {
|
||||
"type": "string",
|
||||
"format": "int64",
|
||||
"description": "revision is the key-value store revision when the request was applied, and it's\nunset (so 0) in case of calls not interacting with key-value store.\nFor watch progress responses, the header.revision indicates progress. All future events\nreceived in this stream are guaranteed to have a higher revision number than the\nheader.revision number."
|
||||
"description": "revision is the key-value store revision when the request was applied.\nFor watch progress responses, the header.revision indicates progress. All future events\nrecieved in this stream are guaranteed to have a higher revision number than the\nheader.revision number."
|
||||
},
|
||||
"raft_term": {
|
||||
"type": "string",
|
||||
|
@ -251,16 +251,13 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"type_url": {
|
||||
"type": "string",
|
||||
"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": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||
"format": "byte"
|
||||
}
|
||||
}
|
||||
},
|
||||
"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(\u0026foo)) {\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 := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.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\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\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 }"
|
||||
},
|
||||
"runtimeError": {
|
||||
"type": "object",
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -56,7 +56,7 @@
|
|||
}
|
||||
},
|
||||
"default": {
|
||||
"description": "An unexpected error response.",
|
||||
"description": "An unexpected error response",
|
||||
"schema": {
|
||||
"$ref": "#/definitions/runtimeError"
|
||||
}
|
||||
|
@ -95,7 +95,7 @@
|
|||
"revision": {
|
||||
"type": "string",
|
||||
"format": "int64",
|
||||
"description": "revision is the key-value store revision when the request was applied, and it's\nunset (so 0) in case of calls not interacting with key-value store.\nFor watch progress responses, the header.revision indicates progress. All future events\nreceived in this stream are guaranteed to have a higher revision number than the\nheader.revision number."
|
||||
"description": "revision is the key-value store revision when the request was applied.\nFor watch progress responses, the header.revision indicates progress. All future events\nrecieved in this stream are guaranteed to have a higher revision number than the\nheader.revision number."
|
||||
},
|
||||
"raft_term": {
|
||||
"type": "string",
|
||||
|
@ -108,16 +108,13 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"type_url": {
|
||||
"type": "string",
|
||||
"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": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||
"format": "byte"
|
||||
}
|
||||
}
|
||||
},
|
||||
"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(\u0026foo)) {\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 := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.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\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\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 }"
|
||||
},
|
||||
"runtimeError": {
|
||||
"type": "object",
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
# etcd arm64 test infrastructure
|
||||
|
||||
## Infrastructure summary
|
||||
|
||||
All etcd project pipelines run via github actions. The etcd project currently maintains dedicated infrastructure for running `arm64` continuous integration testing. This is required because currently github actions runner virtual machines are only offered as `x64`.
|
||||
|
||||
The infrastructure consists of two `c3.large.arm` bare metal servers kindly provided by [Equinix Metal](https://www.equinix.com/) via the [CNCF Community Infrastructure Lab].
|
||||
|
||||
| Hostname | IP | Operating System | Region |
|
||||
|-------------------------------|----------------|--------------------|---------------|
|
||||
| etcd-c3-large-arm64-runner-01 | 86.109.7.233 | Ubuntu 22.04.1 LTS | Washington DC |
|
||||
| etcd-c3-large-arm64-runner-02 | 147.28.151.226 | Ubuntu 22.04.1 LTS | Washington DC |
|
||||
|
||||
## Infrastructure support
|
||||
|
||||
The etcd project aims to self manage and resolve issues with project infrastructure internally where possible, however if situations emerge where we need to engage support from Equinix Metal we can open an issue under the [CNCF Community Infrastructure Lab] project or contact the [Equinix Metal support team](https://deploy.equinix.com/support). If the situation is urgent contact @vielmetti directly who can provide further assistance or escalation points.
|
||||
|
||||
## Granting infrastructure access
|
||||
|
||||
Etcd arm64 test infrastructure access is closely controlled to ensure the infrastructure is secure and protect the integrity of the etcd project.
|
||||
|
||||
Access to the infrastructure is defined by the infra admins table below:
|
||||
|
||||
| Name | Github | K8s Slack | Email |
|
||||
|---------------------------|----------------|--------------------|--------------------|
|
||||
| Marek Siarkowicz | @serathius | @ Serathius | Ref MAINTAINERS.md |
|
||||
| Benjamin Wang | @ahrtr | @ Benjamin Wang | Ref MAINTAINERS.md |
|
||||
| Davanum Srinivas | @dimns | @ Dims | davanum@gmail.com |
|
||||
| Chao Chen | @chaochn47 | @ Chao Chen | chaochn@amazon.com |
|
||||
| James Blair | @jmhbnz | @ James Blair | etcd@jamma.life |
|
||||
|
||||
Individuals in this table are granted access to the infrastructure in two ways:
|
||||
|
||||
### 1. Equinix metal web console access
|
||||
|
||||
An etcd project exists under the CNCF organisation in the Equinix Metal web console. The direct url to the etcd console is <https://console.equinix.com/projects/1b8c1eb7-983c-4b40-97e0-e317406e232e>.
|
||||
|
||||
When a new person is added to the infra admins table, an existing member or etcd maintainer should raise an issue in the [CNCF Community Infrastructure Labs](https://github.com/cncf/cluster/issues) to ensure they are granted web console access.
|
||||
|
||||
### 2. Server ssh access
|
||||
|
||||
Infra admins can ssh directly to the servers with a dedicated user account for each person, usernames are based on github handles for easy recognition in logs. These infra admins will be able to elevate to the `root` user when necessary via `sudo`.
|
||||
|
||||
Access to machines via ssh is strictly via individual ssh key based authentication, and is not permitted directly to the `root` user. Password authentication is never to be used for etcd infrastructure ssh authentication.
|
||||
|
||||
When a new member is added to the infra admins table, and existing member with ssh access should complete the following actions on all etcd servers:
|
||||
|
||||
- create the new user via `sudo adduser <username>`.
|
||||
- add their public key to `/home/<username>/.ssh/authorized_keys` file. Note: Public keys are to be retrieved via github only, example: <https://github.com/jmhbnz.keys>.
|
||||
- add the new user to machine sudoers file via `usermod -aG sudo <username>`.
|
||||
|
||||
## Revoking infrastructure access
|
||||
|
||||
When a member is removed from the infra admins table existing members must review servers and ensure their user access to etcd infrastructure is revoked by removing the members `/home/<username>/.ssh/authorized_keys` entries.
|
||||
|
||||
Note: When revoking access do not delete a user or their home directory from servers, as access may need to be reinstated in future.
|
||||
|
||||
### Regular access review
|
||||
|
||||
On a regular at least quarterly basis members of the infra admins team are responsible for verifying that no unneccessary infrastructure access exists by reviewing membership of the table above and existing server access.
|
||||
|
||||
## Provisioning new machines
|
||||
|
||||
If the etcd project needs new `arm64` infrastructure we can open an issue with the [CNCF Community Infrastructure Lab]. An example etcd request is [here](https://github.com/cncf/cluster/issues/227).
|
||||
|
||||
Note: `arm64` compute capacity is not currently available in all regions, this can be checked with [metal-cli](https://github.com/equinix/metal-cli) `metal capacity get | grep arm`.
|
||||
|
||||
[CNCF Community Infrastructure Lab]: https://github.com/cncf/cluster/issues
|
|
@ -1,142 +0,0 @@
|
|||
# v3.5 data inconsistency postmortem
|
||||
|
||||
| | |
|
||||
|---------|------------|
|
||||
| Authors | serathius@ |
|
||||
| Date | 2022-04-20 |
|
||||
| Status | published |
|
||||
|
||||
## Summary
|
||||
|
||||
| | |
|
||||
|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Summary | Code refactor in v3.5.0 resulted in consistent index not being saved atomically. Independent crash could lead to committed transactions are not reflected on all the members. |
|
||||
| Impact | No user reported problems in production as triggering the issue required frequent crashes, however issue was critical enough to motivate a public statement. Main impact comes from loosing user trust into etcd reliability. |
|
||||
|
||||
## Background
|
||||
|
||||
etcd v3 state is preserved on disk in two forms write ahead log (WAL) and database state (DB).
|
||||
etcd v3.5 also still maintains v2 state, however it's deprecated and not relevant to the issue in this postmortem.
|
||||
|
||||
WAL stores history of changes for etcd state and database represents state at one point.
|
||||
To know which point of history database is representing, it stores consistent index (CI).
|
||||
It's a special metadata field that points to last entry in WAL that it has seen.
|
||||
|
||||
When etcd is updating database state, it replays entries from WAL and updates the consistent index to point to new entry.
|
||||
This operation is required to be [atomic](https://en.wikipedia.org/wiki/Atomic_commit).
|
||||
A partial fail would mean that database and WAL would no longer match, so some entries would be either skipped (if only CI is updated) or executed twice (if only changes are applied).
|
||||
This is especially important for distributed system like etcd, where there are multiple cluster members, each applying the WAL entries to their database.
|
||||
Correctness of the system depends on assumption that every member of the cluster, while replying WAL entries, will reach the same state.
|
||||
|
||||
## Root cause
|
||||
|
||||
To simplify managing consistency index, etcd has introduced backend hooks in https://github.com/etcd-io/etcd/pull/12855.
|
||||
Goal was to ensure that consistency index is always updated, by automatically triggering update during commit.
|
||||
Implementation was as follows, before applying the WAL entries, etcd updated in memory value of consistent index.
|
||||
As part of transaction commit process, a database hook would read the value of consistent index and store it to database.
|
||||
|
||||
Problem is that in memory value of consistent index is shared, and there might be other in flight transactions apart from serial WAL apply flow.
|
||||
So if we imagine scenario:
|
||||
1. etcd server starts an apply workflow, and it just sets a new consistent index value.
|
||||
2. The periodic commit is triggered, and it executes the backend hook and saves consistent index from apply workflow.
|
||||
3. etcd server finished an apply workflow, saves new changes and saves same value of consistent index again.
|
||||
|
||||
Between second and third point there is a very small window where consistent index is increased without applying entry from WAL.
|
||||
|
||||
## Trigger
|
||||
|
||||
If etcd crashed after consistency index is saved, but before to apply workflow finished it would lead to data inconsistency.
|
||||
When recovering the data etcd would skip executing changes from failed apply workflow, assuming they have been already executed.
|
||||
|
||||
This follows the issue reports and code used to reproduce the issue where trigger was etcd crashing under high request load.
|
||||
Etcd v3.5.0 was released with bug (https://github.com/etcd-io/etcd/pull/13505) that could cause etcd to crash that was fixed in v3.5.1.
|
||||
Apart from that all reports described etcd running under high memory pressure, causing it to go out of memory from time to time.
|
||||
Reproduction run etcd under high stress and randomly killed one of the members using SIGKILL signal (not recoverable immediate process death).
|
||||
|
||||
## Detection
|
||||
|
||||
For single member cluster it is totally undetectable.
|
||||
There is no mechanism or tool for verifying that state database matches WAL.
|
||||
|
||||
In cluster with multiple members it would mean that one of the members that crashed, will missing changes from failed apply workflow.
|
||||
This means that it will have different state of database and will return different hash via `HashKV` grpc call.
|
||||
|
||||
There is an automatic mechanism to detect data inconsistency.
|
||||
It can be executed during etcd start via `--experimental-initial-corrupt-check` and periodically via `--experimental-corrupt-check-time`.
|
||||
Both checks however have a flaw, they depend on `HashKV` grpc method, which might fail causing the check to pass.
|
||||
|
||||
In multi member etcd cluster, each member can run with different performance and be at different stage of applying the WAL log.
|
||||
Comparing database hashes between multiple etcd members requires all hashes to be calculated at the same change.
|
||||
This is done by requesting hash for the same `revision` (version of key value store).
|
||||
However, it will not work if the provided revision is not available on the members.
|
||||
This can happen on very slow members, or in cases where corruption has lead revision numbers to diverge.
|
||||
|
||||
This means that for this issue, the corrupt check is only reliable during etcd start just after etcd crashes.
|
||||
|
||||
## Impact
|
||||
|
||||
We are not aware any cases of users reporting a data corruption in production environment.
|
||||
|
||||
However, issue was critical enough to motivate a public statement.
|
||||
Main impact comes from loosing user trust into etcd reliability.
|
||||
|
||||
## Lessons learned
|
||||
|
||||
### What went well
|
||||
|
||||
* Multiple maintainers were able to work effectively on reproducing and fixing the issue. As they are in different timezones, there was always someone working on the issue.
|
||||
* When fixing the main data inconsistency we have found multiple other edge cases that could lead to data corruption (https://github.com/etcd-io/etcd/issues/13514, https://github.com/etcd-io/etcd/issues/13922, https://github.com/etcd-io/etcd/issues/13937).
|
||||
|
||||
### What went wrong
|
||||
|
||||
* No users enable data corruption detection as it is still an experimental feature introduced in v3.3. All reported cases where detected manually making it almost impossible to reproduce.
|
||||
* etcd has functional tests designed to detect such problems, however they are unmaintained, flaky and are missing crucial scenarios.
|
||||
* etcd v3.5 release was not qualified as comprehensive as previous ones. Older maintainers run manual qualification process that is no longer known or executed.
|
||||
* etcd apply code is so complicated that fixing the data inconsistency took almost 2 weeks and multiple tries. Fix needed to be so complicated that we needed to develop automatic validation for it (https://github.com/etcd-io/etcd/pull/13885).
|
||||
* etcd v3.5 was recommended for production without enough insight on the production adoption. Production ready recommendations based on after some internal feedback... to get diverse usage, but the user's hold on till someone else will discover issues.
|
||||
|
||||
### Where we got lucky
|
||||
|
||||
* We reproduced the issue using etcd functional only because weird partition setup on workstation. Functional tests store etcd data under `/tmp` usually mounted to in memory filesystem. Problem was reproduced only because one of the maintainers has `/tmp` mounted to standard disk.
|
||||
|
||||
## Action items
|
||||
|
||||
Action items should directly address items listed in lessons learned.
|
||||
We should double down on things that went well, fix things that went wrong, and stop depending on luck.
|
||||
|
||||
Action fall under three types, and we should have at least one item per type. Types:
|
||||
* Prevent - Prevent similar issues from occurring. In this case, what testing we should introduce to find data inconsistency issues before release, preventing publishing broken release.
|
||||
* Detect - Be more effective in detecting when similar issues occur. In this case, improve mechanism to detect data inconsistency issue so users will be automatically informed.
|
||||
* Mitigate - Reduce time to recovery for users. In this case, how we ensure that users are able to quickly fix data inconsistency.
|
||||
|
||||
Actions should not be restricted to fixing the immediate issues and also propose long term strategic improvements.
|
||||
To reflect this action items should have assigned priority:
|
||||
* P0 - Critical for reliability of the v3.5 release. Should be prioritized this over all other work and backported to v3.5.
|
||||
* P1 - Important for long term success of the project. Blocks v3.6 release.
|
||||
* P2 - Stretch goals that would be nice to have for v3.6, however should not be blocking.
|
||||
|
||||
| Action Item | Type | Priority | Bug | Status |
|
||||
|-------------------------------------------------------------------------------------|----------|----------|----------------------------------------------|--------|
|
||||
| etcd testing can reproduce historical data inconsistency issues | Prevent | P0 | https://github.com/etcd-io/etcd/issues/14045 | DONE |
|
||||
| etcd detects data corruption by default | Detect | P0 | https://github.com/etcd-io/etcd/issues/14039 | DONE |
|
||||
| etcd testing is high quality, easy to maintain and expand | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13637 | |
|
||||
| etcd apply code should be easy to understand and validate correctness | Prevent | P1 | | |
|
||||
| Critical etcd features are not abandoned when contributors move on | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13775 | DONE |
|
||||
| etcd is continuously qualified with failure injection | Prevent | P1 | https://github.com/etcd-io/etcd/pull/14911 | DONE |
|
||||
| etcd can reliably detect data corruption (hash is linearizable) | Detect | P1 | | |
|
||||
| etcd checks consistency of snapshots sent between leader and followers | Detect | P1 | https://github.com/etcd-io/etcd/issues/13973 | DONE |
|
||||
| etcd recovery from data inconsistency procedures are documented and tested | Mitigate | P1 | | |
|
||||
| etcd can imminently detect and recover from data corruption (implement Merkle root) | Mitigate | P2 | https://github.com/etcd-io/etcd/issues/13839 | |
|
||||
|
||||
## Timeline
|
||||
|
||||
| Date | Event |
|
||||
|------------|-----------------------------------------------------------------------------------------------------------------------|
|
||||
| 2021-05-08 | Pull request that caused data corruption was merged - https://github.com/etcd-io/etcd/pull/12855 |
|
||||
| 2021-06-16 | Release v3.5.0 with data corruption was published - https://github.com/etcd-io/etcd/releases/tag/v3.5.0 |
|
||||
| 2021-12-01 | Report of data corruption - https://github.com/etcd-io/etcd/issues/13514 |
|
||||
| 2021-01-28 | Report of data corruption - https://github.com/etcd-io/etcd/issues/13654 |
|
||||
| 2022-03-08 | Report of data corruption - https://github.com/etcd-io/etcd/issues/13766 |
|
||||
| 2022-03-25 | Corruption confirmed by one of the maintainers - https://github.com/etcd-io/etcd/issues/13766#issuecomment-1078897588 |
|
||||
| 2022-03-29 | Statement about the corruption was sent to etcd-dev@googlegroups.com and dev@kubernetes.io |
|
||||
| 2022-04-24 | Release v3.5.3 with fix was published - https://github.com/etcd-io/etcd/releases/tag/v3.5.3 |
|
|
@ -5,20 +5,64 @@
|
|||
The etcd community adheres to the following principles:
|
||||
|
||||
- Open: etcd is open source.
|
||||
- Welcoming and respectful: See [Code of Conduct].
|
||||
- Welcoming and respectful: See [Code of Conduct](code-of-conduct.md).
|
||||
- Transparent and accessible: Changes to the etcd code repository and CNCF related
|
||||
activities (e.g. level, involvement, etc) are done in public.
|
||||
- Merit: Ideas and contributions are accepted according to their technical merit for
|
||||
the betterment of the project. For specific guidance on practical contribution steps
|
||||
please see [contributor guide] guide.
|
||||
please see [CONTRIBUTING](./CONTRIBUTING.md) guide.
|
||||
|
||||
## Roles and responsibilities
|
||||
Etcd project roles along with their requirements and responsibilities are defined
|
||||
in [community membership].
|
||||
## Maintainers
|
||||
|
||||
[Maintainers](./MAINTAINERS) are first and foremost contributors that have shown they
|
||||
are committed to the long term success of a project. Maintainership is about building
|
||||
trust with the current maintainers of the project and being a person that they can
|
||||
depend on to make decisions in the best interest of the project in a consistent manner.
|
||||
The maintainers role can be a top-level or restricted to certain package/feature
|
||||
depending upon their commitment in fulfilling the expected responsibilities as explained
|
||||
below.
|
||||
|
||||
### Top-level maintainer
|
||||
|
||||
- Running the etcd release processes
|
||||
- Ownership of test and debug infrastructure
|
||||
- Triage GitHub issues to keep the issue count low (goal: under 100)
|
||||
- Regularly review GitHub pull requests across all pkgs
|
||||
- Providing cross pkg design review
|
||||
- Monitor email aliases
|
||||
- Participate when called upon in the [security disclosure and release process](security/README.md)
|
||||
- General project maintenance
|
||||
|
||||
### Package/feature maintainer
|
||||
|
||||
- Ownership of test and debug failures in a pkg/feature
|
||||
- Resolution of bugs triaged to a package/feature
|
||||
- Regularly review pull requests to the pkg subsystem
|
||||
|
||||
Contributors who are interested in becoming a maintainer, if performing these
|
||||
responsibilities, should discuss their interest with the existing maintainers. New
|
||||
maintainers must be nominated by an existing maintainer and must be elected by a
|
||||
supermajority of maintainers. Likewise, maintainers can be removed by a supermajority
|
||||
of the maintainers and moved to emeritus status.
|
||||
|
||||
Life priorities, interests, and passions can change. If a maintainer needs to step
|
||||
down, inform other maintainers about this intention, and if possible, help find someone
|
||||
to pick up the related work. At the very least, ensure the related work can be continued.
|
||||
Afterward, create a pull request to remove yourself from the [MAINTAINERS](./MAINTAINERS)
|
||||
file.
|
||||
|
||||
## Reviewers
|
||||
|
||||
[Reviewers](./MAINTAINERS) are contributors who have demonstrated greater skill in
|
||||
reviewing the code contribution from other contributors. Their LGTM counts towards
|
||||
merging a code change into the project. A reviewer is generally on the ladder towards
|
||||
maintainership. New reviewers must be nominated by an existing maintainer and must be
|
||||
elected by a supermajority of maintainers. Likewise, reviewers can be removed by a
|
||||
supermajority of the maintainers or can resign by notifying the maintainers.
|
||||
|
||||
## Decision making process
|
||||
|
||||
Decisions are built on consensus between [maintainers] publicly. Proposals and ideas
|
||||
Decisions are built on consensus between maintainers publicly. Proposals and ideas
|
||||
can either be submitted for agreement via a GitHub issue or PR, or by sending an email
|
||||
to `etcd-maintainers@googlegroups.com`.
|
||||
|
||||
|
@ -29,14 +73,8 @@ worked out between the persons involved. However, any technical dispute that has
|
|||
reached an impasse with a subset of the community, any contributor may open a GitHub
|
||||
issue or PR or send an email to `etcd-maintainers@googlegroups.com`. If the
|
||||
maintainers themselves cannot decide an issue, the issue will be resolved by a
|
||||
supermajority of the maintainers with a fallback on lazy consensus after three business
|
||||
weeks inactive voting period and as long as two maintainers are on board.
|
||||
supermajority of the maintainers.
|
||||
|
||||
## Changes in Governance
|
||||
|
||||
Changes in project governance could be initiated by opening a GitHub PR.
|
||||
|
||||
[community membership]: /Documentation/contributor-guide/community-membership.md
|
||||
[Code of Conduct]: /code-of-conduct.md
|
||||
[contributor guide]: /CONTRIBUTING.md
|
||||
[maintainers]: /MAINTAINERS
|
||||
|
|
16
MAINTAINERS
16
MAINTAINERS
|
@ -1,6 +1,6 @@
|
|||
# The official list of maintainers and reviewers for the project maintenance.
|
||||
#
|
||||
# Refer to the https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md for description of the roles.
|
||||
# Refer to the GOVERNANCE.md for description of the roles.
|
||||
#
|
||||
# Names should be added to this file like so:
|
||||
# Individual's name <submission email address> (@GITHUB_HANDLE) pkg:*
|
||||
|
@ -9,10 +9,16 @@
|
|||
# Please keep the list sorted.
|
||||
|
||||
# MAINTAINERS
|
||||
Benjamin Wang <wachao@vmware.com> (ahrtr@) pkg:*
|
||||
Brandon Philips <brandon@ifup.org> (@philips) pkg:*
|
||||
Gyuho Lee <gyuhox@gmail.com> <leegyuho@amazon.com> (@gyuho) pkg:*
|
||||
Hitoshi Mitake <h.mitake@gmail.com> (@mitake) pkg:*
|
||||
Marek Siarkowicz <siarkowicz@google.com> <marek.siarkowicz@gmail.com> (@serathius) pkg:*
|
||||
Piotr Tabor <piotr.tabor@gmail.com> (@ptabor) pkg:*
|
||||
Jingyi Hu <jingyih@google.com> (@jingyih) pkg:*
|
||||
Joe Betz <jpbetz@google.com> (@jpbetz) pkg:*
|
||||
Piotr Tabor <ptab@google.com> (@ptabor) pkg:*
|
||||
Sahdev Zala <spzala@us.ibm.com> (@spzala) pkg:*
|
||||
Sam Batschelet <sbatsche@redhat.com> (@hexfusion) pkg:*
|
||||
Wenjia Zhang <wenjiazhang@google.com> (@wenjiaswe) pkg:*
|
||||
Xiang Li <xiangli.cs@gmail.com> (@xiang90) pkg:*
|
||||
|
||||
# REVIEWERS
|
||||
Ben Darnell <ben@cockroachlabs.com> (@bdarnell) pkg:go.etcd.io/etcd/raft
|
||||
Tobias Grieger <tobias.schottdorf@gmail.com> (@tbg) pkg:go.etcd.io/etcd/raft
|
||||
|
|
690
Makefile
690
Makefile
|
@ -1,165 +1,551 @@
|
|||
all: build
|
||||
include tests/robustness/makefile.mk
|
||||
# run from repository root
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make build
|
||||
# make clean
|
||||
# make docker-clean
|
||||
# make docker-start
|
||||
# make docker-kill
|
||||
# make docker-remove
|
||||
|
||||
UNAME := $(shell uname)
|
||||
XARGS = xargs
|
||||
ARCH ?= $(shell go env GOARCH)
|
||||
|
||||
# -r is only necessary on GNU xargs.
|
||||
ifeq ($(UNAME), Linux)
|
||||
XARGS += -r
|
||||
endif
|
||||
XARGS += rm -r
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
GO_BUILD_FLAGS="${GO_BUILD_FLAGS} -v -mod=readonly" ./scripts/build.sh
|
||||
|
||||
.PHONY: tools
|
||||
tools:
|
||||
GO_BUILD_FLAGS="${GO_BUILD_FLAGS} -v -mod=readonly" ./scripts/build_tools.sh
|
||||
|
||||
TEMP_TEST_ANALYZER_DIR=/tmp/etcd-test-analyzer
|
||||
TEST_ANALYZER_BIN=${PWD}/bin
|
||||
bin/etcd-test-analyzer: $(TEMP_TEST_ANALYZER_DIR)/*
|
||||
make -C ${TEMP_TEST_ANALYZER_DIR} build
|
||||
mkdir -p ${TEST_ANALYZER_BIN}
|
||||
install ${TEMP_TEST_ANALYZER_DIR}/bin/etcd-test-analyzer ${TEST_ANALYZER_BIN}
|
||||
${TEST_ANALYZER_BIN}/etcd-test-analyzer -h
|
||||
|
||||
$(TEMP_TEST_ANALYZER_DIR)/*:
|
||||
git clone "https://github.com/endocrimes/etcd-test-analyzer.git" ${TEMP_TEST_ANALYZER_DIR}
|
||||
|
||||
# Tests
|
||||
|
||||
GO_TEST_FLAGS?=
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
PASSES="unit integration release e2e" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-unit
|
||||
test-unit:
|
||||
PASSES="unit" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-integration
|
||||
test-integration:
|
||||
PASSES="integration" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-e2e
|
||||
test-e2e: build
|
||||
PASSES="e2e" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-grpcproxy-integration
|
||||
test-grpcproxy-integration:
|
||||
PASSES="grpcproxy_integration" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-grpcproxy-e2e
|
||||
test-grpcproxy-e2e: build
|
||||
PASSES="grpcproxy_e2e" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-e2e-release
|
||||
test-e2e-release: build
|
||||
PASSES="release e2e" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: test-robustness
|
||||
test-robustness:
|
||||
PASSES="robustness" ./scripts/test.sh $(GO_TEST_FLAGS)
|
||||
|
||||
.PHONY: fuzz
|
||||
fuzz:
|
||||
./scripts/fuzzing.sh
|
||||
|
||||
# Static analysis
|
||||
|
||||
verify: verify-gofmt verify-bom verify-lint verify-dep verify-shellcheck verify-goword \
|
||||
verify-govet verify-license-header verify-receiver-name verify-mod-tidy verify-shellcheck \
|
||||
verify-shellws verify-proto-annotations verify-genproto verify-goimport verify-yamllint
|
||||
fix: fix-goimports fix-bom fix-lint fix-yamllint
|
||||
./scripts/fix.sh
|
||||
|
||||
.PHONY: verify-gofmt
|
||||
verify-gofmt:
|
||||
PASSES="gofmt" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-bom
|
||||
verify-bom:
|
||||
PASSES="bom" ./scripts/test.sh
|
||||
|
||||
.PHONY: fix-bom
|
||||
fix-bom:
|
||||
./scripts/updatebom.sh
|
||||
|
||||
.PHONY: verify-dep
|
||||
verify-dep:
|
||||
PASSES="dep" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-lint
|
||||
verify-lint:
|
||||
golangci-lint run --config tools/.golangci.yaml
|
||||
|
||||
.PHONY: fix-lint
|
||||
fix-lint:
|
||||
golangci-lint run --config tools/.golangci.yaml --fix
|
||||
|
||||
.PHONY: verify-shellcheck
|
||||
verify-shellcheck:
|
||||
PASSES="shellcheck" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-goword
|
||||
verify-goword:
|
||||
PASSES="goword" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-govet
|
||||
verify-govet:
|
||||
PASSES="govet" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-license-header
|
||||
verify-license-header:
|
||||
PASSES="license_header" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-receiver-name
|
||||
verify-receiver-name:
|
||||
PASSES="receiver_name" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-mod-tidy
|
||||
verify-mod-tidy:
|
||||
PASSES="mod_tidy" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-shellws
|
||||
verify-shellws:
|
||||
PASSES="shellws" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-proto-annotations
|
||||
verify-proto-annotations:
|
||||
PASSES="proto_annotations" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-genproto
|
||||
verify-genproto:
|
||||
PASSES="genproto" ./scripts/test.sh
|
||||
|
||||
.PHONY: verify-goimport
|
||||
verify-goimport:
|
||||
PASSES="goimport" ./scripts/test.sh
|
||||
|
||||
.PHONY: fix-goimports
|
||||
fix-goimports:
|
||||
./scripts/fix-goimports.sh
|
||||
|
||||
.PHONY: verify-yamllint
|
||||
verify-yamllint:
|
||||
yamllint --config-file tools/.yamllint .
|
||||
|
||||
YAMLFMT_VERSION = $(shell cd tools/mod && go list -m -f '{{.Version}}' github.com/google/yamlfmt)
|
||||
|
||||
.PHONY: fix-yamllint
|
||||
fix-yamllint:
|
||||
ifeq (, $(shell which yamlfmt))
|
||||
$(shell go install github.com/google/yamlfmt/cmd/yamlfmt@$(YAMLFMT_VERSION))
|
||||
endif
|
||||
yamlfmt -conf tools/.yamlfmt .
|
||||
|
||||
# Cleanup
|
||||
GO_BUILD_FLAGS="-v" ./build.sh
|
||||
./bin/etcd --version
|
||||
./bin/etcdctl version
|
||||
./bin/etcdutl version
|
||||
|
||||
clean:
|
||||
rm -f ./codecov
|
||||
rm -rf ./covdir
|
||||
rm -f ./bin/Dockerfile-release
|
||||
rm -f ./bin/Dockerfile-release*
|
||||
rm -rf ./bin/etcd*
|
||||
rm -rf ./default.etcd
|
||||
rm -rf ./tests/e2e/default.etcd
|
||||
rm -rf ./release
|
||||
rm -rf ./coverage/*.err ./coverage/*.out
|
||||
rm -rf ./tests/e2e/default.proxy
|
||||
rm -rf ./bin/shellcheck*
|
||||
find ./ -name "127.0.0.1:*" -o -name "localhost:*" -o -name "*.log" -o -name "agent-*" -o -name "*.coverprofile" -o -name "testname-proxy-*" -delete
|
||||
find ./ -name "127.0.0.1:*" -o -name "localhost:*" -o -name "*.log" -o -name "agent-*" -o -name "*.coverprofile" -o -name "testname-proxy-*" | $(XARGS)
|
||||
|
||||
docker-clean:
|
||||
docker images
|
||||
docker image prune --force
|
||||
|
||||
docker-start:
|
||||
service docker restart
|
||||
|
||||
docker-kill:
|
||||
docker kill `docker ps -q` || true
|
||||
|
||||
docker-remove:
|
||||
docker rm --force `docker ps -a -q` || true
|
||||
docker rmi --force `docker images -q` || true
|
||||
|
||||
|
||||
|
||||
GO_VERSION ?= 1.19.9
|
||||
ETCD_VERSION ?= $(shell git rev-parse --short HEAD || echo "GitNotFound")
|
||||
|
||||
TEST_SUFFIX = $(shell date +%s | base64 | head -c 15)
|
||||
TEST_OPTS ?= PASSES='unit'
|
||||
|
||||
TMP_DIR_MOUNT_FLAG = --tmpfs=/tmp:exec
|
||||
ifdef HOST_TMP_DIR
|
||||
TMP_DIR_MOUNT_FLAG = --mount type=bind,source=$(HOST_TMP_DIR),destination=/tmp
|
||||
endif
|
||||
|
||||
|
||||
TMP_DOCKERFILE:=$(shell mktemp)
|
||||
|
||||
# Example:
|
||||
# GO_VERSION=1.14.3 make build-docker-test
|
||||
# make build-docker-test
|
||||
#
|
||||
# gcloud auth configure-docker
|
||||
# GO_VERSION=1.14.3 make push-docker-test
|
||||
# make push-docker-test
|
||||
#
|
||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||
# make pull-docker-test
|
||||
|
||||
build-docker-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
@sed 's|REPLACE_ME_GO_VERSION|$(GO_VERSION)|g' ./tests/Dockerfile > $(TMP_DOCKERFILE)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd-test:go$(GO_VERSION) \
|
||||
--file $(TMP_DOCKERFILE) .
|
||||
|
||||
push-docker-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd-test:go$(GO_VERSION)
|
||||
|
||||
pull-docker-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker pull gcr.io/etcd-development/etcd-test:go$(GO_VERSION)
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make build-docker-test
|
||||
# make compile-with-docker-test
|
||||
# make compile-setup-gopath-with-docker-test
|
||||
|
||||
compile-with-docker-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker run \
|
||||
--rm \
|
||||
--mount type=bind,source=`pwd`,destination=/go/src/go.etcd.io/etcd \
|
||||
gcr.io/etcd-development/etcd-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "GO_BUILD_FLAGS=-v GOOS=linux GOARCH=amd64 ./build.sh && ./bin/etcd --version"
|
||||
|
||||
compile-setup-gopath-with-docker-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker run \
|
||||
--rm \
|
||||
--mount type=bind,source=`pwd`,destination=/etcd \
|
||||
gcr.io/etcd-development/etcd-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && ETCD_SETUP_GOPATH=1 GO_BUILD_FLAGS=-v GOOS=linux GOARCH=amd64 ./build.sh && ./bin/etcd --version && rm -rf ./gopath"
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
#
|
||||
# Local machine:
|
||||
# TEST_OPTS="PASSES='fmt'" make test
|
||||
# TEST_OPTS="PASSES='fmt bom dep build unit'" make test
|
||||
# TEST_OPTS="PASSES='build unit release integration_e2e functional'" make test
|
||||
# TEST_OPTS="PASSES='build grpcproxy'" make test
|
||||
#
|
||||
# Example (test with docker):
|
||||
# make pull-docker-test
|
||||
# TEST_OPTS="PASSES='fmt'" make docker-test
|
||||
# TEST_OPTS="VERBOSE=2 PASSES='unit'" make docker-test
|
||||
#
|
||||
# Travis CI (test with docker):
|
||||
# TEST_OPTS="PASSES='fmt bom dep build unit'" make docker-test
|
||||
#
|
||||
# Semaphore CI (test with docker):
|
||||
# TEST_OPTS="PASSES='build unit release integration_e2e functional'" make docker-test
|
||||
# HOST_TMP_DIR=/tmp TEST_OPTS="PASSES='build unit release integration_e2e functional'" make docker-test
|
||||
# TEST_OPTS="GOARCH=386 PASSES='build unit integration_e2e'" make docker-test
|
||||
#
|
||||
# grpc-proxy tests (test with docker):
|
||||
# TEST_OPTS="PASSES='build grpcproxy'" make docker-test
|
||||
# HOST_TMP_DIR=/tmp TEST_OPTS="PASSES='build grpcproxy'" make docker-test
|
||||
|
||||
.PHONY: test
|
||||
test:
|
||||
$(info TEST_OPTS: $(TEST_OPTS))
|
||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||
$(TEST_OPTS) ./test.sh 2>&1 | tee test-$(TEST_SUFFIX).log
|
||||
! egrep "(--- FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test-$(TEST_SUFFIX).log
|
||||
|
||||
test-smoke:
|
||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||
PASSES="fmt build unit" ./test.sh 2<&1 | tee test-$(TEST_SUFFIX).log
|
||||
|
||||
test-full:
|
||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||
PASSES="fmt build release unit integration functional e2e grpcproxy" ./test.sh 2<&1 | tee test-$(TEST_SUFFIX).log
|
||||
|
||||
ensure-docker-test-image-exists:
|
||||
make pull-docker-test || ( echo "WARNING: Container Image not found in registry, building locally"; make build-docker-test )
|
||||
|
||||
docker-test: ensure-docker-test-image-exists
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
$(info TEST_OPTS: $(TEST_OPTS))
|
||||
$(info log-file: test-$(TEST_SUFFIX).log)
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`,destination=/go/src/go.etcd.io/etcd \
|
||||
gcr.io/etcd-development/etcd-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "$(TEST_OPTS) ./test.sh 2>&1 | tee test-$(TEST_SUFFIX).log"
|
||||
! egrep "(--- FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test-$(TEST_SUFFIX).log
|
||||
|
||||
docker-test-coverage:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
$(info log-file: docker-test-coverage-$(TEST_SUFFIX).log)
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`,destination=/go/src/go.etcd.io/etcd \
|
||||
gcr.io/etcd-development/etcd-test:go$(GO_VERSION) \
|
||||
/bin/bash ./scripts/codecov_upload.sh docker-test-coverage-$(TEST_SUFFIX).log \
|
||||
! egrep "(--- FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 docker-test-coverage-$(TEST_SUFFIX).log
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make compile-with-docker-test
|
||||
# ETCD_VERSION=v3-test make build-docker-release-main
|
||||
# ETCD_VERSION=v3-test make push-docker-release-main
|
||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||
|
||||
build-docker-release-main:
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
cp ./Dockerfile-release.$(ARCH) ./bin/Dockerfile-release.$(ARCH)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd:$(ETCD_VERSION) \
|
||||
--file ./bin/Dockerfile-release.$(ARCH) \
|
||||
./bin
|
||||
rm -f ./bin/Dockerfile-release.$(ARCH)
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
gcr.io/etcd-development/etcd:$(ETCD_VERSION) \
|
||||
/bin/sh -c "/usr/local/bin/etcd --version && /usr/local/bin/etcdctl version && /usr/local/bin/etcdutl version"
|
||||
|
||||
push-docker-release-main:
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd:$(ETCD_VERSION)
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make build-docker-test
|
||||
# make compile-with-docker-test
|
||||
# make build-docker-static-ip-test
|
||||
#
|
||||
# gcloud auth configure-docker
|
||||
# make push-docker-static-ip-test
|
||||
#
|
||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||
# make pull-docker-static-ip-test
|
||||
#
|
||||
# make docker-static-ip-test-certs-run
|
||||
# make docker-static-ip-test-certs-metrics-proxy-run
|
||||
|
||||
build-docker-static-ip-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
@sed 's|REPLACE_ME_GO_VERSION|$(GO_VERSION)|g' ./tests/docker-static-ip/Dockerfile > $(TMP_DOCKERFILE)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd-static-ip-test:go$(GO_VERSION) \
|
||||
--file ./tests/docker-static-ip/Dockerfile \
|
||||
$(TMP_DOCKERFILE)
|
||||
|
||||
push-docker-static-ip-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd-static-ip-test:go$(GO_VERSION)
|
||||
|
||||
pull-docker-static-ip-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker pull gcr.io/etcd-development/etcd-static-ip-test:go$(GO_VERSION)
|
||||
|
||||
docker-static-ip-test-certs-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-static-ip/certs,destination=/certs \
|
||||
gcr.io/etcd-development/etcd-static-ip-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-static-ip-test-certs-metrics-proxy-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-static-ip/certs-metrics-proxy,destination=/certs-metrics-proxy \
|
||||
gcr.io/etcd-development/etcd-static-ip-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-metrics-proxy/run.sh && rm -rf m*.etcd"
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make build-docker-test
|
||||
# make compile-with-docker-test
|
||||
# make build-docker-dns-test
|
||||
#
|
||||
# gcloud auth configure-docker
|
||||
# make push-docker-dns-test
|
||||
#
|
||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||
# make pull-docker-dns-test
|
||||
#
|
||||
# make docker-dns-test-insecure-run
|
||||
# make docker-dns-test-certs-run
|
||||
# make docker-dns-test-certs-gateway-run
|
||||
# make docker-dns-test-certs-wildcard-run
|
||||
# make docker-dns-test-certs-common-name-auth-run
|
||||
# make docker-dns-test-certs-common-name-multi-run
|
||||
# make docker-dns-test-certs-san-dns-run
|
||||
|
||||
build-docker-dns-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
@sed 's|REPLACE_ME_GO_VERSION|$(GO_VERSION)|g' ./tests/docker-dns/Dockerfile > $(TMP_DOCKERFILE)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
--file ./tests/docker-dns/Dockerfile \
|
||||
$(TMP_DOCKERFILE)
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
--dns 127.0.0.1 \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "/etc/init.d/bind9 start && cat /dev/null >/etc/hosts && dig etcd.local"
|
||||
|
||||
push-docker-dns-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION)
|
||||
|
||||
pull-docker-dns-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker pull gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION)
|
||||
|
||||
docker-dns-test-insecure-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/insecure,destination=/insecure \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /insecure/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs,destination=/certs \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-gateway-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs-gateway,destination=/certs-gateway \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-gateway/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-wildcard-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs-wildcard,destination=/certs-wildcard \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-wildcard/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-common-name-auth-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs-common-name-auth,destination=/certs-common-name-auth \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-common-name-auth/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-common-name-multi-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs-common-name-multi,destination=/certs-common-name-multi \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-common-name-multi/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-test-certs-san-dns-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns/certs-san-dns,destination=/certs-san-dns \
|
||||
gcr.io/etcd-development/etcd-dns-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-san-dns/run.sh && rm -rf m*.etcd"
|
||||
|
||||
|
||||
# Example:
|
||||
# make build-docker-test
|
||||
# make compile-with-docker-test
|
||||
# make build-docker-dns-srv-test
|
||||
# gcloud auth configure-docker
|
||||
# make push-docker-dns-srv-test
|
||||
# gsutil -m acl ch -u allUsers:R -r gs://artifacts.etcd-development.appspot.com
|
||||
# make pull-docker-dns-srv-test
|
||||
# make docker-dns-srv-test-certs-run
|
||||
# make docker-dns-srv-test-certs-gateway-run
|
||||
# make docker-dns-srv-test-certs-wildcard-run
|
||||
|
||||
build-docker-dns-srv-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
@sed 's|REPLACE_ME_GO_VERSION|$(GO_VERSION)|g' > $(TMP_DOCKERFILE)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION) \
|
||||
--file ./tests/docker-dns-srv/Dockerfile \
|
||||
$(TMP_DOCKERFILE)
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
--dns 127.0.0.1 \
|
||||
gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "/etc/init.d/bind9 start && cat /dev/null >/etc/hosts && dig +noall +answer SRV _etcd-client-ssl._tcp.etcd.local && dig +noall +answer SRV _etcd-server-ssl._tcp.etcd.local && dig +noall +answer m1.etcd.local m2.etcd.local m3.etcd.local"
|
||||
|
||||
push-docker-dns-srv-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION)
|
||||
|
||||
pull-docker-dns-srv-test:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
docker pull gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION)
|
||||
|
||||
docker-dns-srv-test-certs-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns-srv/certs,destination=/certs \
|
||||
gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-srv-test-certs-gateway-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns-srv/certs-gateway,destination=/certs-gateway \
|
||||
gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-gateway/run.sh && rm -rf m*.etcd"
|
||||
|
||||
docker-dns-srv-test-certs-wildcard-run:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info HOST_TMP_DIR: $(HOST_TMP_DIR))
|
||||
$(info TMP_DIR_MOUNT_FLAG: $(TMP_DIR_MOUNT_FLAG))
|
||||
docker run \
|
||||
--rm \
|
||||
--tty \
|
||||
--dns 127.0.0.1 \
|
||||
$(TMP_DIR_MOUNT_FLAG) \
|
||||
--mount type=bind,source=`pwd`/bin,destination=/etcd \
|
||||
--mount type=bind,source=`pwd`/tests/docker-dns-srv/certs-wildcard,destination=/certs-wildcard \
|
||||
gcr.io/etcd-development/etcd-dns-srv-test:go$(GO_VERSION) \
|
||||
/bin/bash -c "cd /etcd && /certs-wildcard/run.sh && rm -rf m*.etcd"
|
||||
|
||||
|
||||
|
||||
# Example:
|
||||
# make build-functional
|
||||
# make build-docker-functional
|
||||
# make push-docker-functional
|
||||
# make pull-docker-functional
|
||||
|
||||
build-functional:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
./tests/functional/build
|
||||
./bin/etcd-agent -help || true && \
|
||||
./bin/etcd-proxy -help || true && \
|
||||
./bin/etcd-runner --help || true && \
|
||||
./bin/etcd-tester -help || true
|
||||
|
||||
build-docker-functional:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
@sed 's|REPLACE_ME_GO_VERSION|$(GO_VERSION)|g' > $(TMP_DOCKERFILE)
|
||||
docker build \
|
||||
--network=host \
|
||||
--tag gcr.io/etcd-development/etcd-functional:go$(GO_VERSION) \
|
||||
--file ./tests/functional/Dockerfile \
|
||||
.
|
||||
@mv ./tests/functional/Dockerfile.bak ./tests/functional/Dockerfile
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
gcr.io/etcd-development/etcd-functional:go$(GO_VERSION) \
|
||||
/bin/bash -c "./bin/etcd --version && \
|
||||
./bin/etcd-failpoints --version && \
|
||||
./bin/etcdctl version && \
|
||||
./bin/etcdutl version && \
|
||||
./bin/etcd-agent -help || true && \
|
||||
./bin/etcd-proxy -help || true && \
|
||||
./bin/etcd-runner --help || true && \
|
||||
./bin/etcd-tester -help || true && \
|
||||
./bin/benchmark --help || true"
|
||||
|
||||
push-docker-functional:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
docker push gcr.io/etcd-development/etcd-functional:go$(GO_VERSION)
|
||||
|
||||
pull-docker-functional:
|
||||
$(info GO_VERSION: $(GO_VERSION))
|
||||
$(info ETCD_VERSION: $(ETCD_VERSION))
|
||||
docker pull gcr.io/etcd-development/etcd-functional:go$(GO_VERSION)
|
||||
|
|
21
Procfile
21
Procfile
|
@ -1,4 +1,4 @@
|
|||
# Use goreman to run `go install github.com/mattn/goreman@latest`
|
||||
# Use goreman to run `go get github.com/mattn/goreman`
|
||||
# Change the path of bin/etcd if etcd is located elsewhere
|
||||
|
||||
etcd1: bin/etcd --name infra1 --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 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
|
||||
|
@ -6,21 +6,4 @@ etcd2: bin/etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --adve
|
|||
etcd3: bin/etcd --name infra3 --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 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
|
||||
#proxy: bin/etcd grpc-proxy start --endpoints=127.0.0.1:2379,127.0.0.1:22379,127.0.0.1:32379 --listen-addr=127.0.0.1:23790 --advertise-client-url=127.0.0.1:23790 --enable-pprof
|
||||
|
||||
# A learner node can be started using the below Procfile.learner (uncomment and run)
|
||||
|
||||
# Use goreman to run `go install github.com/mattn/goreman@latest`
|
||||
|
||||
# 1. Start the cluster using Procfile
|
||||
# 2. Add learner node to the cluster
|
||||
# % etcdctl member add infra4 --peer-urls="http://127.0.0.1:42380" --learner=true
|
||||
|
||||
# 3. Start learner node with goreman
|
||||
# Change the path of bin/etcd if etcd is located elsewhere
|
||||
|
||||
# uncomment below to setup
|
||||
|
||||
# etcd4: bin/etcd --name infra4 --listen-client-urls http://127.0.0.1:42379 --advertise-client-urls http://127.0.0.1:42379 --listen-peer-urls http://127.0.0.1:42380 --initial-advertise-peer-urls http://127.0.0.1:42380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra4=http://127.0.0.1:42380,infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state existing --enable-pprof --logger=zap --log-outputs=stderr
|
||||
|
||||
# 4. The learner node can be promoted to voting member by the command
|
||||
# % etcdctl member promote <memberid>
|
||||
|
||||
# A learner node can be started using Procfile.learner
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Use goreman to run `go get github.com/mattn/goreman`
|
||||
|
||||
# 1. Start the cluster using Procfile
|
||||
# 2. Add learner node to the cluster
|
||||
# % etcdctl member add infra4 --peer-urls="http://127.0.0.1:42380" --learner=true
|
||||
|
||||
# 3. Start learner node with goreman
|
||||
# Change the path of bin/etcd if etcd is located elsewhere
|
||||
etcd4: bin/etcd --name infra4 --listen-client-urls http://127.0.0.1:42379 --advertise-client-urls http://127.0.0.1:42379 --listen-peer-urls http://127.0.0.1:42380 --initial-advertise-peer-urls http://127.0.0.1:42380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra4=http://127.0.0.1:42380,infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state existing --enable-pprof --logger=zap --log-outputs=stderr
|
||||
|
||||
# 4. The learner node can be promoted to voting member by the command
|
||||
# % etcdctl member promote <memberid>
|
|
@ -0,0 +1,7 @@
|
|||
# Use goreman to run `go get github.com/mattn/goreman`
|
||||
# Change the path of bin/etcd if etcd is located elsewhere
|
||||
etcd1: bin/etcd --name infra1 --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 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
|
||||
etcd2: bin/etcd --name infra2 --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 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
|
||||
etcd3: bin/etcd --name infra3 --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 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof
|
||||
# in future, use proxy to listen on 2379
|
||||
#proxy: bin/etcd --name infra-proxy1 --proxy=on --listen-client-urls http://127.0.0.1:2378 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --enable-pprof
|
135
README.md
135
README.md
|
@ -1,14 +1,15 @@
|
|||
# etcd
|
||||
|
||||
[![Go Report Card](https://goreportcard.com/badge/github.com/etcd-io/etcd?style=flat-square)](https://goreportcard.com/report/github.com/etcd-io/etcd)
|
||||
[![Coverage](https://codecov.io/gh/etcd-io/etcd/branch/main/graph/badge.svg)](https://app.codecov.io/gh/etcd-io/etcd/tree/main)
|
||||
[![Coverage](https://codecov.io/gh/etcd-io/etcd/branch/master/graph/badge.svg)](https://codecov.io/gh/etcd-io/etcd)
|
||||
[![Tests](https://github.com/etcd-io/etcd/actions/workflows/tests.yaml/badge.svg)](https://github.com/etcd-io/etcd/actions/workflows/tests.yaml)
|
||||
[![asset-transparency](https://github.com/etcd-io/etcd/actions/workflows/asset-transparency.yaml/badge.svg)](https://github.com/etcd-io/etcd/actions/workflows/asset-transparency.yaml)
|
||||
[![codeql-analysis](https://github.com/etcd-io/etcd/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/etcd-io/etcd/actions/workflows/codeql-analysis.yml)
|
||||
[![self-hosted-linux-arm64-graviton2-tests](https://github.com/etcd-io/etcd/actions/workflows/self-hosted-linux-arm64-graviton2-tests.yml/badge.svg)](https://github.com/etcd-io/etcd/actions/workflows/self-hosted-linux-arm64-graviton2-tests.yml)
|
||||
[![Docs](https://img.shields.io/badge/docs-latest-green.svg)](https://etcd.io/docs)
|
||||
[![Godoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/github.com/etcd-io/etcd)
|
||||
[![Releases](https://img.shields.io/github/release/etcd-io/etcd/all.svg?style=flat-square)](https://github.com/etcd-io/etcd/releases)
|
||||
[![LICENSE](https://img.shields.io/github/license/etcd-io/etcd.svg?style=flat-square)](https://github.com/etcd-io/etcd/blob/main/LICENSE)
|
||||
[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/etcd-io/etcd/badge)](https://api.securityscorecards.dev/projects/github.com/etcd-io/etcd)
|
||||
|
||||
**Note**: The `main` branch may be in an *unstable or even broken state* during development. For stable versions, see [releases][github-release].
|
||||
|
||||
|
@ -23,14 +24,10 @@ etcd is a distributed reliable key-value store for the most critical data of a d
|
|||
|
||||
etcd is written in Go and uses the [Raft][] consensus algorithm to manage a highly-available replicated log.
|
||||
|
||||
etcd is used [in production by many companies](./ADOPTERS.md), and the development team stands behind it in critical deployment scenarios, where etcd is frequently teamed with applications such as [Kubernetes][k8s], [locksmith][], [vulcand][], [Doorman][], and many others. Reliability is further ensured by rigorous [**robustness testing**](https://github.com/etcd-io/etcd/tree/main/tests/robustness).
|
||||
etcd is used [in production by many companies](./ADOPTERS.md), and the development team stands behind it in critical deployment scenarios, where etcd is frequently teamed with applications such as [Kubernetes][k8s], [locksmith][], [vulcand][], [Doorman][], and many others. Reliability is further ensured by [**rigorous testing**](https://github.com/etcd-io/etcd/tree/main/tests/functional).
|
||||
|
||||
See [etcdctl][etcdctl] for a simple command line client.
|
||||
|
||||
![etcd reliability is important](logos/etcd-xkcd-2347.png)
|
||||
|
||||
<sub>Original image credited to xkcd.com/2347, alterations by Josh Berkus.</sub>
|
||||
|
||||
[raft]: https://raft.github.io/
|
||||
[k8s]: http://kubernetes.io/
|
||||
[doorman]: https://github.com/youtube/doorman
|
||||
|
@ -38,9 +35,46 @@ See [etcdctl][etcdctl] for a simple command line client.
|
|||
[vulcand]: https://github.com/vulcand/vulcand
|
||||
[etcdctl]: https://github.com/etcd-io/etcd/tree/main/etcdctl
|
||||
|
||||
## Maintainers
|
||||
## Community meetings
|
||||
|
||||
etcd contributors and maintainers have monthly (every four weeks) meetings at 11:00 AM (USA Pacific) on Thursday.
|
||||
|
||||
An initial agenda will be posted to the [shared Google docs][shared-meeting-notes] a day before each meeting, and everyone is welcome to suggest additional topics or other agendas.
|
||||
|
||||
[shared-meeting-notes]: https://docs.google.com/document/d/16XEGyPBisZvmmoIHSZzv__LoyOeluC5a4x353CX0SIM/edit
|
||||
|
||||
|
||||
Time:
|
||||
- [Jan 10th, 2019 11:00 AM video](https://www.youtube.com/watch?v=0Cphtbd1OSc&feature=youtu.be)
|
||||
- [Feb 7th, 2019 11:00 AM video](https://youtu.be/U80b--oAlYM)
|
||||
- [Mar 7th, 2019 11:00 AM video](https://youtu.be/w9TI5B7D1zg)
|
||||
- [Apr 4th, 2019 11:00 AM video](https://youtu.be/oqQR2XH1L_A)
|
||||
- [May 2nd, 2019 11:00 AM video](https://youtu.be/wFwQePuDWVw)
|
||||
- [May 30th, 2019 11:00 AM video](https://youtu.be/2t1R5NATYG4)
|
||||
- [Jul 11th, 2019 11:00 AM video](https://youtu.be/k_FZEipWD6Y)
|
||||
- [Jul 25, 2019 11:00 AM video](https://youtu.be/VSUJTACO93I)
|
||||
- [Aug 22, 2019 11:00 AM video](https://youtu.be/6IBQ-VxQmuM)
|
||||
- [Sep 19, 2019 11:00 AM video](https://youtu.be/SqfxU9DhBOc)
|
||||
- Nov 14, 2019 11:00 AM
|
||||
- Dec 12, 2019 11:00 AM
|
||||
- Jan 09, 2020 11:00 AM
|
||||
- Feb 06, 2020 11:00 AM
|
||||
- Mar 05, 2020 11:00 AM
|
||||
- Apr 02, 2020 11:00 AM
|
||||
- Apr 30, 2020 11:00 AM
|
||||
- May 28, 2020 11:00 AM
|
||||
- Jun 25, 2020 11:00 AM
|
||||
- Jul 23, 2020 11:00 AM
|
||||
- Aug 20, 2020 11:00 AM
|
||||
- Sep 17, 2020 11:00 AM
|
||||
- Oct 15, 2020 11:00 AM
|
||||
- Nov 12, 2020 11:00 AM
|
||||
- Dec 10, 2020 11:00 AM
|
||||
|
||||
Join Hangouts Meet: [meet.google.com/umg-nrxn-qvs](https://meet.google.com/umg-nrxn-qvs)
|
||||
|
||||
Join by phone: +1 405-792-0633 PIN: 299 906#
|
||||
|
||||
[MAINTAINERS](MAINTAINERS) strive to shape an inclusive open source project culture where users are heard and contributors feel respected and empowered. MAINTAINERS maintain productive relationships across different companies and disciplines. Read more about [MAINTAINERS role and responsibilities](Documentation/contributor-guide/community-membership.md#maintainers).
|
||||
|
||||
## Getting started
|
||||
|
||||
|
@ -50,7 +84,11 @@ The easiest way to get etcd is to use one of the pre-built release binaries whic
|
|||
|
||||
For more installation guides, please check out [play.etcd.io](http://play.etcd.io) and [operating etcd](https://etcd.io/docs/latest/op-guide).
|
||||
|
||||
For those wanting to try the very latest version, [build the latest version of etcd][dl-build] from the `main` branch. This first needs [*Go*](https://golang.org/) installed ([version 1.16+](/go.mod#L3) is required). All development occurs on `main`, including new features and bug fixes. Bug fixes are first targeted at `main` and subsequently ported to release branches, as described in the [branch management][branch-management] guide.
|
||||
|
||||
[github-release]: https://github.com/etcd-io/etcd/releases
|
||||
[branch-management]: https://etcd.io/docs/latest/branch_management
|
||||
[dl-build]: https://etcd.io/docs/latest/dl-build#build-the-latest-version
|
||||
|
||||
### Running etcd
|
||||
|
||||
|
@ -69,19 +107,25 @@ mv /tmp/etcd-download-test/etcd /usr/local/bin/
|
|||
etcd
|
||||
```
|
||||
|
||||
If etcd is [built from the main branch][dl-build], run it as below:
|
||||
|
||||
```bash
|
||||
./bin/etcd
|
||||
```
|
||||
|
||||
This will bring up etcd listening on port 2379 for client communication and on port 2380 for server-to-server communication.
|
||||
|
||||
Next, let's set a single key, and then retrieve it:
|
||||
|
||||
```bash
|
||||
```
|
||||
etcdctl put mykey "this is awesome"
|
||||
etcdctl get mykey
|
||||
```
|
||||
|
||||
etcd is now running and serving client requests. For more, please check out:
|
||||
|
||||
* [Interactive etcd playground](http://play.etcd.io)
|
||||
* [Animated quick demo](https://etcd.io/docs/latest/demo)
|
||||
- [Interactive etcd playground](http://play.etcd.io)
|
||||
- [Animated quick demo](https://etcd.io/docs/latest/demo)
|
||||
|
||||
### etcd TCP ports
|
||||
|
||||
|
@ -109,24 +153,17 @@ Follow the steps in [Procfile.learner](./Procfile.learner) to add a learner node
|
|||
goreman -f ./Procfile.learner start
|
||||
```
|
||||
|
||||
### Install etcd client v3
|
||||
|
||||
```bash
|
||||
go get go.etcd.io/etcd/client/v3
|
||||
```
|
||||
|
||||
### Next steps
|
||||
|
||||
Now it's time to dig into the full etcd API and other guides.
|
||||
|
||||
* Read the full [documentation].
|
||||
* Review etcd [frequently asked questions].
|
||||
* Explore the full gRPC [API].
|
||||
* Set up a [multi-machine cluster][clustering].
|
||||
* Learn the [config format, env variables and flags][configuration].
|
||||
* Find [language bindings and tools][integrations].
|
||||
* Use TLS to [secure an etcd cluster][security].
|
||||
* [Tune etcd][tuning].
|
||||
- Read the full [documentation][].
|
||||
- Explore the full gRPC [API][].
|
||||
- Set up a [multi-machine cluster][clustering].
|
||||
- Learn the [config format, env variables and flags][configuration].
|
||||
- Find [language bindings and tools][integrations].
|
||||
- Use TLS to [secure an etcd cluster][security].
|
||||
- [Tune etcd][tuning].
|
||||
|
||||
[documentation]: https://etcd.io/docs/latest
|
||||
[api]: https://etcd.io/docs/latest/learning/api
|
||||
|
@ -138,38 +175,18 @@ Now it's time to dig into the full etcd API and other guides.
|
|||
|
||||
## Contact
|
||||
|
||||
* Email: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
||||
* Slack: [#etcd](https://kubernetes.slack.com/messages/C3HD8ARJ5/details/) channel on Kubernetes ([get an invite](http://slack.kubernetes.io/))
|
||||
* [Community meetings](#community-meetings)
|
||||
|
||||
### Community meetings
|
||||
|
||||
etcd contributors and maintainers have monthly (every four weeks) meetings at 11:00 AM (USA Pacific) on Thursday.
|
||||
|
||||
An initial agenda will be posted to the [shared Google docs][shared-meeting-notes] a day before each meeting, and everyone is welcome to suggest additional topics or other agendas.
|
||||
|
||||
Meeting recordings are uploaded to official etcd [YouTube channel].
|
||||
|
||||
Get calendar invitation by joining [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev) mailing group.
|
||||
|
||||
Join Hangouts Meet: [meet.google.com/umg-nrxn-qvs](https://meet.google.com/umg-nrxn-qvs)
|
||||
|
||||
Join by phone: +1 405-792-0633 PIN: 299 906#
|
||||
|
||||
[shared-meeting-notes]: https://docs.google.com/document/d/16XEGyPBisZvmmoIHSZzv__LoyOeluC5a4x353CX0SIM/edit
|
||||
[YouTube channel]: https://www.youtube.com/channel/UC7tUWR24I5AR9NMsG-NYBlg
|
||||
- Mailing list: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
||||
- IRC: #[etcd](irc://irc.freenode.org:6667/#etcd) on freenode.org
|
||||
- Planning/Roadmap: [milestones](https://github.com/etcd-io/etcd/milestones), [roadmap](./ROADMAP.md)
|
||||
- Bugs: [issues](https://github.com/etcd-io/etcd/issues)
|
||||
|
||||
## Contributing
|
||||
|
||||
See [CONTRIBUTING](CONTRIBUTING.md) for details on setting up your development environment, submitting patches and the contribution workflow.
|
||||
|
||||
Please refer to [community-membership.md](Documentation/contributor-guide/community-membership.md#member) for information on becoming an etcd project member. We welcome and look forward to your contributions to the project!
|
||||
See [CONTRIBUTING](CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
|
||||
|
||||
## Reporting bugs
|
||||
|
||||
See [reporting bugs](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md) for details about reporting any issues. Before opening an issue please check it is not covered in our [frequently asked questions].
|
||||
|
||||
[frequently asked questions]: https://etcd.io/docs/latest/faq
|
||||
See [reporting bugs](https://etcd.io/docs/latest/reporting-bugs) for details about reporting any issues.
|
||||
|
||||
## Reporting a security vulnerability
|
||||
|
||||
|
@ -177,24 +194,16 @@ See [security disclosure and release process](security/README.md) for details on
|
|||
|
||||
## Issue and PR management
|
||||
|
||||
See [issue triage guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/triage_issues.md) for details on how issues are managed.
|
||||
See [issue triage guidelines](https://etcd.io/docs/current/triage/issues/) for details on how issues are managed.
|
||||
|
||||
See [PR management](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/triage_prs.md) for guidelines on how pull requests are managed.
|
||||
See [PR management](https://etcd.io/docs/current/triage/prs/) for guidelines on how pull requests are managed.
|
||||
|
||||
## etcd Emeritus Maintainers
|
||||
|
||||
These emeritus maintainers dedicated a part of their career to etcd and reviewed code, triaged bugs and pushed the project forward over a substantial period of time. Their contribution is greatly appreciated.
|
||||
These emeritus maintainers dedicated a part of their career to etcd and reviewed code, triaged bugs, and pushed the project forward over a substantial period of time. Their contribution is greatly appreciated.
|
||||
|
||||
* Fanmin Shi
|
||||
* Anthony Romano
|
||||
* Brandon Philips
|
||||
* Joe Betz
|
||||
* Gyuho Lee
|
||||
* Jingyi Hu
|
||||
* Wenjia Zhang
|
||||
* Xiang Li
|
||||
* Ben Darnell
|
||||
* Sam Batschelet
|
||||
|
||||
### License
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
# etcd roadmap
|
||||
|
||||
**work in progress**
|
||||
|
||||
This document defines a high level roadmap for etcd development.
|
||||
|
||||
The dates below should not be considered authoritative, but rather indicative of the projected timeline of the project. The [milestones defined in GitHub](https://github.com/etcd-io/etcd/milestones) represent the most up-to-date and issue-for-issue plans.
|
||||
|
||||
etcd 3.3 is our current stable branch. The roadmap below outlines new features that will be added to etcd, and while subject to change, define what future stable will look like.
|
||||
|
||||
### etcd 3.4 (2019)
|
||||
|
||||
- Stabilization of 3.3 experimental features
|
||||
- Support/document downgrade
|
||||
- Snapshot restore as Go library
|
||||
- Improved client balancer with new gRPC balancer interface
|
||||
- Improve single-client put performance
|
||||
- Improve large response handling
|
||||
- Improve test coverage
|
||||
- Decrease test runtime
|
||||
- Migrate to Go module for dependency management
|
|
@ -21,7 +21,6 @@ import (
|
|||
"google.golang.org/grpc"
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/grpclog"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
|
@ -32,7 +31,6 @@ var _ status.Status
|
|||
var _ = runtime.String
|
||||
var _ = utilities.NewDoubleArray
|
||||
var _ = descriptor.ForMessage
|
||||
var _ = metadata.Join
|
||||
|
||||
func request_KV_Range_0(ctx context.Context, marshaler runtime.Marshaler, client etcdserverpb.KVClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
|
||||
var protoReq etcdserverpb.RangeRequest
|
||||
|
@ -1560,14 +1558,11 @@ func local_request_Auth_RoleRevokePermission_0(ctx context.Context, marshaler ru
|
|||
// etcdserverpb.RegisterKVHandlerServer registers the http handlers for service KV to "mux".
|
||||
// UnaryRPC :call etcdserverpb.KVServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterKVHandlerFromEndpoint instead.
|
||||
func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.KVServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_KV_Range_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1575,7 +1570,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_KV_Range_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1589,8 +1583,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
mux.Handle("POST", pattern_KV_Put_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1598,7 +1590,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_KV_Put_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1612,8 +1603,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
mux.Handle("POST", pattern_KV_DeleteRange_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1621,7 +1610,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_KV_DeleteRange_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1635,8 +1623,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
mux.Handle("POST", pattern_KV_Txn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1644,7 +1630,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_KV_Txn_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1658,8 +1643,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
mux.Handle("POST", pattern_KV_Compact_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1667,7 +1650,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_KV_Compact_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1684,7 +1666,6 @@ func RegisterKVHandlerServer(ctx context.Context, mux *runtime.ServeMux, server
|
|||
// etcdserverpb.RegisterWatchHandlerServer registers the http handlers for service Watch to "mux".
|
||||
// UnaryRPC :call etcdserverpb.WatchServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterWatchHandlerFromEndpoint instead.
|
||||
func RegisterWatchHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.WatchServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_Watch_Watch_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
|
@ -1700,14 +1681,11 @@ func RegisterWatchHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
// etcdserverpb.RegisterLeaseHandlerServer registers the http handlers for service Lease to "mux".
|
||||
// UnaryRPC :call etcdserverpb.LeaseServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterLeaseHandlerFromEndpoint instead.
|
||||
func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.LeaseServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_Lease_LeaseGrant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1715,7 +1693,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseGrant_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1729,8 +1706,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseRevoke_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1738,7 +1713,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseRevoke_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1752,8 +1726,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseRevoke_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1761,7 +1733,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseRevoke_1(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1782,8 +1753,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseTimeToLive_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1791,7 +1760,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseTimeToLive_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1805,8 +1773,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseTimeToLive_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1814,7 +1780,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseTimeToLive_1(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1828,8 +1793,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseLeases_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1837,7 +1800,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseLeases_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1851,8 +1813,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
mux.Handle("POST", pattern_Lease_LeaseLeases_1, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1860,7 +1820,6 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Lease_LeaseLeases_1(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1877,14 +1836,11 @@ func RegisterLeaseHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
|
|||
// etcdserverpb.RegisterClusterHandlerServer registers the http handlers for service Cluster to "mux".
|
||||
// UnaryRPC :call etcdserverpb.ClusterServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterClusterHandlerFromEndpoint instead.
|
||||
func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.ClusterServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_Cluster_MemberAdd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1892,7 +1848,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Cluster_MemberAdd_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1906,8 +1861,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
mux.Handle("POST", pattern_Cluster_MemberRemove_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1915,7 +1868,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Cluster_MemberRemove_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1929,8 +1881,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
mux.Handle("POST", pattern_Cluster_MemberUpdate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1938,7 +1888,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Cluster_MemberUpdate_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1952,8 +1901,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
mux.Handle("POST", pattern_Cluster_MemberList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1961,7 +1908,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Cluster_MemberList_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -1975,8 +1921,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
mux.Handle("POST", pattern_Cluster_MemberPromote_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -1984,7 +1928,6 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Cluster_MemberPromote_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2001,14 +1944,11 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se
|
|||
// etcdserverpb.RegisterMaintenanceHandlerServer registers the http handlers for service Maintenance to "mux".
|
||||
// UnaryRPC :call etcdserverpb.MaintenanceServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterMaintenanceHandlerFromEndpoint instead.
|
||||
func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.MaintenanceServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_Maintenance_Alarm_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2016,7 +1956,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_Alarm_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2030,8 +1969,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2039,7 +1976,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_Status_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2053,8 +1989,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_Defragment_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2062,7 +1996,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_Defragment_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2076,8 +2009,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_Hash_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2085,7 +2016,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_Hash_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2099,8 +2029,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_HashKV_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2108,7 +2036,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_HashKV_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2129,8 +2056,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_MoveLeader_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2138,7 +2063,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_MoveLeader_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2152,8 +2076,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
mux.Handle("POST", pattern_Maintenance_Downgrade_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2161,7 +2083,6 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Maintenance_Downgrade_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2178,14 +2099,11 @@ func RegisterMaintenanceHandlerServer(ctx context.Context, mux *runtime.ServeMux
|
|||
// etcdserverpb.RegisterAuthHandlerServer registers the http handlers for service Auth to "mux".
|
||||
// UnaryRPC :call etcdserverpb.AuthServer directly.
|
||||
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
|
||||
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterAuthHandlerFromEndpoint instead.
|
||||
func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, server etcdserverpb.AuthServer) error {
|
||||
|
||||
mux.Handle("POST", pattern_Auth_AuthEnable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2193,7 +2111,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_AuthEnable_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2207,8 +2124,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_AuthDisable_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2216,7 +2131,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_AuthDisable_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2230,8 +2144,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_AuthStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2239,7 +2151,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_AuthStatus_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2253,8 +2164,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_Authenticate_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2262,7 +2171,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_Authenticate_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2276,8 +2184,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserAdd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2285,7 +2191,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserAdd_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2299,8 +2204,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2308,7 +2211,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserGet_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2322,8 +2224,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2331,7 +2231,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserList_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2345,8 +2244,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2354,7 +2251,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserDelete_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2368,8 +2264,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserChangePassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2377,7 +2271,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserChangePassword_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2391,8 +2284,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserGrantRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2400,7 +2291,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserGrantRole_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2414,8 +2304,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_UserRevokeRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2423,7 +2311,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_UserRevokeRole_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2437,8 +2324,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleAdd_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2446,7 +2331,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleAdd_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2460,8 +2344,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleGet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2469,7 +2351,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleGet_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2483,8 +2364,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleList_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2492,7 +2371,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleList_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2506,8 +2384,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleDelete_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2515,7 +2391,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleDelete_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2529,8 +2404,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleGrantPermission_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2538,7 +2411,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleGrantPermission_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
@ -2552,8 +2424,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
mux.Handle("POST", pattern_Auth_RoleRevokePermission_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
|
||||
ctx, cancel := context.WithCancel(req.Context())
|
||||
defer cancel()
|
||||
var stream runtime.ServerTransportStream
|
||||
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
|
||||
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
|
||||
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
|
||||
if err != nil {
|
||||
|
@ -2561,7 +2431,6 @@ func RegisterAuthHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve
|
|||
return
|
||||
}
|
||||
resp, md, err := local_request_Auth_RoleRevokePermission_0(rctx, inboundMarshaler, server, req, pathParams)
|
||||
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
|
||||
ctx = runtime.NewServerMetadataContext(ctx, md)
|
||||
if err != nil {
|
||||
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
|
||||
|
|
|
@ -12,7 +12,6 @@ import (
|
|||
_ "github.com/gogo/protobuf/gogoproto"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
membershippb "go.etcd.io/etcd/api/v3/membershippb"
|
||||
_ "go.etcd.io/etcd/api/v3/versionpb"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -238,73 +237,70 @@ func init() {
|
|||
func init() { proto.RegisterFile("raft_internal.proto", fileDescriptor_b4c9a9be0cfca103) }
|
||||
|
||||
var fileDescriptor_b4c9a9be0cfca103 = []byte{
|
||||
// 1054 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x56, 0x5d, 0x6f, 0x1b, 0x45,
|
||||
0x14, 0xad, 0xd3, 0x34, 0x89, 0xc7, 0x49, 0x9a, 0x4e, 0x52, 0x3a, 0x38, 0x92, 0x71, 0x03, 0x2d,
|
||||
0x01, 0x8a, 0x53, 0x1c, 0x78, 0xe1, 0x05, 0x5c, 0x3b, 0x4a, 0x83, 0x4a, 0x15, 0x6d, 0x0b, 0xaa,
|
||||
0x84, 0xd0, 0x32, 0xde, 0xbd, 0xb1, 0xb7, 0x59, 0xef, 0x2e, 0x33, 0x63, 0x37, 0x7d, 0xe5, 0x91,
|
||||
0x67, 0x40, 0xfc, 0x0c, 0x3e, 0xff, 0x43, 0x85, 0xf8, 0x28, 0xf0, 0x07, 0x20, 0xbc, 0xf0, 0x0e,
|
||||
0xbc, 0xa3, 0xf9, 0xd8, 0x5d, 0xaf, 0x3d, 0xce, 0xdb, 0xfa, 0xde, 0x73, 0xcf, 0x39, 0x33, 0x73,
|
||||
0xef, 0x78, 0xd0, 0x3a, 0xa3, 0x47, 0xc2, 0x0d, 0x22, 0x01, 0x2c, 0xa2, 0x61, 0x23, 0x61, 0xb1,
|
||||
0x88, 0xf1, 0x32, 0x08, 0xcf, 0xe7, 0xc0, 0x46, 0xc0, 0x92, 0x6e, 0x75, 0xa3, 0x17, 0xf7, 0x62,
|
||||
0x95, 0xd8, 0x91, 0x5f, 0x1a, 0x53, 0x5d, 0xcb, 0x31, 0x26, 0x52, 0x66, 0x89, 0x67, 0x3e, 0xeb,
|
||||
0x32, 0xb9, 0x43, 0x93, 0x60, 0x67, 0x04, 0x8c, 0x07, 0x71, 0x94, 0x74, 0xd3, 0x2f, 0x83, 0xb8,
|
||||
0x9e, 0x21, 0x06, 0x30, 0xe8, 0x02, 0xe3, 0xfd, 0x20, 0x49, 0xba, 0x63, 0x3f, 0x34, 0x6e, 0x8b,
|
||||
0xa1, 0x15, 0x07, 0x3e, 0x1e, 0x02, 0x17, 0xb7, 0x81, 0xfa, 0xc0, 0xf0, 0x2a, 0x9a, 0x3b, 0xe8,
|
||||
0x90, 0x52, 0xbd, 0xb4, 0x3d, 0xef, 0xcc, 0x1d, 0x74, 0x70, 0x15, 0x2d, 0x0d, 0xb9, 0x34, 0x3f,
|
||||
0x00, 0x32, 0x57, 0x2f, 0x6d, 0x97, 0x9d, 0xec, 0x37, 0xbe, 0x81, 0x56, 0xe8, 0x50, 0xf4, 0x5d,
|
||||
0x06, 0xa3, 0x40, 0x6a, 0x93, 0xf3, 0xb2, 0xec, 0xd6, 0xe2, 0xa7, 0xdf, 0x93, 0xf3, 0xbb, 0x8d,
|
||||
0xd7, 0x9c, 0x65, 0x99, 0x75, 0x4c, 0xf2, 0xcd, 0xc5, 0x4f, 0x54, 0xf8, 0xe6, 0xd6, 0x0f, 0x18,
|
||||
0xad, 0x1f, 0x98, 0x1d, 0x71, 0xe8, 0x91, 0x30, 0x06, 0xf0, 0x2e, 0x5a, 0xe8, 0x2b, 0x13, 0xc4,
|
||||
0xaf, 0x97, 0xb6, 0x2b, 0xcd, 0xcd, 0xc6, 0xf8, 0x3e, 0x35, 0x0a, 0x3e, 0x1d, 0x03, 0x9d, 0xf2,
|
||||
0x7b, 0x0d, 0xcd, 0x8d, 0x9a, 0xca, 0x69, 0xa5, 0x79, 0xd9, 0x4a, 0xe0, 0xcc, 0x8d, 0x9a, 0xf8,
|
||||
0x26, 0xba, 0xc0, 0x68, 0xd4, 0x03, 0x65, 0xb9, 0xd2, 0xac, 0x4e, 0x20, 0x65, 0x2a, 0x85, 0x6b,
|
||||
0x20, 0x7e, 0x19, 0x9d, 0x4f, 0x86, 0x82, 0xcc, 0x2b, 0x3c, 0x29, 0xe2, 0x0f, 0x87, 0xe9, 0x22,
|
||||
0x1c, 0x09, 0xc2, 0x6d, 0xb4, 0xec, 0x43, 0x08, 0x02, 0x5c, 0x2d, 0x72, 0x41, 0x15, 0xd5, 0x8b,
|
||||
0x45, 0x1d, 0x85, 0x28, 0x48, 0x55, 0xfc, 0x3c, 0x26, 0x05, 0xc5, 0x49, 0x44, 0x16, 0x6c, 0x82,
|
||||
0xf7, 0x4f, 0xa2, 0x4c, 0x50, 0x9c, 0x44, 0xf8, 0x2d, 0x84, 0xbc, 0x78, 0x90, 0x50, 0x4f, 0xc8,
|
||||
0x63, 0x58, 0x54, 0x25, 0xcf, 0x15, 0x4b, 0xda, 0x59, 0x3e, 0xad, 0x1c, 0x2b, 0xc1, 0x6f, 0xa3,
|
||||
0x4a, 0x08, 0x94, 0x83, 0xdb, 0x63, 0x34, 0x12, 0x64, 0xc9, 0xc6, 0x70, 0x47, 0x02, 0xf6, 0x65,
|
||||
0x3e, 0x63, 0x08, 0xb3, 0x90, 0x5c, 0xb3, 0x66, 0x60, 0x30, 0x8a, 0x8f, 0x81, 0x94, 0x6d, 0x6b,
|
||||
0x56, 0x14, 0x8e, 0x02, 0x64, 0x6b, 0x0e, 0xf3, 0x98, 0x3c, 0x16, 0x1a, 0x52, 0x36, 0x20, 0xc8,
|
||||
0x76, 0x2c, 0x2d, 0x99, 0xca, 0x8e, 0x45, 0x01, 0xf1, 0x03, 0xb4, 0xa6, 0x65, 0xbd, 0x3e, 0x78,
|
||||
0xc7, 0x49, 0x1c, 0x44, 0x82, 0x54, 0x54, 0xf1, 0x0b, 0x16, 0xe9, 0x76, 0x06, 0x32, 0x34, 0x69,
|
||||
0xb3, 0xbe, 0xee, 0x5c, 0x0c, 0x8b, 0x00, 0xdc, 0x42, 0x15, 0xd5, 0xdd, 0x10, 0xd1, 0x6e, 0x08,
|
||||
0xe4, 0x6f, 0xeb, 0xae, 0xb6, 0x86, 0xa2, 0xbf, 0xa7, 0x00, 0xd9, 0x9e, 0xd0, 0x2c, 0x84, 0x3b,
|
||||
0x48, 0x8d, 0x80, 0xeb, 0x07, 0x5c, 0x71, 0xfc, 0xb3, 0x68, 0xdb, 0x14, 0xc9, 0xd1, 0xd1, 0x88,
|
||||
0x6c, 0x53, 0x68, 0x1e, 0xc3, 0xef, 0x18, 0x23, 0x5c, 0x50, 0x31, 0xe4, 0xe4, 0xbf, 0x99, 0x46,
|
||||
0xee, 0x29, 0xc0, 0xc4, 0xca, 0xde, 0xd0, 0x8e, 0x74, 0x0e, 0xdf, 0xd5, 0x8e, 0x20, 0x12, 0x81,
|
||||
0x47, 0x05, 0x90, 0x7f, 0x35, 0xd9, 0x4b, 0x45, 0xb2, 0x74, 0x3a, 0x5b, 0x63, 0xd0, 0xd4, 0x5a,
|
||||
0xa1, 0x1e, 0xef, 0x99, 0x2b, 0x40, 0xde, 0x09, 0x2e, 0xf5, 0x7d, 0xf2, 0xe3, 0xd2, 0xac, 0x25,
|
||||
0xbe, 0xc7, 0x81, 0xb5, 0x7c, 0xbf, 0xb0, 0x44, 0x13, 0xc3, 0x77, 0xd1, 0x5a, 0x4e, 0xa3, 0x87,
|
||||
0x80, 0xfc, 0xa4, 0x99, 0x9e, 0xb7, 0x33, 0x99, 0xe9, 0x31, 0x64, 0xab, 0xb4, 0x10, 0x2e, 0xda,
|
||||
0xea, 0x81, 0x20, 0x3f, 0x9f, 0x69, 0x6b, 0x1f, 0xc4, 0x94, 0xad, 0x7d, 0x10, 0xb8, 0x87, 0x9e,
|
||||
0xcd, 0x69, 0xbc, 0xbe, 0x1c, 0x4b, 0x37, 0xa1, 0x9c, 0x3f, 0x8a, 0x99, 0x4f, 0x7e, 0xd1, 0x94,
|
||||
0xaf, 0xd8, 0x29, 0xdb, 0x0a, 0x7d, 0x68, 0xc0, 0x29, 0xfb, 0x33, 0xd4, 0x9a, 0xc6, 0x0f, 0xd0,
|
||||
0xc6, 0x98, 0x5f, 0x39, 0x4f, 0x2e, 0x8b, 0x43, 0x20, 0x4f, 0xb5, 0xc6, 0xf5, 0x19, 0xb6, 0xd5,
|
||||
0x2c, 0xc6, 0x79, 0xdb, 0x5c, 0xa2, 0x93, 0x19, 0xfc, 0x01, 0xba, 0x9c, 0x33, 0xeb, 0xd1, 0xd4,
|
||||
0xd4, 0xbf, 0x6a, 0xea, 0x17, 0xed, 0xd4, 0x66, 0x46, 0xc7, 0xb8, 0x31, 0x9d, 0x4a, 0xe1, 0xdb,
|
||||
0x68, 0x35, 0x27, 0x0f, 0x03, 0x2e, 0xc8, 0x6f, 0x9a, 0xf5, 0xaa, 0x9d, 0xf5, 0x4e, 0xc0, 0x45,
|
||||
0xa1, 0x8f, 0xd2, 0x60, 0xc6, 0x24, 0xad, 0x69, 0xa6, 0xdf, 0x67, 0x32, 0x49, 0xe9, 0x29, 0xa6,
|
||||
0x34, 0x98, 0x1d, 0xbd, 0x62, 0x92, 0x1d, 0xf9, 0x55, 0x79, 0xd6, 0xd1, 0xcb, 0x9a, 0xc9, 0x8e,
|
||||
0x34, 0xb1, 0xac, 0x23, 0x15, 0x8d, 0xe9, 0xc8, 0xaf, 0xcb, 0xb3, 0x3a, 0x52, 0x56, 0x59, 0x3a,
|
||||
0x32, 0x0f, 0x17, 0x6d, 0xc9, 0x8e, 0xfc, 0xe6, 0x4c, 0x5b, 0x93, 0x1d, 0x69, 0x62, 0xf8, 0x21,
|
||||
0xaa, 0x8e, 0xd1, 0xa8, 0x46, 0x49, 0x80, 0x0d, 0x02, 0xae, 0xfe, 0x7f, 0xbf, 0xd5, 0x9c, 0x37,
|
||||
0x66, 0x70, 0x4a, 0xf8, 0x61, 0x86, 0x4e, 0xf9, 0xaf, 0x50, 0x7b, 0x1e, 0x0f, 0xd0, 0x66, 0xae,
|
||||
0x65, 0x5a, 0x67, 0x4c, 0xec, 0x3b, 0x2d, 0xf6, 0xaa, 0x5d, 0x4c, 0x77, 0xc9, 0xb4, 0x1a, 0xa1,
|
||||
0x33, 0x00, 0xf8, 0x23, 0xb4, 0xee, 0x85, 0x43, 0x2e, 0x80, 0xb9, 0xe6, 0x2d, 0xe3, 0x72, 0x10,
|
||||
0xe4, 0x33, 0x64, 0x46, 0x60, 0xfc, 0x21, 0xd3, 0x68, 0x6b, 0xe4, 0xfb, 0x1a, 0x78, 0x0f, 0xc4,
|
||||
0xd4, 0xad, 0x77, 0xc9, 0x9b, 0x84, 0xe0, 0x87, 0xe8, 0x4a, 0xaa, 0xa0, 0xc9, 0x5c, 0x2a, 0x04,
|
||||
0x53, 0x2a, 0x9f, 0x23, 0x73, 0x0f, 0xda, 0x54, 0xde, 0x55, 0xb1, 0x96, 0x10, 0xcc, 0x26, 0xb4,
|
||||
0xe1, 0x59, 0x50, 0xf8, 0x43, 0x84, 0xfd, 0xf8, 0x51, 0xd4, 0x63, 0xd4, 0x07, 0x37, 0x88, 0x8e,
|
||||
0x62, 0x25, 0xf3, 0x85, 0x96, 0xb9, 0x56, 0x94, 0xe9, 0xa4, 0xc0, 0x83, 0xe8, 0x28, 0xb6, 0x49,
|
||||
0xac, 0xf9, 0x13, 0x88, 0xfc, 0x31, 0x75, 0x11, 0xad, 0xec, 0x0d, 0x12, 0xf1, 0xd8, 0x01, 0x9e,
|
||||
0xc4, 0x11, 0x87, 0xad, 0xc7, 0x68, 0xf3, 0x8c, 0xeb, 0x1b, 0x63, 0x34, 0xaf, 0xde, 0x72, 0x25,
|
||||
0xf5, 0x96, 0x53, 0xdf, 0xf2, 0x8d, 0x97, 0xdd, 0x6a, 0xe6, 0x8d, 0x97, 0xfe, 0xc6, 0x57, 0xd1,
|
||||
0x32, 0x0f, 0x06, 0x49, 0x08, 0xae, 0x88, 0x8f, 0x41, 0x3f, 0xf1, 0xca, 0x4e, 0x45, 0xc7, 0xee,
|
||||
0xcb, 0x50, 0xe6, 0xe5, 0xd6, 0xc6, 0x93, 0x3f, 0x6b, 0xe7, 0x9e, 0x9c, 0xd6, 0x4a, 0x4f, 0x4f,
|
||||
0x6b, 0xa5, 0x3f, 0x4e, 0x6b, 0xa5, 0x2f, 0xff, 0xaa, 0x9d, 0xeb, 0x2e, 0xa8, 0x97, 0xe6, 0xee,
|
||||
0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x30, 0x36, 0x53, 0xc6, 0x0b, 0x0b, 0x00, 0x00,
|
||||
// 1003 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x96, 0xd9, 0x72, 0x1b, 0x45,
|
||||
0x14, 0x86, 0x23, 0xc5, 0x71, 0xac, 0x96, 0xed, 0x38, 0x6d, 0x87, 0x34, 0x72, 0x95, 0x70, 0x1c,
|
||||
0x12, 0xcc, 0x66, 0x53, 0xca, 0x03, 0x80, 0x90, 0x5c, 0x8e, 0xab, 0x42, 0x70, 0x4d, 0xcc, 0x52,
|
||||
0xc5, 0xc5, 0xd0, 0x9a, 0x39, 0x96, 0x06, 0xcf, 0x46, 0x77, 0x4b, 0x31, 0xef, 0x11, 0x28, 0x1e,
|
||||
0x83, 0xed, 0x21, 0x72, 0xc1, 0x62, 0xe0, 0x05, 0xc0, 0xdc, 0x70, 0x0f, 0xdc, 0x53, 0xbd, 0xcc,
|
||||
0x26, 0xb5, 0x7c, 0xa7, 0xf9, 0xcf, 0x7f, 0xbe, 0x73, 0xba, 0xe7, 0xf4, 0xa8, 0xd1, 0x3a, 0xa3,
|
||||
0x27, 0xc2, 0x0d, 0x62, 0x01, 0x2c, 0xa6, 0xe1, 0x6e, 0xca, 0x12, 0x91, 0xe0, 0x65, 0x10, 0x9e,
|
||||
0xcf, 0x81, 0x4d, 0x80, 0xa5, 0x83, 0xd6, 0xc6, 0x30, 0x19, 0x26, 0x2a, 0xb0, 0x27, 0x7f, 0x69,
|
||||
0x4f, 0x6b, 0xad, 0xf0, 0x18, 0xa5, 0xc1, 0x52, 0xcf, 0xfc, 0xbc, 0x2f, 0x83, 0x7b, 0x34, 0x0d,
|
||||
0xf6, 0x22, 0x88, 0x06, 0xc0, 0xf8, 0x28, 0x48, 0xd3, 0x41, 0xe9, 0x41, 0xfb, 0xb6, 0x3f, 0x45,
|
||||
0x2b, 0x0e, 0x7c, 0x3e, 0x06, 0x2e, 0x1e, 0x02, 0xf5, 0x81, 0xe1, 0x55, 0x54, 0x3f, 0xec, 0x93,
|
||||
0xda, 0x56, 0x6d, 0x67, 0xc1, 0xa9, 0x1f, 0xf6, 0x71, 0x0b, 0x2d, 0x8d, 0xb9, 0x6c, 0x2d, 0x02,
|
||||
0x52, 0xdf, 0xaa, 0xed, 0x34, 0x9c, 0xfc, 0x19, 0xdf, 0x45, 0x2b, 0x74, 0x2c, 0x46, 0x2e, 0x83,
|
||||
0x49, 0xc0, 0x83, 0x24, 0x26, 0x57, 0x55, 0xda, 0xb2, 0x14, 0x1d, 0xa3, 0x6d, 0x3f, 0xc3, 0x68,
|
||||
0xfd, 0xd0, 0xac, 0xce, 0xa1, 0x27, 0xc2, 0x94, 0xc3, 0x0f, 0xd0, 0xe2, 0x48, 0x95, 0x24, 0xfe,
|
||||
0x56, 0x6d, 0xa7, 0xd9, 0xd9, 0xdc, 0x2d, 0xaf, 0x79, 0xb7, 0xd2, 0x95, 0x63, 0xac, 0x33, 0xdd,
|
||||
0xdd, 0x43, 0xf5, 0x49, 0x47, 0xf5, 0xd5, 0xec, 0xdc, 0xb2, 0x02, 0x9c, 0xfa, 0xa4, 0x83, 0xdf,
|
||||
0x42, 0xd7, 0x18, 0x8d, 0x87, 0xa0, 0x1a, 0x6c, 0x76, 0x5a, 0x53, 0x4e, 0x19, 0xca, 0xec, 0xda,
|
||||
0x88, 0x5f, 0x43, 0x57, 0xd3, 0xb1, 0x20, 0x0b, 0xca, 0x4f, 0xaa, 0xfe, 0xa3, 0x71, 0xb6, 0x08,
|
||||
0x47, 0x9a, 0x70, 0x0f, 0x2d, 0xfb, 0x10, 0x82, 0x00, 0x57, 0x17, 0xb9, 0xa6, 0x92, 0xb6, 0xaa,
|
||||
0x49, 0x7d, 0xe5, 0xa8, 0x94, 0x6a, 0xfa, 0x85, 0x26, 0x0b, 0x8a, 0xb3, 0x98, 0x2c, 0xda, 0x0a,
|
||||
0x1e, 0x9f, 0xc5, 0x79, 0x41, 0x71, 0x16, 0xe3, 0xb7, 0x11, 0xf2, 0x92, 0x28, 0xa5, 0x9e, 0x90,
|
||||
0x9b, 0x7e, 0x5d, 0xa5, 0xbc, 0x54, 0x4d, 0xe9, 0xe5, 0xf1, 0x2c, 0xb3, 0x94, 0x82, 0xdf, 0x41,
|
||||
0xcd, 0x10, 0x28, 0x07, 0x77, 0xc8, 0x68, 0x2c, 0xc8, 0x92, 0x8d, 0xf0, 0x48, 0x1a, 0x0e, 0x64,
|
||||
0x3c, 0x27, 0x84, 0xb9, 0x24, 0xd7, 0xac, 0x09, 0x0c, 0x26, 0xc9, 0x29, 0x90, 0x86, 0x6d, 0xcd,
|
||||
0x0a, 0xe1, 0x28, 0x43, 0xbe, 0xe6, 0xb0, 0xd0, 0xe4, 0x6b, 0xa1, 0x21, 0x65, 0x11, 0x41, 0xb6,
|
||||
0xd7, 0xd2, 0x95, 0xa1, 0xfc, 0xb5, 0x28, 0x23, 0x7e, 0x1f, 0xad, 0xe9, 0xb2, 0xde, 0x08, 0xbc,
|
||||
0xd3, 0x34, 0x09, 0x62, 0x41, 0x9a, 0x2a, 0xf9, 0x65, 0x4b, 0xe9, 0x5e, 0x6e, 0xca, 0x30, 0x37,
|
||||
0xc2, 0xaa, 0x8e, 0xbb, 0xa8, 0xa9, 0x46, 0x18, 0x62, 0x3a, 0x08, 0x81, 0xfc, 0x6d, 0xdd, 0xcc,
|
||||
0xee, 0x58, 0x8c, 0xf6, 0x95, 0x21, 0xdf, 0x0a, 0x9a, 0x4b, 0xb8, 0x8f, 0xd4, 0xc0, 0xbb, 0x7e,
|
||||
0xc0, 0x15, 0xe3, 0x9f, 0xeb, 0xb6, 0xbd, 0x90, 0x8c, 0xbe, 0x76, 0xe4, 0x7b, 0x41, 0x0b, 0x2d,
|
||||
0x6f, 0x84, 0x0b, 0x2a, 0xc6, 0x9c, 0xfc, 0x37, 0xb7, 0x91, 0x27, 0xca, 0x50, 0x69, 0x44, 0x4b,
|
||||
0xf8, 0xb1, 0x6e, 0x04, 0x62, 0x11, 0x78, 0x54, 0x00, 0xf9, 0x57, 0x33, 0x5e, 0xad, 0x32, 0xb2,
|
||||
0xb3, 0xd8, 0x2d, 0x59, 0x33, 0x5a, 0x25, 0x1f, 0xef, 0x9b, 0xe3, 0x2d, 0xcf, 0xbb, 0x4b, 0x7d,
|
||||
0x9f, 0xfc, 0xb8, 0x34, 0x6f, 0x65, 0x1f, 0x70, 0x60, 0x5d, 0xdf, 0xaf, 0xac, 0xcc, 0x68, 0xf8,
|
||||
0x31, 0x5a, 0x2b, 0x30, 0x7a, 0xe4, 0xc9, 0x4f, 0x9a, 0x74, 0xd7, 0x4e, 0x32, 0x67, 0xc5, 0xc0,
|
||||
0x56, 0x69, 0x45, 0xae, 0xb6, 0x35, 0x04, 0x41, 0x7e, 0xbe, 0xb4, 0xad, 0x03, 0x10, 0x33, 0x6d,
|
||||
0x1d, 0x80, 0xc0, 0x43, 0xf4, 0x62, 0x81, 0xf1, 0x46, 0xf2, 0x10, 0xba, 0x29, 0xe5, 0xfc, 0x69,
|
||||
0xc2, 0x7c, 0xf2, 0x8b, 0x46, 0xbe, 0x6e, 0x47, 0xf6, 0x94, 0xfb, 0xc8, 0x98, 0x33, 0xfa, 0x0b,
|
||||
0xd4, 0x1a, 0xc6, 0x1f, 0xa3, 0x8d, 0x52, 0xbf, 0xf2, 0xf4, 0xb8, 0x2c, 0x09, 0x81, 0x9c, 0xeb,
|
||||
0x1a, 0xf7, 0xe7, 0xb4, 0xad, 0x4e, 0x5e, 0x52, 0x4c, 0xcb, 0x4d, 0x3a, 0x1d, 0xc1, 0x9f, 0xa0,
|
||||
0x5b, 0x05, 0x59, 0x1f, 0x44, 0x8d, 0xfe, 0x55, 0xa3, 0x5f, 0xb1, 0xa3, 0xcd, 0x89, 0x2c, 0xb1,
|
||||
0x31, 0x9d, 0x09, 0xe1, 0x87, 0x68, 0xb5, 0x80, 0x87, 0x01, 0x17, 0xe4, 0x37, 0x4d, 0xbd, 0x63,
|
||||
0xa7, 0x3e, 0x0a, 0xb8, 0xa8, 0xcc, 0x51, 0x26, 0xe6, 0x24, 0xd9, 0x9a, 0x26, 0xfd, 0x3e, 0x97,
|
||||
0x24, 0x4b, 0xcf, 0x90, 0x32, 0x31, 0x7f, 0xf5, 0x8a, 0x24, 0x27, 0xf2, 0x9b, 0xc6, 0xbc, 0x57,
|
||||
0x2f, 0x73, 0xa6, 0x27, 0xd2, 0x68, 0xf9, 0x44, 0x2a, 0x8c, 0x99, 0xc8, 0x6f, 0x1b, 0xf3, 0x26,
|
||||
0x52, 0x66, 0x59, 0x26, 0xb2, 0x90, 0xab, 0x6d, 0xc9, 0x89, 0xfc, 0xee, 0xd2, 0xb6, 0xa6, 0x27,
|
||||
0xd2, 0x68, 0xf8, 0x33, 0xd4, 0x2a, 0x61, 0xd4, 0xa0, 0xa4, 0xc0, 0xa2, 0x80, 0xab, 0xff, 0xd6,
|
||||
0xef, 0x35, 0xf3, 0x8d, 0x39, 0x4c, 0x69, 0x3f, 0xca, 0xdd, 0x19, 0xff, 0x36, 0xb5, 0xc7, 0x71,
|
||||
0x84, 0x36, 0x8b, 0x5a, 0x66, 0x74, 0x4a, 0xc5, 0x7e, 0xd0, 0xc5, 0xde, 0xb4, 0x17, 0xd3, 0x53,
|
||||
0x32, 0x5b, 0x8d, 0xd0, 0x39, 0x06, 0xfc, 0x11, 0x5a, 0xf7, 0xc2, 0x31, 0x17, 0xc0, 0xdc, 0x09,
|
||||
0x30, 0x29, 0xb9, 0x1c, 0x04, 0x79, 0x86, 0xcc, 0x11, 0x28, 0x5f, 0x52, 0x76, 0x7b, 0xda, 0xf9,
|
||||
0xa1, 0x36, 0x3e, 0x29, 0x76, 0xeb, 0xa6, 0x37, 0x1d, 0xc1, 0x14, 0xdd, 0xce, 0xc0, 0x9a, 0xe1,
|
||||
0x52, 0x21, 0x98, 0x82, 0x7f, 0x89, 0xcc, 0xe7, 0xcf, 0x06, 0x7f, 0x4f, 0x69, 0x5d, 0x21, 0x58,
|
||||
0x89, 0xbf, 0xe1, 0x59, 0x82, 0xf8, 0x18, 0x61, 0x3f, 0x79, 0x1a, 0x0f, 0x19, 0xf5, 0xc1, 0x0d,
|
||||
0xe2, 0x93, 0x44, 0xd1, 0xbf, 0xd2, 0xf4, 0x7b, 0x55, 0x7a, 0x3f, 0x33, 0x1e, 0xc6, 0x27, 0x49,
|
||||
0x89, 0xbc, 0xe6, 0x4f, 0x05, 0xb6, 0x6f, 0xa0, 0x95, 0xfd, 0x28, 0x15, 0x5f, 0x38, 0xc0, 0xd3,
|
||||
0x24, 0xe6, 0xb0, 0x9d, 0xa2, 0xcd, 0x4b, 0x3e, 0xcd, 0x18, 0xa3, 0x05, 0x75, 0x07, 0xab, 0xa9,
|
||||
0x3b, 0x98, 0xfa, 0x2d, 0xef, 0x66, 0xf9, 0x17, 0xcb, 0xdc, 0xcd, 0xb2, 0x67, 0x7c, 0x07, 0x2d,
|
||||
0xf3, 0x20, 0x4a, 0x43, 0x70, 0x45, 0x72, 0x0a, 0xfa, 0x6a, 0xd6, 0x70, 0x9a, 0x5a, 0x3b, 0x96,
|
||||
0xd2, 0xbb, 0x1b, 0xcf, 0xff, 0x6c, 0x5f, 0x79, 0x7e, 0xd1, 0xae, 0x9d, 0x5f, 0xb4, 0x6b, 0x7f,
|
||||
0x5c, 0xb4, 0x6b, 0x5f, 0xff, 0xd5, 0xbe, 0x32, 0x58, 0x54, 0x17, 0xc3, 0x07, 0xff, 0x07, 0x00,
|
||||
0x00, 0xff, 0xff, 0x94, 0x6f, 0x64, 0x0a, 0x98, 0x0a, 0x00, 0x00,
|
||||
}
|
||||
|
||||
func (m *RequestHeader) Marshal() (dAtA []byte, err error) {
|
||||
|
|
|
@ -4,7 +4,6 @@ package etcdserverpb;
|
|||
import "gogoproto/gogo.proto";
|
||||
import "etcdserver.proto";
|
||||
import "rpc.proto";
|
||||
import "etcd/api/versionpb/version.proto";
|
||||
import "etcd/api/membershippb/membership.proto";
|
||||
|
||||
option (gogoproto.marshaler_all) = true;
|
||||
|
@ -13,20 +12,16 @@ option (gogoproto.unmarshaler_all) = true;
|
|||
option (gogoproto.goproto_getters_all) = false;
|
||||
|
||||
message RequestHeader {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
uint64 ID = 1;
|
||||
// username is a username that is associated with an auth token of gRPC connection
|
||||
string username = 2;
|
||||
// auth_revision is a revision number of auth.authStore. It is not related to mvcc
|
||||
uint64 auth_revision = 3 [(versionpb.etcd_version_field) = "3.1"];
|
||||
uint64 auth_revision = 3;
|
||||
}
|
||||
|
||||
// An InternalRaftRequest is the union of all requests which can be
|
||||
// sent via raft.
|
||||
message InternalRaftRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
RequestHeader header = 100;
|
||||
uint64 ID = 1;
|
||||
|
||||
|
@ -43,11 +38,11 @@ message InternalRaftRequest {
|
|||
|
||||
AlarmRequest alarm = 10;
|
||||
|
||||
LeaseCheckpointRequest lease_checkpoint = 11 [(versionpb.etcd_version_field) = "3.4"];
|
||||
LeaseCheckpointRequest lease_checkpoint = 11;
|
||||
|
||||
AuthEnableRequest auth_enable = 1000;
|
||||
AuthDisableRequest auth_disable = 1011;
|
||||
AuthStatusRequest auth_status = 1013 [(versionpb.etcd_version_field) = "3.5"];
|
||||
AuthStatusRequest auth_status = 1013;
|
||||
|
||||
InternalAuthenticateRequest authenticate = 1012;
|
||||
|
||||
|
@ -66,9 +61,9 @@ message InternalRaftRequest {
|
|||
AuthRoleGrantPermissionRequest auth_role_grant_permission = 1203;
|
||||
AuthRoleRevokePermissionRequest auth_role_revoke_permission = 1204;
|
||||
|
||||
membershippb.ClusterVersionSetRequest cluster_version_set = 1300 [(versionpb.etcd_version_field) = "3.5"];
|
||||
membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301 [(versionpb.etcd_version_field) = "3.5"];
|
||||
membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302 [(versionpb.etcd_version_field) = "3.5"];
|
||||
membershippb.ClusterVersionSetRequest cluster_version_set = 1300;
|
||||
membershippb.ClusterMemberAttrSetRequest cluster_member_attr_set = 1301;
|
||||
membershippb.DowngradeInfoSetRequest downgrade_info_set = 1302;
|
||||
}
|
||||
|
||||
message EmptyResponse {
|
||||
|
@ -78,7 +73,6 @@ message EmptyResponse {
|
|||
// InternalAuthenticateRequest has a member that is filled by etcdserver and shouldn't be user-facing.
|
||||
// For avoiding misusage the field, we have an internal version of AuthenticateRequest.
|
||||
message InternalAuthenticateRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
string name = 1;
|
||||
string password = 2;
|
||||
|
||||
|
|
|
@ -12,10 +12,8 @@ import (
|
|||
|
||||
_ "github.com/gogo/protobuf/gogoproto"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
|
||||
authpb "go.etcd.io/etcd/api/v3/authpb"
|
||||
mvccpb "go.etcd.io/etcd/api/v3/mvccpb"
|
||||
_ "go.etcd.io/etcd/api/v3/versionpb"
|
||||
_ "google.golang.org/genproto/googleapis/api/annotations"
|
||||
grpc "google.golang.org/grpc"
|
||||
codes "google.golang.org/grpc/codes"
|
||||
|
@ -276,10 +274,9 @@ type ResponseHeader struct {
|
|||
ClusterId uint64 `protobuf:"varint,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"`
|
||||
// member_id is the ID of the member which sent the response.
|
||||
MemberId uint64 `protobuf:"varint,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"`
|
||||
// revision is the key-value store revision when the request was applied, and it's
|
||||
// unset (so 0) in case of calls not interacting with key-value store.
|
||||
// revision is the key-value store revision when the request was applied.
|
||||
// For watch progress responses, the header.revision indicates progress. All future events
|
||||
// received in this stream are guaranteed to have a higher revision number than the
|
||||
// recieved in this stream are guaranteed to have a higher revision number than the
|
||||
// header.revision number.
|
||||
Revision int64 `protobuf:"varint,3,opt,name=revision,proto3" json:"revision,omitempty"`
|
||||
// raft_term is the raft term when the request was applied.
|
||||
|
@ -1634,8 +1631,6 @@ type HashKVResponse struct {
|
|||
Hash uint32 `protobuf:"varint,2,opt,name=hash,proto3" json:"hash,omitempty"`
|
||||
// compact_revision is the compacted revision of key-value store when hash begins.
|
||||
CompactRevision int64 `protobuf:"varint,3,opt,name=compact_revision,json=compactRevision,proto3" json:"compact_revision,omitempty"`
|
||||
// hash_revision is the revision up to which the hash is calculated.
|
||||
HashRevision int64 `protobuf:"varint,4,opt,name=hash_revision,json=hashRevision,proto3" json:"hash_revision,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
|
@ -1695,13 +1690,6 @@ func (m *HashKVResponse) GetCompactRevision() int64 {
|
|||
return 0
|
||||
}
|
||||
|
||||
func (m *HashKVResponse) GetHashRevision() int64 {
|
||||
if m != nil {
|
||||
return m.HashRevision
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type HashResponse struct {
|
||||
Header *ResponseHeader `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
|
||||
// hash is the hash value computed from the responding member's KV's backend.
|
||||
|
@ -1805,10 +1793,6 @@ type SnapshotResponse struct {
|
|||
RemainingBytes uint64 `protobuf:"varint,2,opt,name=remaining_bytes,json=remainingBytes,proto3" json:"remaining_bytes,omitempty"`
|
||||
// blob contains the next chunk of the snapshot in the snapshot stream.
|
||||
Blob []byte `protobuf:"bytes,3,opt,name=blob,proto3" json:"blob,omitempty"`
|
||||
// local version of server that created the snapshot.
|
||||
// In cluster with binaries with different version, each cluster can return different result.
|
||||
// Informs which etcd server version should be used when restoring the snapshot.
|
||||
Version string `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
|
@ -1868,13 +1852,6 @@ func (m *SnapshotResponse) GetBlob() []byte {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (m *SnapshotResponse) GetVersion() string {
|
||||
if m != nil {
|
||||
return m.Version
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type WatchRequest struct {
|
||||
// request_union is a request to either create a new watcher or cancel an existing watcher.
|
||||
//
|
||||
|
@ -4247,8 +4224,6 @@ type StatusResponse struct {
|
|||
DbSizeInUse int64 `protobuf:"varint,9,opt,name=dbSizeInUse,proto3" json:"dbSizeInUse,omitempty"`
|
||||
// isLearner indicates if the member is raft learner.
|
||||
IsLearner bool `protobuf:"varint,10,opt,name=isLearner,proto3" json:"isLearner,omitempty"`
|
||||
// storageVersion is the version of the db file. It might be get updated with delay in relationship to the target cluster version.
|
||||
StorageVersion string `protobuf:"bytes,11,opt,name=storageVersion,proto3" json:"storageVersion,omitempty"`
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
XXX_sizecache int32 `json:"-"`
|
||||
|
@ -4357,13 +4332,6 @@ func (m *StatusResponse) GetIsLearner() bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (m *StatusResponse) GetStorageVersion() string {
|
||||
if m != nil {
|
||||
return m.StorageVersion
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type AuthEnableRequest struct {
|
||||
XXX_NoUnkeyedLiteral struct{} `json:"-"`
|
||||
XXX_unrecognized []byte `json:"-"`
|
||||
|
@ -6186,287 +6154,264 @@ func init() {
|
|||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
||||
|
||||
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
||||
// 4478 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0xdf, 0x6f, 0x1c, 0x49,
|
||||
0x5a, 0xee, 0x19, 0x7b, 0xc6, 0xf3, 0xcd, 0x78, 0x3c, 0xae, 0x38, 0xd9, 0xc9, 0x6c, 0xe2, 0x78,
|
||||
0x3b, 0x9b, 0xdd, 0x6c, 0x36, 0xf1, 0x24, 0x76, 0x72, 0x0b, 0x41, 0xbb, 0xdc, 0xc4, 0x9e, 0x4d,
|
||||
0x4c, 0x1c, 0xdb, 0xd7, 0x9e, 0x64, 0x6f, 0x83, 0x74, 0xa6, 0x3d, 0x53, 0x19, 0xf7, 0x79, 0xa6,
|
||||
0x7b, 0xae, 0xbb, 0xed, 0xd8, 0xcb, 0xc3, 0x1d, 0x07, 0xc7, 0xe9, 0x40, 0x3a, 0x89, 0x45, 0x42,
|
||||
0x27, 0x04, 0x2f, 0x08, 0x09, 0x1e, 0x0e, 0x04, 0x0f, 0x3c, 0x20, 0x90, 0x78, 0x80, 0x07, 0x78,
|
||||
0x40, 0x42, 0xe2, 0x1f, 0x80, 0xe5, 0x9e, 0xf8, 0x23, 0x10, 0xaa, 0x5f, 0x5d, 0xd5, 0xdd, 0xd5,
|
||||
0xb6, 0xf7, 0xec, 0xd5, 0xbd, 0xac, 0xa7, 0xab, 0xbe, 0x5f, 0xf5, 0x7d, 0xf5, 0x7d, 0x5f, 0xd5,
|
||||
0xf7, 0xd5, 0x06, 0x4a, 0xfe, 0xa8, 0xbb, 0x30, 0xf2, 0xbd, 0xd0, 0x43, 0x15, 0x1c, 0x76, 0x7b,
|
||||
0x01, 0xf6, 0x0f, 0xb0, 0x3f, 0xda, 0x69, 0xcc, 0xf6, 0xbd, 0xbe, 0x47, 0x27, 0x9a, 0xe4, 0x17,
|
||||
0x83, 0x69, 0xd4, 0x09, 0x4c, 0xd3, 0x1e, 0x39, 0xcd, 0xe1, 0x41, 0xb7, 0x3b, 0xda, 0x69, 0xee,
|
||||
0x1d, 0xf0, 0x99, 0x46, 0x34, 0x63, 0xef, 0x87, 0xbb, 0xa3, 0x1d, 0xfa, 0x87, 0xcf, 0xcd, 0x47,
|
||||
0x73, 0x07, 0xd8, 0x0f, 0x1c, 0xcf, 0x1d, 0xed, 0x88, 0x5f, 0x1c, 0xe2, 0x4a, 0xdf, 0xf3, 0xfa,
|
||||
0x03, 0xcc, 0xf0, 0x5d, 0xd7, 0x0b, 0xed, 0xd0, 0xf1, 0xdc, 0x80, 0xcf, 0xde, 0xa6, 0x7f, 0xba,
|
||||
0x77, 0xfa, 0xd8, 0xbd, 0x13, 0xbc, 0xb6, 0xfb, 0x7d, 0xec, 0x37, 0xbd, 0x11, 0x85, 0x48, 0x43,
|
||||
0x9b, 0x3f, 0x36, 0xa0, 0x6a, 0xe1, 0x60, 0xe4, 0xb9, 0x01, 0x7e, 0x82, 0xed, 0x1e, 0xf6, 0xd1,
|
||||
0x55, 0x80, 0xee, 0x60, 0x3f, 0x08, 0xb1, 0xbf, 0xed, 0xf4, 0xea, 0xc6, 0xbc, 0x71, 0x73, 0xdc,
|
||||
0x2a, 0xf1, 0x91, 0xd5, 0x1e, 0x7a, 0x13, 0x4a, 0x43, 0x3c, 0xdc, 0x61, 0xb3, 0x39, 0x3a, 0x3b,
|
||||
0xc9, 0x06, 0x56, 0x7b, 0xa8, 0x01, 0x93, 0x3e, 0x3e, 0x70, 0x88, 0xb0, 0xf5, 0xfc, 0xbc, 0x71,
|
||||
0x33, 0x6f, 0x45, 0xdf, 0x04, 0xd1, 0xb7, 0x5f, 0x85, 0xdb, 0x21, 0xf6, 0x87, 0xf5, 0x71, 0x86,
|
||||
0x48, 0x06, 0x3a, 0xd8, 0x1f, 0x3e, 0x2c, 0x7e, 0xff, 0xef, 0xea, 0xf9, 0xa5, 0x85, 0xbb, 0xe6,
|
||||
0x3f, 0x4f, 0x40, 0xc5, 0xb2, 0xdd, 0x3e, 0xb6, 0xf0, 0x77, 0xf6, 0x71, 0x10, 0xa2, 0x1a, 0xe4,
|
||||
0xf7, 0xf0, 0x11, 0x95, 0xa3, 0x62, 0x91, 0x9f, 0x8c, 0x90, 0xdb, 0xc7, 0xdb, 0xd8, 0x65, 0x12,
|
||||
0x54, 0x08, 0x21, 0xb7, 0x8f, 0xdb, 0x6e, 0x0f, 0xcd, 0xc2, 0xc4, 0xc0, 0x19, 0x3a, 0x21, 0x67,
|
||||
0xcf, 0x3e, 0x62, 0x72, 0x8d, 0x27, 0xe4, 0x5a, 0x06, 0x08, 0x3c, 0x3f, 0xdc, 0xf6, 0xfc, 0x1e,
|
||||
0xf6, 0xeb, 0x13, 0xf3, 0xc6, 0xcd, 0xea, 0xe2, 0xdb, 0x0b, 0xaa, 0x7d, 0x17, 0x54, 0x81, 0x16,
|
||||
0xb6, 0x3c, 0x3f, 0xdc, 0x20, 0xb0, 0x56, 0x29, 0x10, 0x3f, 0xd1, 0xc7, 0x50, 0xa6, 0x44, 0x42,
|
||||
0xdb, 0xef, 0xe3, 0xb0, 0x5e, 0xa0, 0x54, 0x6e, 0x9c, 0x40, 0xa5, 0x43, 0x81, 0x2d, 0xca, 0x9e,
|
||||
0xfd, 0x46, 0x26, 0x54, 0x02, 0xec, 0x3b, 0xf6, 0xc0, 0xf9, 0xcc, 0xde, 0x19, 0xe0, 0x7a, 0x71,
|
||||
0xde, 0xb8, 0x39, 0x69, 0xc5, 0xc6, 0xc8, 0xfa, 0xf7, 0xf0, 0x51, 0xb0, 0xed, 0xb9, 0x83, 0xa3,
|
||||
0xfa, 0x24, 0x05, 0x98, 0x24, 0x03, 0x1b, 0xee, 0xe0, 0x88, 0x5a, 0xcf, 0xdb, 0x77, 0x43, 0x36,
|
||||
0x5b, 0xa2, 0xb3, 0x25, 0x3a, 0x42, 0xa7, 0xef, 0x41, 0x6d, 0xe8, 0xb8, 0xdb, 0x43, 0xaf, 0xb7,
|
||||
0x1d, 0x29, 0x04, 0x88, 0x42, 0x1e, 0x15, 0x7f, 0x8f, 0x5a, 0xe0, 0x9e, 0x55, 0x1d, 0x3a, 0xee,
|
||||
0x33, 0xaf, 0x67, 0x09, 0xfd, 0x10, 0x14, 0xfb, 0x30, 0x8e, 0x52, 0x4e, 0xa2, 0xd8, 0x87, 0x2a,
|
||||
0xca, 0x07, 0x70, 0x81, 0x70, 0xe9, 0xfa, 0xd8, 0x0e, 0xb1, 0xc4, 0xaa, 0xc4, 0xb1, 0x66, 0x86,
|
||||
0x8e, 0xbb, 0x4c, 0x41, 0x62, 0x88, 0xf6, 0x61, 0x0a, 0x71, 0x2a, 0x89, 0x68, 0x1f, 0xc6, 0x11,
|
||||
0xcd, 0x0f, 0xa0, 0x14, 0xd9, 0x05, 0x4d, 0xc2, 0xf8, 0xfa, 0xc6, 0x7a, 0xbb, 0x36, 0x86, 0x00,
|
||||
0x0a, 0xad, 0xad, 0xe5, 0xf6, 0xfa, 0x4a, 0xcd, 0x40, 0x65, 0x28, 0xae, 0xb4, 0xd9, 0x47, 0xae,
|
||||
0x51, 0xfc, 0x9c, 0xef, 0xb7, 0xa7, 0x00, 0xd2, 0x14, 0xa8, 0x08, 0xf9, 0xa7, 0xed, 0x4f, 0x6b,
|
||||
0x63, 0x04, 0xf8, 0x45, 0xdb, 0xda, 0x5a, 0xdd, 0x58, 0xaf, 0x19, 0x84, 0xca, 0xb2, 0xd5, 0x6e,
|
||||
0x75, 0xda, 0xb5, 0x1c, 0x81, 0x78, 0xb6, 0xb1, 0x52, 0xcb, 0xa3, 0x12, 0x4c, 0xbc, 0x68, 0xad,
|
||||
0x3d, 0x6f, 0xd7, 0xc6, 0x23, 0x62, 0x72, 0x17, 0xff, 0x89, 0x01, 0x53, 0xdc, 0xdc, 0xcc, 0xb7,
|
||||
0xd0, 0x7d, 0x28, 0xec, 0x52, 0xff, 0xa2, 0x3b, 0xb9, 0xbc, 0x78, 0x25, 0xb1, 0x37, 0x62, 0x3e,
|
||||
0x68, 0x71, 0x58, 0x64, 0x42, 0x7e, 0xef, 0x20, 0xa8, 0xe7, 0xe6, 0xf3, 0x37, 0xcb, 0x8b, 0xb5,
|
||||
0x05, 0x16, 0x47, 0x16, 0x9e, 0xe2, 0xa3, 0x17, 0xf6, 0x60, 0x1f, 0x5b, 0x64, 0x12, 0x21, 0x18,
|
||||
0x1f, 0x7a, 0x3e, 0xa6, 0x1b, 0x7e, 0xd2, 0xa2, 0xbf, 0x89, 0x17, 0x50, 0x9b, 0xf3, 0xcd, 0xce,
|
||||
0x3e, 0xa4, 0x78, 0xff, 0x6e, 0x00, 0x6c, 0xee, 0x87, 0xd9, 0x2e, 0x36, 0x0b, 0x13, 0x07, 0x84,
|
||||
0x03, 0x77, 0x2f, 0xf6, 0x41, 0x7d, 0x0b, 0xdb, 0x01, 0x8e, 0x7c, 0x8b, 0x7c, 0xa0, 0x79, 0x28,
|
||||
0x8e, 0x7c, 0x7c, 0xb0, 0xbd, 0x77, 0x40, 0xb9, 0x4d, 0x4a, 0x3b, 0x15, 0xc8, 0xf8, 0xd3, 0x03,
|
||||
0x74, 0x0b, 0x2a, 0x4e, 0xdf, 0xf5, 0x7c, 0xbc, 0xcd, 0x88, 0x4e, 0xa8, 0x60, 0x8b, 0x56, 0x99,
|
||||
0x4d, 0xd2, 0x25, 0x29, 0xb0, 0x8c, 0x55, 0x41, 0x0b, 0xbb, 0x46, 0xe6, 0xe4, 0x7a, 0xbe, 0x67,
|
||||
0x40, 0x99, 0xae, 0xe7, 0x4c, 0xca, 0x5e, 0x94, 0x0b, 0xc9, 0x51, 0xb4, 0x94, 0xc2, 0x53, 0x4b,
|
||||
0x93, 0x22, 0xb8, 0x80, 0x56, 0xf0, 0x00, 0x87, 0xf8, 0x2c, 0xc1, 0x4b, 0x51, 0x65, 0x5e, 0xab,
|
||||
0x4a, 0xc9, 0xef, 0xcf, 0x0d, 0xb8, 0x10, 0x63, 0x78, 0xa6, 0xa5, 0xd7, 0xa1, 0xd8, 0xa3, 0xc4,
|
||||
0x98, 0x4c, 0x79, 0x4b, 0x7c, 0xa2, 0xfb, 0x30, 0xc9, 0x45, 0x0a, 0xea, 0x79, 0xfd, 0x36, 0x94,
|
||||
0x52, 0x16, 0x99, 0x94, 0x81, 0x14, 0xf3, 0x1f, 0x72, 0x50, 0xe2, 0xca, 0xd8, 0x18, 0xa1, 0x16,
|
||||
0x4c, 0xf9, 0xec, 0x63, 0x9b, 0xae, 0x99, 0xcb, 0xd8, 0xc8, 0x8e, 0x93, 0x4f, 0xc6, 0xac, 0x0a,
|
||||
0x47, 0xa1, 0xc3, 0xe8, 0x57, 0xa0, 0x2c, 0x48, 0x8c, 0xf6, 0x43, 0x6e, 0xa8, 0x7a, 0x9c, 0x80,
|
||||
0xdc, 0xda, 0x4f, 0xc6, 0x2c, 0xe0, 0xe0, 0x9b, 0xfb, 0x21, 0xea, 0xc0, 0xac, 0x40, 0x66, 0xeb,
|
||||
0xe3, 0x62, 0xe4, 0x29, 0x95, 0xf9, 0x38, 0x95, 0xb4, 0x39, 0x9f, 0x8c, 0x59, 0x88, 0xe3, 0x2b,
|
||||
0x93, 0x68, 0x45, 0x8a, 0x14, 0x1e, 0xb2, 0xfc, 0x92, 0x12, 0xa9, 0x73, 0xe8, 0x72, 0x22, 0x42,
|
||||
0x5b, 0x4b, 0x8a, 0x6c, 0x9d, 0x43, 0x37, 0x52, 0xd9, 0xa3, 0x12, 0x14, 0xf9, 0xb0, 0xf9, 0x6f,
|
||||
0x39, 0x00, 0x61, 0xb1, 0x8d, 0x11, 0x5a, 0x81, 0xaa, 0xcf, 0xbf, 0x62, 0xfa, 0x7b, 0x53, 0xab,
|
||||
0x3f, 0x6e, 0xe8, 0x31, 0x6b, 0x4a, 0x20, 0x31, 0x71, 0x3f, 0x82, 0x4a, 0x44, 0x45, 0xaa, 0xf0,
|
||||
0xb2, 0x46, 0x85, 0x11, 0x85, 0xb2, 0x40, 0x20, 0x4a, 0xfc, 0x04, 0x2e, 0x46, 0xf8, 0x1a, 0x2d,
|
||||
0xbe, 0x75, 0x8c, 0x16, 0x23, 0x82, 0x17, 0x04, 0x05, 0x55, 0x8f, 0x8f, 0x15, 0xc1, 0xa4, 0x22,
|
||||
0x2f, 0x6b, 0x14, 0xc9, 0x80, 0x54, 0x4d, 0x46, 0x12, 0xc6, 0x54, 0x09, 0x24, 0xed, 0xb3, 0x71,
|
||||
0xf3, 0x2f, 0xc7, 0xa1, 0xb8, 0xec, 0x0d, 0x47, 0xb6, 0x4f, 0x36, 0x51, 0xc1, 0xc7, 0xc1, 0xfe,
|
||||
0x20, 0xa4, 0x0a, 0xac, 0x2e, 0x5e, 0x8f, 0xf3, 0xe0, 0x60, 0xe2, 0xaf, 0x45, 0x41, 0x2d, 0x8e,
|
||||
0x42, 0x90, 0x79, 0x96, 0xcf, 0x9d, 0x02, 0x99, 0xe7, 0x78, 0x8e, 0x22, 0x02, 0x42, 0x5e, 0x06,
|
||||
0x84, 0x06, 0x14, 0xf9, 0xf1, 0x8e, 0x05, 0xeb, 0x27, 0x63, 0x96, 0x18, 0x40, 0xef, 0xc1, 0x74,
|
||||
0x32, 0x15, 0x4e, 0x70, 0x98, 0x6a, 0x37, 0x9e, 0x39, 0xaf, 0x43, 0x25, 0x96, 0xa1, 0x0b, 0x1c,
|
||||
0xae, 0x3c, 0x54, 0xf2, 0xf2, 0x25, 0x11, 0xd6, 0xc9, 0xb1, 0xa2, 0xf2, 0x64, 0x4c, 0x04, 0xf6,
|
||||
0x6b, 0x22, 0xb0, 0x4f, 0xaa, 0x89, 0x96, 0xe8, 0x95, 0xc7, 0xf8, 0xb7, 0xd5, 0xa8, 0xf5, 0x75,
|
||||
0x82, 0x1c, 0x01, 0xc9, 0xf0, 0x65, 0x5a, 0x30, 0x15, 0x53, 0x19, 0xc9, 0x91, 0xed, 0x6f, 0x3c,
|
||||
0x6f, 0xad, 0xb1, 0x84, 0xfa, 0x98, 0xe6, 0x50, 0xab, 0x66, 0x90, 0x04, 0xbd, 0xd6, 0xde, 0xda,
|
||||
0xaa, 0xe5, 0xd0, 0x25, 0x28, 0xad, 0x6f, 0x74, 0xb6, 0x19, 0x54, 0xbe, 0x51, 0xfc, 0x63, 0x16,
|
||||
0x49, 0x64, 0x7e, 0xfe, 0x34, 0xa2, 0xc9, 0x53, 0xb4, 0x92, 0x99, 0xc7, 0x94, 0xcc, 0x6c, 0x88,
|
||||
0xcc, 0x9c, 0x93, 0x99, 0x39, 0x8f, 0x10, 0x4c, 0xac, 0xb5, 0x5b, 0x5b, 0x34, 0x49, 0x33, 0xd2,
|
||||
0x4b, 0xe9, 0x6c, 0xfd, 0xa8, 0x0a, 0x15, 0x66, 0x9e, 0xed, 0x7d, 0x97, 0x1c, 0x26, 0x7e, 0x6a,
|
||||
0x00, 0x48, 0x87, 0x45, 0x4d, 0x28, 0x76, 0x99, 0x08, 0x75, 0x83, 0x46, 0xc0, 0x8b, 0x5a, 0x8b,
|
||||
0x5b, 0x02, 0x0a, 0xdd, 0x83, 0x62, 0xb0, 0xdf, 0xed, 0xe2, 0x40, 0x64, 0xee, 0x37, 0x92, 0x41,
|
||||
0x98, 0x07, 0x44, 0x4b, 0xc0, 0x11, 0x94, 0x57, 0xb6, 0x33, 0xd8, 0xa7, 0x79, 0xfc, 0x78, 0x14,
|
||||
0x0e, 0x27, 0x63, 0xec, 0x9f, 0x19, 0x50, 0x56, 0xdc, 0xe2, 0xe7, 0x4c, 0x01, 0x57, 0xa0, 0x44,
|
||||
0x85, 0xc1, 0x3d, 0x9e, 0x04, 0x26, 0x2d, 0x39, 0x80, 0xbe, 0x06, 0x25, 0xe1, 0x49, 0x22, 0x0f,
|
||||
0xd4, 0xf5, 0x64, 0x37, 0x46, 0x96, 0x04, 0x95, 0x42, 0x76, 0x60, 0x86, 0xea, 0xa9, 0x4b, 0x6e,
|
||||
0x1f, 0x42, 0xb3, 0xea, 0xb1, 0xdc, 0x48, 0x1c, 0xcb, 0x1b, 0x30, 0x39, 0xda, 0x3d, 0x0a, 0x9c,
|
||||
0xae, 0x3d, 0xe0, 0xe2, 0x44, 0xdf, 0x92, 0xea, 0x16, 0x20, 0x95, 0xea, 0x59, 0x14, 0x20, 0x89,
|
||||
0x5e, 0x82, 0xf2, 0x13, 0x3b, 0xd8, 0xe5, 0x42, 0xca, 0xf1, 0xfb, 0x30, 0x45, 0xc6, 0x9f, 0xbe,
|
||||
0x38, 0x85, 0xf8, 0x02, 0x6b, 0xc9, 0xfc, 0x47, 0x03, 0xaa, 0x02, 0xed, 0x4c, 0x06, 0x42, 0x30,
|
||||
0xbe, 0x6b, 0x07, 0xbb, 0x54, 0x19, 0x53, 0x16, 0xfd, 0x8d, 0xde, 0x83, 0x5a, 0x97, 0xad, 0x7f,
|
||||
0x3b, 0x71, 0xef, 0x9a, 0xe6, 0xe3, 0x91, 0xef, 0xdf, 0x86, 0x29, 0x82, 0xb2, 0x1d, 0xbf, 0x07,
|
||||
0x09, 0x37, 0xfe, 0x9a, 0x55, 0xd9, 0xa5, 0x6b, 0x4e, 0x8a, 0x6f, 0x43, 0x85, 0x29, 0xe3, 0xbc,
|
||||
0x65, 0x97, 0x7a, 0x6d, 0xc0, 0xf4, 0x96, 0x6b, 0x8f, 0x82, 0x5d, 0x2f, 0x4c, 0xe8, 0x7c, 0xc9,
|
||||
0xfc, 0x5b, 0x03, 0x6a, 0x72, 0xf2, 0x4c, 0x32, 0xbc, 0x0b, 0xd3, 0x3e, 0x1e, 0xda, 0x8e, 0xeb,
|
||||
0xb8, 0xfd, 0xed, 0x9d, 0xa3, 0x10, 0x07, 0xfc, 0xfa, 0x5a, 0x8d, 0x86, 0x1f, 0x91, 0x51, 0x22,
|
||||
0xec, 0xce, 0xc0, 0xdb, 0xe1, 0x41, 0x9a, 0xfe, 0x46, 0x6f, 0xc5, 0xa3, 0x74, 0x49, 0xea, 0x4d,
|
||||
0x8c, 0x4b, 0x99, 0x7f, 0x92, 0x83, 0xca, 0x27, 0x76, 0xd8, 0x15, 0x3b, 0x08, 0xad, 0x42, 0x35,
|
||||
0x0a, 0xe3, 0x74, 0x84, 0xcb, 0x9d, 0x38, 0x70, 0x50, 0x1c, 0x71, 0xaf, 0x11, 0x07, 0x8e, 0xa9,
|
||||
0xae, 0x3a, 0x40, 0x49, 0xd9, 0x6e, 0x17, 0x0f, 0x22, 0x52, 0xb9, 0x6c, 0x52, 0x14, 0x50, 0x25,
|
||||
0xa5, 0x0e, 0xa0, 0x6f, 0x42, 0x6d, 0xe4, 0x7b, 0x7d, 0x1f, 0x07, 0x41, 0x44, 0x8c, 0xa5, 0x70,
|
||||
0x53, 0x43, 0x6c, 0x93, 0x83, 0x26, 0x4e, 0x31, 0xf7, 0x9f, 0x8c, 0x59, 0xd3, 0xa3, 0xf8, 0x9c,
|
||||
0x0c, 0xac, 0xd3, 0xf2, 0xbc, 0xc7, 0x22, 0xeb, 0x0f, 0xf3, 0x80, 0xd2, 0xcb, 0xfc, 0xb2, 0xc7,
|
||||
0xe4, 0x1b, 0x50, 0x0d, 0x42, 0xdb, 0x4f, 0xed, 0xf9, 0x29, 0x3a, 0x1a, 0xed, 0xf8, 0x77, 0x21,
|
||||
0x92, 0x6c, 0xdb, 0xf5, 0x42, 0xe7, 0xd5, 0x11, 0xbb, 0xa0, 0x58, 0x55, 0x31, 0xbc, 0x4e, 0x47,
|
||||
0xd1, 0x3a, 0x14, 0x5f, 0x39, 0x83, 0x10, 0xfb, 0x41, 0x7d, 0x62, 0x3e, 0x7f, 0xb3, 0xba, 0xf8,
|
||||
0xfe, 0x49, 0x86, 0x59, 0xf8, 0x98, 0xc2, 0x77, 0x8e, 0x46, 0xea, 0xe9, 0x97, 0x13, 0x51, 0x8f,
|
||||
0xf1, 0x05, 0xfd, 0x8d, 0xc8, 0x84, 0xc9, 0xd7, 0x84, 0xe8, 0xb6, 0xd3, 0xa3, 0xb9, 0x38, 0xf2,
|
||||
0xc3, 0xfb, 0x56, 0x91, 0x4e, 0xac, 0xf6, 0xd0, 0x75, 0x98, 0x7c, 0xe5, 0xdb, 0xfd, 0x21, 0x76,
|
||||
0x43, 0x76, 0xcb, 0x97, 0x30, 0xd1, 0x84, 0xb9, 0x00, 0x20, 0x45, 0x21, 0x99, 0x6f, 0x7d, 0x63,
|
||||
0xf3, 0x79, 0xa7, 0x36, 0x86, 0x2a, 0x30, 0xb9, 0xbe, 0xb1, 0xd2, 0x5e, 0x6b, 0x93, 0xdc, 0x28,
|
||||
0x72, 0xde, 0x3d, 0xe9, 0x74, 0x2d, 0x61, 0x88, 0xd8, 0x9e, 0x50, 0xe5, 0x32, 0xe2, 0x97, 0x6e,
|
||||
0x21, 0x97, 0x20, 0x71, 0xcf, 0xbc, 0x06, 0xb3, 0xba, 0xad, 0x21, 0x00, 0xee, 0x9b, 0xff, 0x92,
|
||||
0x83, 0x29, 0xee, 0x08, 0x67, 0xf2, 0xdc, 0xcb, 0x8a, 0x54, 0xfc, 0x7a, 0x22, 0x94, 0x54, 0x87,
|
||||
0x22, 0x73, 0x90, 0x1e, 0xbf, 0xff, 0x8a, 0x4f, 0x12, 0x9c, 0xd9, 0x7e, 0xc7, 0x3d, 0x6e, 0xf6,
|
||||
0xe8, 0x5b, 0x1b, 0x36, 0x27, 0x32, 0xc3, 0x66, 0xe4, 0x70, 0x76, 0xc0, 0x0f, 0x56, 0x25, 0x69,
|
||||
0x8a, 0x8a, 0x70, 0x2a, 0x32, 0x19, 0xb3, 0x59, 0x31, 0xc3, 0x66, 0xe8, 0x06, 0x14, 0xf0, 0x01,
|
||||
0x76, 0xc3, 0xa0, 0x5e, 0xa6, 0x89, 0x74, 0x4a, 0x5c, 0xa8, 0xda, 0x64, 0xd4, 0xe2, 0x93, 0xd2,
|
||||
0x54, 0x1f, 0xc1, 0x0c, 0xbd, 0xef, 0x3e, 0xf6, 0x6d, 0x57, 0xbd, 0xb3, 0x77, 0x3a, 0x6b, 0x3c,
|
||||
0xed, 0x90, 0x9f, 0xa8, 0x0a, 0xb9, 0xd5, 0x15, 0xae, 0x9f, 0xdc, 0xea, 0x8a, 0xc4, 0xff, 0x7d,
|
||||
0x03, 0x90, 0x4a, 0xe0, 0x4c, 0xb6, 0x48, 0x70, 0x11, 0x72, 0xe4, 0xa5, 0x1c, 0xb3, 0x30, 0x81,
|
||||
0x7d, 0xdf, 0xf3, 0x59, 0xa0, 0xb4, 0xd8, 0x87, 0x94, 0xe6, 0x0e, 0x17, 0xc6, 0xc2, 0x07, 0xde,
|
||||
0x5e, 0x14, 0x01, 0x18, 0x59, 0x23, 0x2d, 0x7c, 0x07, 0x2e, 0xc4, 0xc0, 0xcf, 0x27, 0xc5, 0x6f,
|
||||
0xc0, 0x34, 0xa5, 0xba, 0xbc, 0x8b, 0xbb, 0x7b, 0x23, 0xcf, 0x71, 0x53, 0x12, 0xa0, 0xeb, 0x24,
|
||||
0x76, 0x89, 0x74, 0x41, 0x96, 0xc8, 0xd6, 0x5c, 0x89, 0x06, 0x3b, 0x9d, 0x35, 0xb9, 0xd5, 0x77,
|
||||
0xe0, 0x52, 0x82, 0xa0, 0x58, 0xd9, 0xaf, 0x42, 0xb9, 0x1b, 0x0d, 0x06, 0xfc, 0x04, 0x79, 0x35,
|
||||
0x2e, 0x6e, 0x12, 0x55, 0xc5, 0x90, 0x3c, 0xbe, 0x09, 0x6f, 0xa4, 0x78, 0x9c, 0x87, 0x3a, 0xee,
|
||||
0x9b, 0x77, 0xe1, 0x22, 0xa5, 0xfc, 0x14, 0xe3, 0x51, 0x6b, 0xe0, 0x1c, 0x9c, 0x6c, 0x96, 0x23,
|
||||
0xbe, 0x5e, 0x05, 0xe3, 0xab, 0xdd, 0x56, 0x92, 0x75, 0x9b, 0xb3, 0xee, 0x38, 0x43, 0xdc, 0xf1,
|
||||
0xd6, 0xb2, 0xa5, 0x25, 0x89, 0x7c, 0x0f, 0x1f, 0x05, 0xfc, 0xf8, 0x48, 0x7f, 0xcb, 0xe8, 0xf5,
|
||||
0xd7, 0x06, 0x57, 0xa7, 0x4a, 0xe7, 0x2b, 0x76, 0x8d, 0x39, 0x80, 0x3e, 0xf1, 0x41, 0xdc, 0x23,
|
||||
0x13, 0xac, 0x36, 0xa7, 0x8c, 0x44, 0x02, 0x93, 0x2c, 0x54, 0x49, 0x0a, 0x7c, 0x95, 0x3b, 0x0e,
|
||||
0xfd, 0x4f, 0x90, 0x3a, 0x29, 0xbd, 0x03, 0x65, 0x3a, 0xb3, 0x15, 0xda, 0xe1, 0x7e, 0x90, 0x65,
|
||||
0xb9, 0x25, 0xf3, 0x87, 0x06, 0xf7, 0x28, 0x41, 0xe7, 0x4c, 0x6b, 0xbe, 0x07, 0x05, 0x7a, 0x43,
|
||||
0x14, 0x37, 0x9d, 0xcb, 0x9a, 0x8d, 0xcd, 0x24, 0xb2, 0x38, 0xa0, 0x72, 0x4e, 0x32, 0xa0, 0xf0,
|
||||
0x8c, 0x76, 0x0e, 0x14, 0x69, 0xc7, 0x85, 0xe5, 0x5c, 0x7b, 0xc8, 0xca, 0x8f, 0x25, 0x8b, 0xfe,
|
||||
0xa6, 0x17, 0x02, 0x8c, 0xfd, 0xe7, 0xd6, 0x1a, 0xbb, 0x81, 0x94, 0xac, 0xe8, 0x9b, 0x28, 0xb6,
|
||||
0x3b, 0x70, 0xb0, 0x1b, 0xd2, 0xd9, 0x71, 0x3a, 0xab, 0x8c, 0xa0, 0x1b, 0x50, 0x72, 0x82, 0x35,
|
||||
0x6c, 0xfb, 0x2e, 0x2f, 0xf1, 0x2b, 0x81, 0x59, 0xce, 0xc8, 0x3d, 0xf6, 0x2d, 0xa8, 0x31, 0xc9,
|
||||
0x5a, 0xbd, 0x9e, 0x72, 0xda, 0x8f, 0xf8, 0x1b, 0x09, 0xfe, 0x31, 0xfa, 0xb9, 0x93, 0xe9, 0xff,
|
||||
0x8d, 0x01, 0x33, 0x0a, 0x83, 0x33, 0x99, 0xe0, 0x36, 0x14, 0x58, 0xff, 0x85, 0x1f, 0x05, 0x67,
|
||||
0xe3, 0x58, 0x8c, 0x8d, 0xc5, 0x61, 0xd0, 0x02, 0x14, 0xd9, 0x2f, 0x71, 0x8d, 0xd3, 0x83, 0x0b,
|
||||
0x20, 0x29, 0xf2, 0x02, 0x5c, 0xe0, 0x73, 0x78, 0xe8, 0xe9, 0x7c, 0x6e, 0x3c, 0x1e, 0x21, 0x7e,
|
||||
0x60, 0xc0, 0x6c, 0x1c, 0xe1, 0x4c, 0xab, 0x54, 0xe4, 0xce, 0x7d, 0x29, 0xb9, 0x7f, 0x4d, 0xc8,
|
||||
0xfd, 0x7c, 0xd4, 0x53, 0x8e, 0x9c, 0xc9, 0x1d, 0xa7, 0x5a, 0x37, 0x17, 0xb7, 0xae, 0xa4, 0xf5,
|
||||
0xe3, 0x68, 0x4d, 0x82, 0xd8, 0x99, 0xd6, 0xf4, 0xc1, 0xa9, 0xd6, 0xa4, 0x1c, 0xc1, 0x52, 0x8b,
|
||||
0x5b, 0x15, 0xdb, 0x68, 0xcd, 0x09, 0xa2, 0x8c, 0xf3, 0x3e, 0x54, 0x06, 0x8e, 0x8b, 0x6d, 0x9f,
|
||||
0xf7, 0x90, 0x0c, 0x75, 0x3f, 0x3e, 0xb0, 0x62, 0x93, 0x92, 0xd4, 0x6f, 0x1b, 0x80, 0x54, 0x5a,
|
||||
0xbf, 0x18, 0x6b, 0x35, 0x85, 0x82, 0x37, 0x7d, 0x6f, 0xe8, 0x85, 0x27, 0x6d, 0xb3, 0xfb, 0xe6,
|
||||
0xef, 0x1a, 0x70, 0x31, 0x81, 0xf1, 0x8b, 0x90, 0xfc, 0xbe, 0x79, 0x05, 0x66, 0x56, 0xb0, 0x38,
|
||||
0xe3, 0xa5, 0x6a, 0x07, 0x5b, 0x80, 0xd4, 0xd9, 0xf3, 0x39, 0xc5, 0xfc, 0x12, 0xcc, 0x3c, 0xf3,
|
||||
0x0e, 0x48, 0x20, 0x27, 0xd3, 0x32, 0x4c, 0xb1, 0x62, 0x56, 0xa4, 0xaf, 0xe8, 0x5b, 0x86, 0xde,
|
||||
0x2d, 0x40, 0x2a, 0xe6, 0x79, 0x88, 0xb3, 0x64, 0xfe, 0xb7, 0x01, 0x95, 0xd6, 0xc0, 0xf6, 0x87,
|
||||
0x42, 0x94, 0x8f, 0xa0, 0xc0, 0x2a, 0x33, 0xbc, 0xcc, 0xfa, 0x4e, 0x9c, 0x9e, 0x0a, 0xcb, 0x3e,
|
||||
0x5a, 0xac, 0x8e, 0xc3, 0xb1, 0xc8, 0x52, 0x78, 0x67, 0x79, 0x25, 0xd1, 0x69, 0x5e, 0x41, 0x77,
|
||||
0x60, 0xc2, 0x26, 0x28, 0x34, 0xbd, 0x56, 0x93, 0xe5, 0x32, 0x4a, 0x8d, 0x5c, 0x89, 0x2c, 0x06,
|
||||
0x65, 0x7e, 0x08, 0x65, 0x85, 0x03, 0x2a, 0x42, 0xfe, 0x71, 0x9b, 0x5f, 0x93, 0x5a, 0xcb, 0x9d,
|
||||
0xd5, 0x17, 0xac, 0x84, 0x58, 0x05, 0x58, 0x69, 0x47, 0xdf, 0x39, 0x4d, 0x63, 0xcf, 0xe6, 0x74,
|
||||
0x78, 0xde, 0x52, 0x25, 0x34, 0xb2, 0x24, 0xcc, 0x9d, 0x46, 0x42, 0xc9, 0xe2, 0xb7, 0x0c, 0x98,
|
||||
0xe2, 0xaa, 0x39, 0x6b, 0x6a, 0xa6, 0x94, 0x33, 0x52, 0xb3, 0xb2, 0x0c, 0x8b, 0x03, 0x4a, 0x19,
|
||||
0xfe, 0xc9, 0x80, 0xda, 0x8a, 0xf7, 0xda, 0xed, 0xfb, 0x76, 0x2f, 0xf2, 0xc1, 0x8f, 0x13, 0xe6,
|
||||
0x5c, 0x48, 0x54, 0xfa, 0x13, 0xf0, 0x72, 0x20, 0x61, 0xd6, 0xba, 0xac, 0xa5, 0xb0, 0xfc, 0x2e,
|
||||
0x3e, 0xcd, 0xaf, 0xc3, 0x74, 0x02, 0x89, 0x18, 0xe8, 0x45, 0x6b, 0x6d, 0x75, 0x85, 0x18, 0x84,
|
||||
0xd6, 0x7b, 0xdb, 0xeb, 0xad, 0x47, 0x6b, 0x6d, 0xde, 0x95, 0x6d, 0xad, 0x2f, 0xb7, 0xd7, 0xa4,
|
||||
0xa1, 0x1e, 0x88, 0x15, 0x3c, 0x30, 0x07, 0x30, 0xa3, 0x08, 0x74, 0xd6, 0xe6, 0x98, 0x5e, 0x5e,
|
||||
0xc9, 0xad, 0x0e, 0x53, 0xfc, 0x94, 0x93, 0x74, 0xfc, 0x9f, 0xe6, 0xa1, 0x2a, 0xa6, 0xbe, 0x1a,
|
||||
0x29, 0xd0, 0x25, 0x28, 0xf4, 0x76, 0xb6, 0x9c, 0xcf, 0x44, 0x5f, 0x96, 0x7f, 0x91, 0xf1, 0x01,
|
||||
0xe3, 0xc3, 0x5e, 0x5b, 0xf0, 0x2f, 0x74, 0x85, 0x3d, 0xc4, 0x58, 0x75, 0x7b, 0xf8, 0x90, 0x1e,
|
||||
0x86, 0xc6, 0x2d, 0x39, 0x40, 0x8b, 0x9a, 0xfc, 0x55, 0x06, 0xbd, 0xeb, 0x2a, 0xaf, 0x34, 0xd0,
|
||||
0x12, 0xd4, 0xc8, 0xef, 0xd6, 0x68, 0x34, 0x70, 0x70, 0x8f, 0x11, 0x20, 0xd7, 0xdc, 0x71, 0x79,
|
||||
0xda, 0x49, 0x01, 0xa0, 0x6b, 0x50, 0xa0, 0x57, 0xc0, 0xa0, 0x3e, 0x49, 0xf2, 0xaa, 0x04, 0xe5,
|
||||
0xc3, 0xe8, 0x3d, 0x28, 0x33, 0x89, 0x57, 0xdd, 0xe7, 0x01, 0xa6, 0x6f, 0x16, 0x94, 0x7a, 0x88,
|
||||
0x3a, 0x17, 0x3f, 0x67, 0x41, 0xd6, 0x39, 0x0b, 0x35, 0xa1, 0x1a, 0x84, 0x9e, 0x6f, 0xf7, 0xf1,
|
||||
0x0b, 0xae, 0xb2, 0x72, 0xbc, 0x68, 0x97, 0x98, 0x96, 0xe6, 0xba, 0x02, 0x33, 0xad, 0xfd, 0x70,
|
||||
0xb7, 0xed, 0x92, 0xe4, 0x98, 0x32, 0xe6, 0x55, 0x40, 0x64, 0x76, 0xc5, 0x09, 0xb4, 0xd3, 0x1c,
|
||||
0x59, 0xbb, 0x13, 0x1e, 0x98, 0xeb, 0x70, 0x81, 0xcc, 0x62, 0x37, 0x74, 0xba, 0xca, 0x41, 0x44,
|
||||
0x1c, 0x75, 0x8d, 0xc4, 0x51, 0xd7, 0x0e, 0x82, 0xd7, 0x9e, 0xdf, 0xe3, 0xc6, 0x8e, 0xbe, 0x25,
|
||||
0xb7, 0xbf, 0x37, 0x98, 0x34, 0xcf, 0x83, 0xd8, 0x31, 0xf5, 0x4b, 0xd2, 0x43, 0xbf, 0x0c, 0x45,
|
||||
0xfe, 0x3c, 0x88, 0x57, 0xff, 0x2e, 0x2d, 0xb0, 0x47, 0x49, 0x0b, 0x9c, 0xf0, 0x06, 0x9b, 0x55,
|
||||
0x2a, 0x54, 0x1c, 0x9e, 0xa8, 0x79, 0xd7, 0x0e, 0x76, 0x71, 0x6f, 0x53, 0x10, 0x8f, 0xd5, 0x46,
|
||||
0x1f, 0x58, 0x89, 0x69, 0x29, 0xfb, 0x3d, 0x29, 0xfa, 0x63, 0x1c, 0x1e, 0x23, 0xba, 0x5a, 0x7d,
|
||||
0xbf, 0x28, 0x50, 0x78, 0xd3, 0xf0, 0x34, 0x58, 0x3f, 0x32, 0xe0, 0xaa, 0x40, 0x5b, 0xde, 0xb5,
|
||||
0xdd, 0x3e, 0x16, 0xc2, 0xfc, 0xbc, 0xfa, 0x4a, 0x2f, 0x3a, 0x7f, 0xca, 0x45, 0x3f, 0x85, 0x7a,
|
||||
0xb4, 0x68, 0x5a, 0x89, 0xf1, 0x06, 0xea, 0x22, 0xf6, 0x03, 0x1e, 0x11, 0x4a, 0x16, 0xfd, 0x4d,
|
||||
0xc6, 0x7c, 0x6f, 0x10, 0x5d, 0x82, 0xc8, 0x6f, 0x49, 0x6c, 0x0d, 0x2e, 0x0b, 0x62, 0xbc, 0x34,
|
||||
0x12, 0xa7, 0x96, 0x5a, 0xd3, 0xb1, 0xd4, 0xb8, 0x3d, 0x08, 0x8d, 0xe3, 0xb7, 0x92, 0x16, 0x25,
|
||||
0x6e, 0x42, 0xca, 0xc5, 0xd0, 0x71, 0x99, 0x63, 0x1e, 0x40, 0x64, 0x56, 0xce, 0xab, 0xa9, 0x79,
|
||||
0x42, 0x52, 0x3b, 0xcf, 0xb7, 0x00, 0x99, 0x4f, 0x6d, 0x81, 0x6c, 0xae, 0x18, 0xe6, 0x22, 0x41,
|
||||
0x89, 0xda, 0x37, 0xb1, 0x3f, 0x74, 0x82, 0x40, 0x69, 0x43, 0xe9, 0xd4, 0xf5, 0x0e, 0x8c, 0x8f,
|
||||
0x30, 0x4f, 0xde, 0xe5, 0x45, 0x24, 0x7c, 0x42, 0x41, 0xa6, 0xf3, 0x92, 0xcd, 0x10, 0xae, 0x09,
|
||||
0x36, 0xcc, 0x20, 0x5a, 0x3e, 0x49, 0x31, 0x45, 0xe9, 0x3b, 0x97, 0x51, 0xfa, 0xce, 0xc7, 0x4b,
|
||||
0xdf, 0xb1, 0x03, 0xa5, 0x1a, 0xa8, 0xce, 0xe7, 0x40, 0xd9, 0x61, 0x06, 0x88, 0xe2, 0xdb, 0xf9,
|
||||
0x50, 0xfd, 0x03, 0x1e, 0xa8, 0xce, 0x2b, 0x0d, 0x62, 0xba, 0x66, 0xd1, 0xa4, 0x14, 0x9f, 0xc8,
|
||||
0x84, 0x0a, 0x31, 0x92, 0xa5, 0xf6, 0x04, 0xc6, 0xad, 0xd8, 0x98, 0x0c, 0xc6, 0x7b, 0x30, 0x1b,
|
||||
0x0f, 0xc6, 0x67, 0x12, 0x6a, 0x16, 0x26, 0x42, 0x6f, 0x0f, 0x8b, 0xcc, 0xcc, 0x3e, 0x52, 0x6a,
|
||||
0x8d, 0x02, 0xf5, 0xf9, 0xa8, 0xf5, 0xdb, 0x92, 0x2a, 0x75, 0xc0, 0xb3, 0xae, 0x80, 0x6c, 0x47,
|
||||
0x71, 0xf7, 0x65, 0x1f, 0x92, 0xd7, 0x27, 0x70, 0x29, 0x19, 0x7c, 0xcf, 0x67, 0x11, 0xdb, 0xcc,
|
||||
0x39, 0x75, 0xe1, 0xf9, 0x7c, 0x18, 0xbc, 0x94, 0x71, 0x52, 0x09, 0xba, 0xe7, 0x43, 0xfb, 0xd7,
|
||||
0xa1, 0xa1, 0x8b, 0xc1, 0xe7, 0xea, 0x8b, 0x51, 0x48, 0x3e, 0x1f, 0xaa, 0x3f, 0x30, 0x24, 0x59,
|
||||
0x75, 0xd7, 0x7c, 0xf8, 0x65, 0xc8, 0x8a, 0x5c, 0x77, 0x37, 0xda, 0x3e, 0xcd, 0x28, 0x5a, 0xe6,
|
||||
0xf5, 0xd1, 0x52, 0xa2, 0x50, 0x40, 0xe1, 0x7f, 0x32, 0xd4, 0x7f, 0x95, 0xbb, 0x97, 0x33, 0x93,
|
||||
0x79, 0xe7, 0xac, 0xcc, 0x48, 0x7a, 0x8e, 0x98, 0xd1, 0x8f, 0x94, 0xab, 0xa8, 0x49, 0xea, 0x7c,
|
||||
0x4c, 0xf7, 0x1b, 0x32, 0xc1, 0xa4, 0xf2, 0xd8, 0xf9, 0x70, 0xb0, 0x61, 0x3e, 0x3b, 0x85, 0x9d,
|
||||
0x0b, 0x8b, 0x5b, 0x2d, 0x28, 0x45, 0x37, 0x5f, 0xe5, 0x9d, 0x6e, 0x19, 0x8a, 0xeb, 0x1b, 0x5b,
|
||||
0x9b, 0xad, 0x65, 0x72, 0xb1, 0x9b, 0x85, 0xe2, 0xf2, 0x86, 0x65, 0x3d, 0xdf, 0xec, 0x90, 0x9b,
|
||||
0x5d, 0xf2, 0xd9, 0xce, 0xe2, 0xcf, 0xf2, 0x90, 0x7b, 0xfa, 0x02, 0x7d, 0x0a, 0x13, 0xec, 0xd9,
|
||||
0xd8, 0x31, 0xaf, 0x07, 0x1b, 0xc7, 0xbd, 0x8c, 0x33, 0xdf, 0xf8, 0xfe, 0x7f, 0xfe, 0xec, 0x0f,
|
||||
0x73, 0x33, 0x66, 0xa5, 0x79, 0xb0, 0xd4, 0xdc, 0x3b, 0x68, 0xd2, 0x24, 0xfb, 0xd0, 0xb8, 0x85,
|
||||
0xbe, 0x01, 0xf9, 0xcd, 0xfd, 0x10, 0x65, 0xbe, 0x2a, 0x6c, 0x64, 0x3f, 0x96, 0x33, 0x2f, 0x52,
|
||||
0xa2, 0xd3, 0x26, 0x70, 0xa2, 0xa3, 0xfd, 0x90, 0x90, 0xfc, 0x0e, 0x94, 0xd5, 0xa7, 0x6e, 0x27,
|
||||
0x3e, 0x35, 0x6c, 0x9c, 0xfc, 0x8c, 0xce, 0xbc, 0x4a, 0x59, 0xbd, 0x61, 0x22, 0xce, 0x8a, 0x3d,
|
||||
0xc6, 0x53, 0x57, 0xd1, 0x39, 0x74, 0x51, 0xe6, 0x43, 0xc4, 0x46, 0xf6, 0xcb, 0xba, 0xd4, 0x2a,
|
||||
0xc2, 0x43, 0x97, 0x90, 0xfc, 0x36, 0x7f, 0x42, 0xd7, 0x0d, 0xd1, 0x35, 0xcd, 0x1b, 0x28, 0xf5,
|
||||
0x6d, 0x4f, 0x63, 0x3e, 0x1b, 0x80, 0x33, 0xb9, 0x42, 0x99, 0x5c, 0x32, 0x67, 0x38, 0x93, 0x6e,
|
||||
0x04, 0xf2, 0xd0, 0xb8, 0xb5, 0xd8, 0x85, 0x09, 0xda, 0x3b, 0x46, 0x2f, 0xc5, 0x8f, 0x86, 0xa6,
|
||||
0x2b, 0x9f, 0x61, 0xe8, 0x58, 0xd7, 0xd9, 0x9c, 0xa5, 0x8c, 0xaa, 0x66, 0x89, 0x30, 0xa2, 0x9d,
|
||||
0xe3, 0x87, 0xc6, 0xad, 0x9b, 0xc6, 0x5d, 0x63, 0xf1, 0xaf, 0x26, 0x60, 0x82, 0xf6, 0x28, 0xd0,
|
||||
0x1e, 0x80, 0xec, 0x91, 0x26, 0x57, 0x97, 0x6a, 0xbf, 0x26, 0x57, 0x97, 0x6e, 0xaf, 0x9a, 0x0d,
|
||||
0xca, 0x74, 0xd6, 0x9c, 0x26, 0x4c, 0x69, 0xeb, 0xa3, 0x49, 0x3b, 0x3d, 0x44, 0x8f, 0x3f, 0x32,
|
||||
0x78, 0xb3, 0x86, 0xb9, 0x19, 0xd2, 0x51, 0x8b, 0xf5, 0x47, 0x93, 0xdb, 0x41, 0xd3, 0x12, 0x35,
|
||||
0x1f, 0x50, 0x86, 0x4d, 0xb3, 0x26, 0x19, 0xfa, 0x14, 0xe2, 0xa1, 0x71, 0xeb, 0x65, 0xdd, 0xbc,
|
||||
0xc0, 0xb5, 0x9c, 0x98, 0x41, 0xdf, 0x85, 0x6a, 0xbc, 0x93, 0x87, 0xae, 0x6b, 0x78, 0x25, 0x3b,
|
||||
0x83, 0x8d, 0xb7, 0x8f, 0x07, 0xe2, 0x32, 0xcd, 0x51, 0x99, 0x38, 0x73, 0xc6, 0x79, 0x0f, 0xe3,
|
||||
0x91, 0x4d, 0x80, 0xb8, 0x0d, 0xd0, 0x9f, 0x1a, 0xbc, 0x19, 0x2b, 0x1b, 0x71, 0x48, 0x47, 0x3d,
|
||||
0xd5, 0xef, 0x6b, 0xdc, 0x38, 0x01, 0x8a, 0x0b, 0xf1, 0x21, 0x15, 0xe2, 0x03, 0x73, 0x56, 0x0a,
|
||||
0x11, 0x3a, 0x43, 0x1c, 0x7a, 0x5c, 0x8a, 0x97, 0x57, 0xcc, 0x37, 0x62, 0xca, 0x89, 0xcd, 0x4a,
|
||||
0x63, 0xb1, 0x86, 0x99, 0xd6, 0x58, 0xb1, 0x9e, 0x9c, 0xd6, 0x58, 0xf1, 0x6e, 0x9b, 0xce, 0x58,
|
||||
0xbc, 0x3d, 0xa6, 0x31, 0x56, 0x34, 0xb3, 0xf8, 0xbf, 0xe3, 0x50, 0x5c, 0x66, 0xff, 0x2b, 0x0e,
|
||||
0xf2, 0xa0, 0x14, 0xb5, 0x90, 0xd0, 0x9c, 0xae, 0x4a, 0x2d, 0xaf, 0x72, 0x8d, 0x6b, 0x99, 0xf3,
|
||||
0x5c, 0xa0, 0xb7, 0xa8, 0x40, 0x6f, 0x9a, 0x97, 0x08, 0x67, 0xfe, 0x7f, 0xfb, 0x34, 0x59, 0x2d,
|
||||
0xb3, 0x69, 0xf7, 0x7a, 0x44, 0x11, 0xbf, 0x09, 0x15, 0xb5, 0xa1, 0x83, 0xde, 0xd2, 0x56, 0xc6,
|
||||
0xd5, 0xee, 0x50, 0xc3, 0x3c, 0x0e, 0x84, 0x73, 0x7e, 0x9b, 0x72, 0x9e, 0x33, 0x2f, 0x6b, 0x38,
|
||||
0xfb, 0x14, 0x34, 0xc6, 0x9c, 0x75, 0x5e, 0xf4, 0xcc, 0x63, 0x2d, 0x1e, 0x3d, 0xf3, 0x78, 0xe3,
|
||||
0xe6, 0x58, 0xe6, 0xfb, 0x14, 0x94, 0x30, 0x0f, 0x00, 0x64, 0x6b, 0x04, 0x69, 0x75, 0xa9, 0x5c,
|
||||
0x58, 0x93, 0xc1, 0x21, 0xdd, 0x55, 0x31, 0x4d, 0xca, 0x96, 0xef, 0xbb, 0x04, 0xdb, 0x81, 0x13,
|
||||
0x84, 0xcc, 0x31, 0xa7, 0x62, 0x8d, 0x0d, 0xa4, 0x5d, 0x4f, 0xbc, 0x4f, 0xd2, 0xb8, 0x7e, 0x2c,
|
||||
0x0c, 0xe7, 0x7e, 0x83, 0x72, 0xbf, 0x66, 0x36, 0x34, 0xdc, 0x47, 0x0c, 0x96, 0x6c, 0xb6, 0xff,
|
||||
0x2b, 0x40, 0xf9, 0x99, 0xed, 0xb8, 0x21, 0x76, 0x6d, 0xb7, 0x8b, 0xd1, 0x0e, 0x4c, 0xd0, 0xdc,
|
||||
0x9d, 0x0c, 0xc4, 0x6a, 0x1d, 0x3f, 0x19, 0x88, 0x63, 0x85, 0x6c, 0x73, 0x9e, 0x32, 0x6e, 0x98,
|
||||
0x17, 0x09, 0xe3, 0xa1, 0x24, 0xdd, 0x64, 0x25, 0x70, 0xe3, 0x16, 0x7a, 0x05, 0x05, 0xde, 0xc0,
|
||||
0x4e, 0x10, 0x8a, 0x15, 0xd5, 0x1a, 0x57, 0xf4, 0x93, 0xba, 0xbd, 0xac, 0xb2, 0x09, 0x28, 0x1c,
|
||||
0xe1, 0x73, 0x00, 0x20, 0xfb, 0x31, 0x49, 0x8b, 0xa6, 0xfa, 0x38, 0x8d, 0xf9, 0x6c, 0x00, 0x9d,
|
||||
0x4e, 0x55, 0x9e, 0xbd, 0x08, 0x96, 0xf0, 0xfd, 0x16, 0x8c, 0x3f, 0xb1, 0x83, 0x5d, 0x94, 0xc8,
|
||||
0xbd, 0xca, 0x7b, 0xd3, 0x46, 0x43, 0x37, 0xc5, 0xb9, 0x5c, 0xa3, 0x5c, 0x2e, 0xb3, 0x50, 0xa6,
|
||||
0x72, 0xa1, 0x2f, 0x2a, 0x8d, 0x5b, 0xa8, 0x07, 0x05, 0xf6, 0xd8, 0x34, 0xa9, 0xbf, 0xd8, 0xcb,
|
||||
0xd5, 0xa4, 0xfe, 0xe2, 0xef, 0x53, 0x4f, 0xe6, 0x32, 0x82, 0x49, 0xf1, 0x28, 0x13, 0x25, 0x9e,
|
||||
0xb2, 0x24, 0x5e, 0x72, 0x36, 0xe6, 0xb2, 0xa6, 0x39, 0xaf, 0xeb, 0x94, 0xd7, 0x55, 0xb3, 0x9e,
|
||||
0xb2, 0x15, 0x87, 0x7c, 0x68, 0xdc, 0xba, 0x6b, 0xa0, 0xef, 0x02, 0xc8, 0x86, 0x55, 0xca, 0x03,
|
||||
0x93, 0x4d, 0xb0, 0x94, 0x07, 0xa6, 0x7a, 0x5d, 0xe6, 0x02, 0xe5, 0x7b, 0xd3, 0xbc, 0x9e, 0xe4,
|
||||
0x1b, 0xfa, 0xb6, 0x1b, 0xbc, 0xc2, 0xfe, 0x1d, 0x56, 0x2d, 0x0f, 0x76, 0x9d, 0x11, 0x59, 0xb2,
|
||||
0x0f, 0xa5, 0xa8, 0x9f, 0x90, 0x8c, 0xb6, 0xc9, 0xce, 0x47, 0x32, 0xda, 0xa6, 0x1a, 0x11, 0xf1,
|
||||
0xb0, 0x13, 0xdb, 0x2d, 0x02, 0x94, 0x38, 0xe0, 0x5f, 0xd4, 0x60, 0x9c, 0x1c, 0xc8, 0xc9, 0xe1,
|
||||
0x44, 0x16, 0x7b, 0x92, 0xab, 0x4f, 0xd5, 0xab, 0x93, 0xab, 0x4f, 0xd7, 0x89, 0xe2, 0x87, 0x13,
|
||||
0x72, 0x59, 0x6b, 0xb2, 0x2a, 0x0a, 0x59, 0xa9, 0x07, 0x65, 0xa5, 0x08, 0x84, 0x34, 0xc4, 0xe2,
|
||||
0xf5, 0xef, 0x64, 0xba, 0xd3, 0x54, 0x90, 0xcc, 0x37, 0x29, 0xbf, 0x8b, 0x2c, 0xdd, 0x51, 0x7e,
|
||||
0x3d, 0x06, 0x41, 0x18, 0xf2, 0xd5, 0x71, 0xbf, 0xd7, 0xac, 0x2e, 0xee, 0xfb, 0xf3, 0xd9, 0x00,
|
||||
0x99, 0xab, 0x93, 0x8e, 0xff, 0x1a, 0x2a, 0x6a, 0xe1, 0x07, 0x69, 0x84, 0x4f, 0x54, 0xe8, 0x93,
|
||||
0x79, 0x44, 0x57, 0x37, 0x8a, 0x47, 0x36, 0xca, 0xd2, 0x56, 0xc0, 0x08, 0xe3, 0x01, 0x14, 0x79,
|
||||
0x01, 0x48, 0xa7, 0xd2, 0x78, 0x11, 0x5f, 0xa7, 0xd2, 0x44, 0xf5, 0x28, 0x7e, 0x7a, 0xa6, 0x1c,
|
||||
0xc9, 0x45, 0x54, 0xe4, 0x6a, 0xce, 0xed, 0x31, 0x0e, 0xb3, 0xb8, 0xc9, 0xa2, 0x6d, 0x16, 0x37,
|
||||
0xa5, 0x3e, 0x90, 0xc5, 0xad, 0x8f, 0x43, 0x1e, 0x0f, 0xc4, 0xe5, 0x1a, 0x65, 0x10, 0x53, 0xf3,
|
||||
0xa3, 0x79, 0x1c, 0x88, 0xee, 0x72, 0x23, 0x19, 0x8a, 0xe4, 0x78, 0x08, 0x20, 0x8b, 0x51, 0xc9,
|
||||
0x13, 0xab, 0xb6, 0x4f, 0x90, 0x3c, 0xb1, 0xea, 0xeb, 0x59, 0xf1, 0xd8, 0x27, 0xf9, 0xb2, 0xbb,
|
||||
0x15, 0xe1, 0xfc, 0xb9, 0x01, 0x28, 0x5d, 0xae, 0x42, 0xef, 0xeb, 0xa9, 0x6b, 0x7b, 0x0e, 0x8d,
|
||||
0xdb, 0xa7, 0x03, 0xd6, 0xa5, 0x33, 0x29, 0x52, 0x97, 0x42, 0x8f, 0x5e, 0x13, 0xa1, 0xbe, 0x67,
|
||||
0xc0, 0x54, 0xac, 0xc4, 0x85, 0xde, 0xc9, 0xb0, 0x69, 0xa2, 0xf1, 0xd0, 0x78, 0xf7, 0x44, 0x38,
|
||||
0xdd, 0x51, 0x5e, 0xd9, 0x01, 0xe2, 0x4e, 0xf3, 0x3b, 0x06, 0x54, 0xe3, 0x95, 0x30, 0x94, 0x41,
|
||||
0x3b, 0xd5, 0xaf, 0x68, 0xdc, 0x3c, 0x19, 0xf0, 0x78, 0xf3, 0xc8, 0xeb, 0xcc, 0x00, 0x8a, 0xbc,
|
||||
0x64, 0xa6, 0xdb, 0xf8, 0xf1, 0x06, 0x87, 0x6e, 0xe3, 0x27, 0xea, 0x6d, 0x9a, 0x8d, 0xef, 0x7b,
|
||||
0x03, 0xac, 0xb8, 0x19, 0xaf, 0xa4, 0x65, 0x71, 0x3b, 0xde, 0xcd, 0x12, 0x65, 0xb8, 0x2c, 0x6e,
|
||||
0xd2, 0xcd, 0x44, 0xc1, 0x0c, 0x65, 0x10, 0x3b, 0xc1, 0xcd, 0x92, 0xf5, 0x36, 0x8d, 0x9b, 0x51,
|
||||
0x86, 0x8a, 0x9b, 0xc9, 0x42, 0x96, 0xce, 0xcd, 0x52, 0xbd, 0x18, 0x9d, 0x9b, 0xa5, 0x6b, 0x61,
|
||||
0x1a, 0x3b, 0x52, 0xbe, 0x31, 0x37, 0xbb, 0xa0, 0x29, 0x75, 0xa1, 0xdb, 0x19, 0x4a, 0xd4, 0x76,
|
||||
0x76, 0x1a, 0x77, 0x4e, 0x09, 0x9d, 0xb9, 0xc7, 0x99, 0xfa, 0xc5, 0x1e, 0xff, 0x23, 0x03, 0x66,
|
||||
0x75, 0xd5, 0x31, 0x94, 0xc1, 0x27, 0xa3, 0x11, 0xd4, 0x58, 0x38, 0x2d, 0xf8, 0xf1, 0xda, 0x8a,
|
||||
0x76, 0xfd, 0xa3, 0x47, 0x9f, 0xb7, 0x9a, 0x2f, 0xaf, 0xc1, 0x55, 0x28, 0xb4, 0x46, 0xce, 0x53,
|
||||
0x7c, 0x84, 0x2e, 0x4c, 0xe6, 0x1a, 0x53, 0x84, 0xae, 0xe7, 0x3b, 0x9f, 0xd1, 0x7f, 0xf1, 0x61,
|
||||
0x3e, 0xb7, 0x53, 0x01, 0x88, 0x00, 0xc6, 0xfe, 0xf5, 0x8b, 0x39, 0xe3, 0x3f, 0xbe, 0x98, 0x33,
|
||||
0xfe, 0xeb, 0x8b, 0x39, 0xe3, 0x27, 0xff, 0x33, 0x37, 0xb6, 0x53, 0xa0, 0xff, 0x22, 0xc4, 0xd2,
|
||||
0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x98, 0x43, 0xdf, 0xe6, 0x42, 0x00, 0x00,
|
||||
// 4107 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0x5b, 0x73, 0x1b, 0xc9,
|
||||
0x75, 0xe6, 0x00, 0xc4, 0xed, 0xe0, 0x42, 0xb0, 0x79, 0x11, 0x84, 0x95, 0x28, 0x6e, 0x6b, 0xa5,
|
||||
0xe5, 0x4a, 0xbb, 0xc4, 0x9a, 0xb6, 0xb3, 0x55, 0x4a, 0xe2, 0x18, 0x22, 0xb1, 0x12, 0x97, 0x14,
|
||||
0xc9, 0x1d, 0x42, 0xda, 0x4b, 0xb9, 0xc2, 0x1a, 0x02, 0x2d, 0x72, 0x42, 0x60, 0x06, 0x9e, 0x19,
|
||||
0x40, 0xe4, 0xe6, 0xe2, 0x94, 0xcb, 0x71, 0x25, 0xaf, 0x76, 0x55, 0x2a, 0x79, 0x48, 0x5e, 0x52,
|
||||
0x29, 0x97, 0x1f, 0xfc, 0x9c, 0xbf, 0x90, 0xa7, 0x5c, 0x2a, 0x7f, 0x20, 0xb5, 0xf1, 0x4b, 0xf2,
|
||||
0x23, 0x52, 0xae, 0xbe, 0xcd, 0xf4, 0xdc, 0x40, 0xd9, 0xd8, 0xdd, 0x17, 0x11, 0x7d, 0xfa, 0xf4,
|
||||
0xf9, 0x4e, 0x9f, 0xee, 0x3e, 0xe7, 0xf4, 0xe9, 0x11, 0x94, 0x9c, 0x51, 0x6f, 0x73, 0xe4, 0xd8,
|
||||
0x9e, 0x8d, 0x2a, 0xc4, 0xeb, 0xf5, 0x5d, 0xe2, 0x4c, 0x88, 0x33, 0x3a, 0x6d, 0x2e, 0x9f, 0xd9,
|
||||
0x67, 0x36, 0xeb, 0x68, 0xd1, 0x5f, 0x9c, 0xa7, 0xd9, 0xa0, 0x3c, 0x2d, 0x63, 0x64, 0xb6, 0x86,
|
||||
0x93, 0x5e, 0x6f, 0x74, 0xda, 0xba, 0x98, 0x88, 0x9e, 0xa6, 0xdf, 0x63, 0x8c, 0xbd, 0xf3, 0xd1,
|
||||
0x29, 0xfb, 0x23, 0xfa, 0x6e, 0x9d, 0xd9, 0xf6, 0xd9, 0x80, 0xf0, 0x5e, 0xcb, 0xb2, 0x3d, 0xc3,
|
||||
0x33, 0x6d, 0xcb, 0xe5, 0xbd, 0xf8, 0xaf, 0x34, 0xa8, 0xe9, 0xc4, 0x1d, 0xd9, 0x96, 0x4b, 0x9e,
|
||||
0x12, 0xa3, 0x4f, 0x1c, 0x74, 0x1b, 0xa0, 0x37, 0x18, 0xbb, 0x1e, 0x71, 0x4e, 0xcc, 0x7e, 0x43,
|
||||
0x5b, 0xd7, 0x36, 0xe6, 0xf5, 0x92, 0xa0, 0xec, 0xf6, 0xd1, 0x1b, 0x50, 0x1a, 0x92, 0xe1, 0x29,
|
||||
0xef, 0xcd, 0xb0, 0xde, 0x22, 0x27, 0xec, 0xf6, 0x51, 0x13, 0x8a, 0x0e, 0x99, 0x98, 0xae, 0x69,
|
||||
0x5b, 0x8d, 0xec, 0xba, 0xb6, 0x91, 0xd5, 0xfd, 0x36, 0x1d, 0xe8, 0x18, 0x2f, 0xbd, 0x13, 0x8f,
|
||||
0x38, 0xc3, 0xc6, 0x3c, 0x1f, 0x48, 0x09, 0x5d, 0xe2, 0x0c, 0xf1, 0x4f, 0x72, 0x50, 0xd1, 0x0d,
|
||||
0xeb, 0x8c, 0xe8, 0xe4, 0x87, 0x63, 0xe2, 0x7a, 0xa8, 0x0e, 0xd9, 0x0b, 0x72, 0xc5, 0xe0, 0x2b,
|
||||
0x3a, 0xfd, 0xc9, 0xc7, 0x5b, 0x67, 0xe4, 0x84, 0x58, 0x1c, 0xb8, 0x42, 0xc7, 0x5b, 0x67, 0xa4,
|
||||
0x63, 0xf5, 0xd1, 0x32, 0xe4, 0x06, 0xe6, 0xd0, 0xf4, 0x04, 0x2a, 0x6f, 0x84, 0xd4, 0x99, 0x8f,
|
||||
0xa8, 0xb3, 0x0d, 0xe0, 0xda, 0x8e, 0x77, 0x62, 0x3b, 0x7d, 0xe2, 0x34, 0x72, 0xeb, 0xda, 0x46,
|
||||
0x6d, 0xeb, 0xad, 0x4d, 0x75, 0x19, 0x36, 0x55, 0x85, 0x36, 0x8f, 0x6d, 0xc7, 0x3b, 0xa4, 0xbc,
|
||||
0x7a, 0xc9, 0x95, 0x3f, 0xd1, 0x87, 0x50, 0x66, 0x42, 0x3c, 0xc3, 0x39, 0x23, 0x5e, 0x23, 0xcf,
|
||||
0xa4, 0xdc, 0xbb, 0x46, 0x4a, 0x97, 0x31, 0xeb, 0x0c, 0x9e, 0xff, 0x46, 0x18, 0x2a, 0x2e, 0x71,
|
||||
0x4c, 0x63, 0x60, 0x7e, 0x61, 0x9c, 0x0e, 0x48, 0xa3, 0xb0, 0xae, 0x6d, 0x14, 0xf5, 0x10, 0x8d,
|
||||
0xce, 0xff, 0x82, 0x5c, 0xb9, 0x27, 0xb6, 0x35, 0xb8, 0x6a, 0x14, 0x19, 0x43, 0x91, 0x12, 0x0e,
|
||||
0xad, 0xc1, 0x15, 0x5b, 0x34, 0x7b, 0x6c, 0x79, 0xbc, 0xb7, 0xc4, 0x7a, 0x4b, 0x8c, 0xc2, 0xba,
|
||||
0x37, 0xa0, 0x3e, 0x34, 0xad, 0x93, 0xa1, 0xdd, 0x3f, 0xf1, 0x0d, 0x02, 0xcc, 0x20, 0xb5, 0xa1,
|
||||
0x69, 0x3d, 0xb3, 0xfb, 0xba, 0x34, 0x0b, 0xe5, 0x34, 0x2e, 0xc3, 0x9c, 0x65, 0xc1, 0x69, 0x5c,
|
||||
0xaa, 0x9c, 0x9b, 0xb0, 0x44, 0x65, 0xf6, 0x1c, 0x62, 0x78, 0x24, 0x60, 0xae, 0x30, 0xe6, 0xc5,
|
||||
0xa1, 0x69, 0x6d, 0xb3, 0x9e, 0x10, 0xbf, 0x71, 0x19, 0xe3, 0xaf, 0x0a, 0x7e, 0xe3, 0x32, 0xcc,
|
||||
0x8f, 0x37, 0xa1, 0xe4, 0xdb, 0x1c, 0x15, 0x61, 0xfe, 0xe0, 0xf0, 0xa0, 0x53, 0x9f, 0x43, 0x00,
|
||||
0xf9, 0xf6, 0xf1, 0x76, 0xe7, 0x60, 0xa7, 0xae, 0xa1, 0x32, 0x14, 0x76, 0x3a, 0xbc, 0x91, 0xc1,
|
||||
0x8f, 0x01, 0x02, 0xeb, 0xa2, 0x02, 0x64, 0xf7, 0x3a, 0x9f, 0xd5, 0xe7, 0x28, 0xcf, 0x8b, 0x8e,
|
||||
0x7e, 0xbc, 0x7b, 0x78, 0x50, 0xd7, 0xe8, 0xe0, 0x6d, 0xbd, 0xd3, 0xee, 0x76, 0xea, 0x19, 0xca,
|
||||
0xf1, 0xec, 0x70, 0xa7, 0x9e, 0x45, 0x25, 0xc8, 0xbd, 0x68, 0xef, 0x3f, 0xef, 0xd4, 0xe7, 0xf1,
|
||||
0xcf, 0x35, 0xa8, 0x8a, 0xf5, 0xe2, 0x67, 0x02, 0x7d, 0x07, 0xf2, 0xe7, 0xec, 0x5c, 0xb0, 0xad,
|
||||
0x58, 0xde, 0xba, 0x15, 0x59, 0xdc, 0xd0, 0xd9, 0xd1, 0x05, 0x2f, 0xc2, 0x90, 0xbd, 0x98, 0xb8,
|
||||
0x8d, 0xcc, 0x7a, 0x76, 0xa3, 0xbc, 0x55, 0xdf, 0xe4, 0xe7, 0x75, 0x73, 0x8f, 0x5c, 0xbd, 0x30,
|
||||
0x06, 0x63, 0xa2, 0xd3, 0x4e, 0x84, 0x60, 0x7e, 0x68, 0x3b, 0x84, 0xed, 0xd8, 0xa2, 0xce, 0x7e,
|
||||
0xd3, 0x6d, 0xcc, 0x16, 0x4d, 0xec, 0x56, 0xde, 0xc0, 0xbf, 0xd4, 0x00, 0x8e, 0xc6, 0x5e, 0xfa,
|
||||
0xd1, 0x58, 0x86, 0xdc, 0x84, 0x0a, 0x16, 0xc7, 0x82, 0x37, 0xd8, 0x99, 0x20, 0x86, 0x4b, 0xfc,
|
||||
0x33, 0x41, 0x1b, 0xe8, 0x06, 0x14, 0x46, 0x0e, 0x99, 0x9c, 0x5c, 0x4c, 0x18, 0x48, 0x51, 0xcf,
|
||||
0xd3, 0xe6, 0xde, 0x04, 0xbd, 0x09, 0x15, 0xf3, 0xcc, 0xb2, 0x1d, 0x72, 0xc2, 0x65, 0xe5, 0x58,
|
||||
0x6f, 0x99, 0xd3, 0x98, 0xde, 0x0a, 0x0b, 0x17, 0x9c, 0x57, 0x59, 0xf6, 0x29, 0x09, 0x5b, 0x50,
|
||||
0x66, 0xaa, 0xce, 0x64, 0xbe, 0x77, 0x02, 0x1d, 0x33, 0x6c, 0x58, 0xdc, 0x84, 0x42, 0x6b, 0xfc,
|
||||
0x03, 0x40, 0x3b, 0x64, 0x40, 0x3c, 0x32, 0x8b, 0xf7, 0x50, 0x6c, 0x92, 0x55, 0x6d, 0x82, 0x7f,
|
||||
0xa6, 0xc1, 0x52, 0x48, 0xfc, 0x4c, 0xd3, 0x6a, 0x40, 0xa1, 0xcf, 0x84, 0x71, 0x0d, 0xb2, 0xba,
|
||||
0x6c, 0xa2, 0x87, 0x50, 0x14, 0x0a, 0xb8, 0x8d, 0x6c, 0xca, 0xa6, 0x29, 0x70, 0x9d, 0x5c, 0xfc,
|
||||
0xcb, 0x0c, 0x94, 0xc4, 0x44, 0x0f, 0x47, 0xa8, 0x0d, 0x55, 0x87, 0x37, 0x4e, 0xd8, 0x7c, 0x84,
|
||||
0x46, 0xcd, 0x74, 0x27, 0xf4, 0x74, 0x4e, 0xaf, 0x88, 0x21, 0x8c, 0x8c, 0x7e, 0x1f, 0xca, 0x52,
|
||||
0xc4, 0x68, 0xec, 0x09, 0x93, 0x37, 0xc2, 0x02, 0x82, 0xfd, 0xf7, 0x74, 0x4e, 0x07, 0xc1, 0x7e,
|
||||
0x34, 0xf6, 0x50, 0x17, 0x96, 0xe5, 0x60, 0x3e, 0x1b, 0xa1, 0x46, 0x96, 0x49, 0x59, 0x0f, 0x4b,
|
||||
0x89, 0x2f, 0xd5, 0xd3, 0x39, 0x1d, 0x89, 0xf1, 0x4a, 0xa7, 0xaa, 0x92, 0x77, 0xc9, 0x9d, 0x77,
|
||||
0x4c, 0xa5, 0xee, 0xa5, 0x15, 0x57, 0xa9, 0x7b, 0x69, 0x3d, 0x2e, 0x41, 0x41, 0xb4, 0xf0, 0xbf,
|
||||
0x64, 0x00, 0xe4, 0x6a, 0x1c, 0x8e, 0xd0, 0x0e, 0xd4, 0x1c, 0xd1, 0x0a, 0x59, 0xeb, 0x8d, 0x44,
|
||||
0x6b, 0x89, 0x45, 0x9c, 0xd3, 0xab, 0x72, 0x10, 0x57, 0xee, 0x7b, 0x50, 0xf1, 0xa5, 0x04, 0x06,
|
||||
0xbb, 0x99, 0x60, 0x30, 0x5f, 0x42, 0x59, 0x0e, 0xa0, 0x26, 0xfb, 0x04, 0x56, 0xfc, 0xf1, 0x09,
|
||||
0x36, 0x7b, 0x73, 0x8a, 0xcd, 0x7c, 0x81, 0x4b, 0x52, 0x82, 0x6a, 0x35, 0x55, 0xb1, 0xc0, 0x6c,
|
||||
0x37, 0x13, 0xcc, 0x16, 0x57, 0x8c, 0x1a, 0x0e, 0x68, 0xbc, 0xe4, 0x4d, 0xfc, 0xbf, 0x59, 0x28,
|
||||
0x6c, 0xdb, 0xc3, 0x91, 0xe1, 0xd0, 0xd5, 0xc8, 0x3b, 0xc4, 0x1d, 0x0f, 0x3c, 0x66, 0xae, 0xda,
|
||||
0xd6, 0xdd, 0xb0, 0x44, 0xc1, 0x26, 0xff, 0xea, 0x8c, 0x55, 0x17, 0x43, 0xe8, 0x60, 0x11, 0x1e,
|
||||
0x33, 0xaf, 0x31, 0x58, 0x04, 0x47, 0x31, 0x44, 0x1e, 0xe4, 0x6c, 0x70, 0x90, 0x9b, 0x50, 0x98,
|
||||
0x10, 0x27, 0x08, 0xe9, 0x4f, 0xe7, 0x74, 0x49, 0x40, 0xef, 0xc0, 0x42, 0x34, 0xbc, 0xe4, 0x04,
|
||||
0x4f, 0xad, 0x17, 0x8e, 0x46, 0x77, 0xa1, 0x12, 0x8a, 0x71, 0x79, 0xc1, 0x57, 0x1e, 0x2a, 0x21,
|
||||
0x6e, 0x55, 0xfa, 0x55, 0x1a, 0x8f, 0x2b, 0x4f, 0xe7, 0xa4, 0x67, 0x5d, 0x95, 0x9e, 0xb5, 0x28,
|
||||
0x46, 0x09, 0xdf, 0x1a, 0x72, 0x32, 0xdf, 0x0f, 0x3b, 0x19, 0xfc, 0x7d, 0xa8, 0x86, 0x0c, 0x44,
|
||||
0xe3, 0x4e, 0xe7, 0xe3, 0xe7, 0xed, 0x7d, 0x1e, 0xa4, 0x9e, 0xb0, 0xb8, 0xa4, 0xd7, 0x35, 0x1a,
|
||||
0xeb, 0xf6, 0x3b, 0xc7, 0xc7, 0xf5, 0x0c, 0xaa, 0x42, 0xe9, 0xe0, 0xb0, 0x7b, 0xc2, 0xb9, 0xb2,
|
||||
0xf8, 0x89, 0x2f, 0x41, 0x04, 0x39, 0x25, 0xb6, 0xcd, 0x29, 0xb1, 0x4d, 0x93, 0xb1, 0x2d, 0x13,
|
||||
0xc4, 0x36, 0x16, 0xe6, 0xf6, 0x3b, 0xed, 0xe3, 0x4e, 0x7d, 0xfe, 0x71, 0x0d, 0x2a, 0xdc, 0xbe,
|
||||
0x27, 0x63, 0x8b, 0x86, 0xda, 0x7f, 0xd2, 0x00, 0x82, 0xd3, 0x84, 0x5a, 0x50, 0xe8, 0x71, 0x9c,
|
||||
0x86, 0xc6, 0x9c, 0xd1, 0x4a, 0xe2, 0x92, 0xe9, 0x92, 0x0b, 0x7d, 0x0b, 0x0a, 0xee, 0xb8, 0xd7,
|
||||
0x23, 0xae, 0x0c, 0x79, 0x37, 0xa2, 0xfe, 0x50, 0x78, 0x2b, 0x5d, 0xf2, 0xd1, 0x21, 0x2f, 0x0d,
|
||||
0x73, 0x30, 0x66, 0x01, 0x70, 0xfa, 0x10, 0xc1, 0x87, 0xff, 0x5e, 0x83, 0xb2, 0xb2, 0x79, 0x7f,
|
||||
0x47, 0x27, 0x7c, 0x0b, 0x4a, 0x4c, 0x07, 0xd2, 0x17, 0x6e, 0xb8, 0xa8, 0x07, 0x04, 0xf4, 0x7b,
|
||||
0x50, 0x92, 0x27, 0x40, 0x7a, 0xe2, 0x46, 0xb2, 0xd8, 0xc3, 0x91, 0x1e, 0xb0, 0xe2, 0x3d, 0x58,
|
||||
0x64, 0x56, 0xe9, 0xd1, 0xe4, 0x5a, 0xda, 0x51, 0x4d, 0x3f, 0xb5, 0x48, 0xfa, 0xd9, 0x84, 0xe2,
|
||||
0xe8, 0xfc, 0xca, 0x35, 0x7b, 0xc6, 0x40, 0x68, 0xe1, 0xb7, 0xf1, 0x47, 0x80, 0x54, 0x61, 0xb3,
|
||||
0x4c, 0x17, 0x57, 0xa1, 0xfc, 0xd4, 0x70, 0xcf, 0x85, 0x4a, 0xf8, 0x21, 0x54, 0x69, 0x73, 0xef,
|
||||
0xc5, 0x6b, 0xe8, 0xc8, 0x2e, 0x07, 0x92, 0x7b, 0x26, 0x9b, 0x23, 0x98, 0x3f, 0x37, 0xdc, 0x73,
|
||||
0x36, 0xd1, 0xaa, 0xce, 0x7e, 0xa3, 0x77, 0xa0, 0xde, 0xe3, 0x93, 0x3c, 0x89, 0x5c, 0x19, 0x16,
|
||||
0x04, 0xdd, 0xcf, 0x04, 0x3f, 0x85, 0x0a, 0x9f, 0xc3, 0x57, 0xad, 0x04, 0x5e, 0x84, 0x85, 0x63,
|
||||
0xcb, 0x18, 0xb9, 0xe7, 0xb6, 0x8c, 0x6e, 0x74, 0xd2, 0xf5, 0x80, 0x36, 0x13, 0xe2, 0xdb, 0xb0,
|
||||
0xe0, 0x90, 0xa1, 0x61, 0x5a, 0xa6, 0x75, 0x76, 0x72, 0x7a, 0xe5, 0x11, 0x57, 0x5c, 0x98, 0x6a,
|
||||
0x3e, 0xf9, 0x31, 0xa5, 0x52, 0xd5, 0x4e, 0x07, 0xf6, 0xa9, 0x70, 0x73, 0xec, 0x37, 0xfe, 0x69,
|
||||
0x06, 0x2a, 0x9f, 0x18, 0x5e, 0x4f, 0x2e, 0x1d, 0xda, 0x85, 0x9a, 0xef, 0xdc, 0x18, 0x45, 0xe8,
|
||||
0x12, 0x09, 0xb1, 0x6c, 0x8c, 0x4c, 0xa5, 0x65, 0x74, 0xac, 0xf6, 0x54, 0x02, 0x13, 0x65, 0x58,
|
||||
0x3d, 0x32, 0xf0, 0x45, 0x65, 0xd2, 0x45, 0x31, 0x46, 0x55, 0x94, 0x4a, 0x40, 0x87, 0x50, 0x1f,
|
||||
0x39, 0xf6, 0x99, 0x43, 0x5c, 0xd7, 0x17, 0xc6, 0xc3, 0x18, 0x4e, 0x10, 0x76, 0x24, 0x58, 0x03,
|
||||
0x71, 0x0b, 0xa3, 0x30, 0xe9, 0xf1, 0x42, 0x90, 0xcf, 0x70, 0xe7, 0xf4, 0x9f, 0x19, 0x40, 0xf1,
|
||||
0x49, 0xfd, 0xb6, 0x29, 0xde, 0x3d, 0xa8, 0xb9, 0x9e, 0xe1, 0xc4, 0x36, 0x5b, 0x95, 0x51, 0x7d,
|
||||
0x8f, 0xff, 0x36, 0xf8, 0x0a, 0x9d, 0x58, 0xb6, 0x67, 0xbe, 0xbc, 0x12, 0x59, 0x72, 0x4d, 0x92,
|
||||
0x0f, 0x18, 0x15, 0x75, 0xa0, 0xf0, 0xd2, 0x1c, 0x78, 0xc4, 0x71, 0x1b, 0xb9, 0xf5, 0xec, 0x46,
|
||||
0x6d, 0xeb, 0xe1, 0x75, 0xcb, 0xb0, 0xf9, 0x21, 0xe3, 0xef, 0x5e, 0x8d, 0x88, 0x2e, 0xc7, 0xaa,
|
||||
0x99, 0x67, 0x3e, 0x94, 0x8d, 0xdf, 0x84, 0xe2, 0x2b, 0x2a, 0x82, 0xde, 0xb2, 0x0b, 0x3c, 0x59,
|
||||
0x64, 0x6d, 0x7e, 0xc9, 0x7e, 0xe9, 0x18, 0x67, 0x43, 0x62, 0x79, 0xf2, 0x1e, 0x28, 0xdb, 0xf8,
|
||||
0x1e, 0x40, 0x00, 0x43, 0x5d, 0xfe, 0xc1, 0xe1, 0xd1, 0xf3, 0x6e, 0x7d, 0x0e, 0x55, 0xa0, 0x78,
|
||||
0x70, 0xb8, 0xd3, 0xd9, 0xef, 0xd0, 0xf8, 0x80, 0x5b, 0xd2, 0xa4, 0xa1, 0xb5, 0x54, 0x31, 0xb5,
|
||||
0x10, 0x26, 0x5e, 0x85, 0xe5, 0xa4, 0x05, 0xa4, 0xb9, 0x68, 0x55, 0xec, 0xd2, 0x99, 0x8e, 0x8a,
|
||||
0x0a, 0x9d, 0x09, 0x4f, 0xb7, 0x01, 0x05, 0xbe, 0x7b, 0xfb, 0x22, 0x39, 0x97, 0x4d, 0x6a, 0x08,
|
||||
0xbe, 0x19, 0x49, 0x5f, 0xac, 0x92, 0xdf, 0x4e, 0x74, 0x2f, 0xb9, 0x44, 0xf7, 0x82, 0xee, 0x42,
|
||||
0xd5, 0x3f, 0x0d, 0x86, 0x2b, 0x72, 0x81, 0x92, 0x5e, 0x91, 0x1b, 0x9d, 0xd2, 0x42, 0x46, 0x2f,
|
||||
0x84, 0x8d, 0x8e, 0xee, 0x41, 0x9e, 0x4c, 0x88, 0xe5, 0xb9, 0x8d, 0x32, 0x8b, 0x18, 0x55, 0x99,
|
||||
0xbb, 0x77, 0x28, 0x55, 0x17, 0x9d, 0xf8, 0xbb, 0xb0, 0xc8, 0xee, 0x48, 0x4f, 0x1c, 0xc3, 0x52,
|
||||
0x2f, 0x73, 0xdd, 0xee, 0xbe, 0x30, 0x37, 0xfd, 0x89, 0x6a, 0x90, 0xd9, 0xdd, 0x11, 0x46, 0xc8,
|
||||
0xec, 0xee, 0xe0, 0x1f, 0x6b, 0x80, 0xd4, 0x71, 0x33, 0xd9, 0x39, 0x22, 0x5c, 0xc2, 0x67, 0x03,
|
||||
0xf8, 0x65, 0xc8, 0x11, 0xc7, 0xb1, 0x1d, 0x66, 0xd1, 0x92, 0xce, 0x1b, 0xf8, 0x2d, 0xa1, 0x83,
|
||||
0x4e, 0x26, 0xf6, 0x85, 0x7f, 0x06, 0xb9, 0x34, 0xcd, 0x57, 0x75, 0x0f, 0x96, 0x42, 0x5c, 0x33,
|
||||
0x45, 0xae, 0x0f, 0x61, 0x81, 0x09, 0xdb, 0x3e, 0x27, 0xbd, 0x8b, 0x91, 0x6d, 0x5a, 0x31, 0x3c,
|
||||
0xba, 0x72, 0x81, 0x83, 0xa5, 0xf3, 0xe0, 0x13, 0xab, 0xf8, 0xc4, 0x6e, 0x77, 0x1f, 0x7f, 0x06,
|
||||
0xab, 0x11, 0x39, 0x52, 0xfd, 0x3f, 0x82, 0x72, 0xcf, 0x27, 0xba, 0x22, 0xd7, 0xb9, 0x1d, 0x56,
|
||||
0x2e, 0x3a, 0x54, 0x1d, 0x81, 0x0f, 0xe1, 0x46, 0x4c, 0xf4, 0x4c, 0x73, 0x7e, 0x1b, 0x56, 0x98,
|
||||
0xc0, 0x3d, 0x42, 0x46, 0xed, 0x81, 0x39, 0x49, 0xb5, 0xf4, 0x48, 0x4c, 0x4a, 0x61, 0xfc, 0x7a,
|
||||
0xf7, 0x05, 0xfe, 0x03, 0x81, 0xd8, 0x35, 0x87, 0xa4, 0x6b, 0xef, 0xa7, 0xeb, 0x46, 0xa3, 0xd9,
|
||||
0x05, 0xb9, 0x72, 0x45, 0x5a, 0xc3, 0x7e, 0xe3, 0x7f, 0xd6, 0x84, 0xa9, 0xd4, 0xe1, 0x5f, 0xf3,
|
||||
0x4e, 0x5e, 0x03, 0x38, 0xa3, 0x47, 0x86, 0xf4, 0x69, 0x07, 0xaf, 0xa8, 0x28, 0x14, 0x5f, 0x4f,
|
||||
0xea, 0xbf, 0x2b, 0x42, 0xcf, 0x65, 0xb1, 0xcf, 0xd9, 0x3f, 0xbe, 0x97, 0xbb, 0x0d, 0x65, 0x46,
|
||||
0x38, 0xf6, 0x0c, 0x6f, 0xec, 0xc6, 0x16, 0xe3, 0x2f, 0xc4, 0xb6, 0x97, 0x83, 0x66, 0x9a, 0xd7,
|
||||
0xb7, 0x20, 0xcf, 0x2e, 0x13, 0x32, 0x95, 0xbe, 0x99, 0xb0, 0x1f, 0xb9, 0x1e, 0xba, 0x60, 0xc4,
|
||||
0x3f, 0xd5, 0x20, 0xff, 0x8c, 0x95, 0x60, 0x15, 0xd5, 0xe6, 0xe5, 0x5a, 0x58, 0xc6, 0x90, 0x17,
|
||||
0x86, 0x4a, 0x3a, 0xfb, 0xcd, 0x52, 0x4f, 0x42, 0x9c, 0xe7, 0xfa, 0x3e, 0x4f, 0x71, 0x4b, 0xba,
|
||||
0xdf, 0xa6, 0x36, 0xeb, 0x0d, 0x4c, 0x62, 0x79, 0xac, 0x77, 0x9e, 0xf5, 0x2a, 0x14, 0x9a, 0x3d,
|
||||
0x9b, 0xee, 0x3e, 0x31, 0x1c, 0x4b, 0x14, 0x4d, 0x8b, 0x7a, 0x40, 0xc0, 0xfb, 0x50, 0xe7, 0x7a,
|
||||
0xb4, 0xfb, 0x7d, 0x25, 0xc1, 0xf4, 0xd1, 0xb4, 0x08, 0x5a, 0x48, 0x5a, 0x26, 0x2a, 0xed, 0x17,
|
||||
0x1a, 0x2c, 0x2a, 0xe2, 0x66, 0xb2, 0xea, 0xbb, 0x90, 0xe7, 0x45, 0x6a, 0x91, 0xe9, 0x2c, 0x87,
|
||||
0x47, 0x71, 0x18, 0x5d, 0xf0, 0xa0, 0x4d, 0x28, 0xf0, 0x5f, 0xf2, 0x0e, 0x90, 0xcc, 0x2e, 0x99,
|
||||
0xf0, 0x3d, 0x58, 0x12, 0x24, 0x32, 0xb4, 0x93, 0x0e, 0x06, 0x5b, 0x0c, 0xfc, 0x67, 0xb0, 0x1c,
|
||||
0x66, 0x9b, 0x69, 0x4a, 0x8a, 0x92, 0x99, 0xd7, 0x51, 0xb2, 0x2d, 0x95, 0x7c, 0x3e, 0xea, 0x2b,
|
||||
0x79, 0x54, 0x74, 0xc7, 0xa8, 0xeb, 0x95, 0x09, 0xaf, 0x57, 0x30, 0x01, 0x29, 0xe2, 0x1b, 0x9d,
|
||||
0xc0, 0x07, 0x72, 0x3b, 0xec, 0x9b, 0xae, 0xef, 0xc3, 0x31, 0x54, 0x06, 0xa6, 0x45, 0x0c, 0x47,
|
||||
0x54, 0xce, 0x35, 0x5e, 0x39, 0x57, 0x69, 0xf8, 0x0b, 0x40, 0xea, 0xc0, 0x6f, 0x54, 0xe9, 0xfb,
|
||||
0xd2, 0x64, 0x47, 0x8e, 0x3d, 0xb4, 0x53, 0xcd, 0x8e, 0xff, 0x1c, 0x56, 0x22, 0x7c, 0xdf, 0xa8,
|
||||
0x9a, 0x4b, 0xb0, 0xb8, 0x43, 0x64, 0x42, 0x23, 0xdd, 0xde, 0x47, 0x80, 0x54, 0xe2, 0x4c, 0x91,
|
||||
0xad, 0x05, 0x8b, 0xcf, 0xec, 0x09, 0x75, 0x91, 0x94, 0x1a, 0xf8, 0x06, 0x5e, 0x87, 0xf0, 0x4d,
|
||||
0xe1, 0xb7, 0x29, 0xb8, 0x3a, 0x60, 0x26, 0xf0, 0x7f, 0xd7, 0xa0, 0xd2, 0x1e, 0x18, 0xce, 0x50,
|
||||
0x02, 0x7f, 0x0f, 0xf2, 0xfc, 0x76, 0x2d, 0x0a, 0x5a, 0xf7, 0xc3, 0x62, 0x54, 0x5e, 0xde, 0x68,
|
||||
0xf3, 0xbb, 0xb8, 0x18, 0x45, 0x15, 0x17, 0x6f, 0x5e, 0x3b, 0x91, 0x37, 0xb0, 0x1d, 0xf4, 0x1e,
|
||||
0xe4, 0x0c, 0x3a, 0x84, 0x85, 0xa2, 0x5a, 0xb4, 0xae, 0xc1, 0xa4, 0xb1, 0x3b, 0x00, 0xe7, 0xc2,
|
||||
0xdf, 0x81, 0xb2, 0x82, 0x80, 0x0a, 0x90, 0x7d, 0xd2, 0x11, 0x09, 0x7b, 0x7b, 0xbb, 0xbb, 0xfb,
|
||||
0x82, 0x17, 0x74, 0x6a, 0x00, 0x3b, 0x1d, 0xbf, 0x9d, 0xc1, 0x9f, 0x8a, 0x51, 0xc2, 0xed, 0xab,
|
||||
0xfa, 0x68, 0x69, 0xfa, 0x64, 0x5e, 0x4b, 0x9f, 0x4b, 0xa8, 0x8a, 0xe9, 0xcf, 0x1a, 0xc6, 0x98,
|
||||
0xbc, 0x94, 0x30, 0xa6, 0x28, 0xaf, 0x0b, 0x46, 0xfc, 0x2b, 0x0d, 0xea, 0x3b, 0xf6, 0x2b, 0xeb,
|
||||
0xcc, 0x31, 0xfa, 0xfe, 0x39, 0xf9, 0x30, 0xb2, 0x52, 0x9b, 0x91, 0xe2, 0x68, 0x84, 0x3f, 0x20,
|
||||
0x44, 0x56, 0xac, 0x11, 0x94, 0x0d, 0x79, 0x2c, 0x94, 0x4d, 0xfc, 0x01, 0x2c, 0x44, 0x06, 0x51,
|
||||
0xdb, 0xbf, 0x68, 0xef, 0xef, 0xee, 0x50, 0x5b, 0xb3, 0xc2, 0x5a, 0xe7, 0xa0, 0xfd, 0x78, 0xbf,
|
||||
0x23, 0x1e, 0x90, 0xda, 0x07, 0xdb, 0x9d, 0xfd, 0x7a, 0x06, 0xf7, 0x60, 0x51, 0x81, 0x9f, 0xf5,
|
||||
0x65, 0x20, 0x45, 0xbb, 0x05, 0xa8, 0x8a, 0x68, 0x2f, 0x0e, 0xe5, 0xbf, 0x65, 0xa0, 0x26, 0x29,
|
||||
0x5f, 0x0f, 0x26, 0x5a, 0x85, 0x7c, 0xff, 0xf4, 0xd8, 0xfc, 0x42, 0xbe, 0x1c, 0x89, 0x16, 0xa5,
|
||||
0x0f, 0x38, 0x0e, 0x7f, 0xbe, 0x15, 0x2d, 0x1a, 0xc6, 0x1d, 0xe3, 0xa5, 0xb7, 0x6b, 0xf5, 0xc9,
|
||||
0x25, 0x4b, 0x0a, 0xe6, 0xf5, 0x80, 0xc0, 0x2a, 0x4c, 0xe2, 0x99, 0x97, 0xdd, 0xac, 0x94, 0x67,
|
||||
0x5f, 0xf4, 0x00, 0xea, 0xf4, 0x77, 0x7b, 0x34, 0x1a, 0x98, 0xa4, 0xcf, 0x05, 0x14, 0x18, 0x4f,
|
||||
0x8c, 0x4e, 0xd1, 0xd9, 0x5d, 0xc4, 0x6d, 0x14, 0x59, 0x58, 0x12, 0x2d, 0xb4, 0x0e, 0x65, 0xae,
|
||||
0xdf, 0xae, 0xf5, 0xdc, 0x25, 0xec, 0xed, 0x33, 0xab, 0xab, 0xa4, 0x70, 0x9a, 0x01, 0xd1, 0x34,
|
||||
0x63, 0x09, 0x16, 0xdb, 0x63, 0xef, 0xbc, 0x63, 0xd1, 0x58, 0x21, 0xad, 0xbc, 0x0c, 0x88, 0x12,
|
||||
0x77, 0x4c, 0x57, 0xa5, 0x0a, 0xd6, 0xf0, 0x82, 0x74, 0x60, 0x89, 0x12, 0x89, 0xe5, 0x99, 0x3d,
|
||||
0x25, 0xae, 0xca, 0xcc, 0x4b, 0x8b, 0x64, 0x5e, 0x86, 0xeb, 0xbe, 0xb2, 0x9d, 0xbe, 0xb0, 0xb9,
|
||||
0xdf, 0xc6, 0xff, 0xa8, 0x71, 0xc8, 0xe7, 0x6e, 0x28, 0x7d, 0xfa, 0x2d, 0xc5, 0xa0, 0xf7, 0xa1,
|
||||
0x60, 0x8f, 0xd8, 0x0b, 0xbf, 0x28, 0xc3, 0xac, 0x6e, 0xf2, 0x6f, 0x02, 0x36, 0x85, 0xe0, 0x43,
|
||||
0xde, 0xab, 0x4b, 0x36, 0x74, 0x1f, 0x6a, 0xe7, 0x86, 0x7b, 0x4e, 0xfa, 0x47, 0x52, 0x26, 0xbf,
|
||||
0xf9, 0x45, 0xa8, 0x78, 0x23, 0xd0, 0xef, 0x09, 0xf1, 0xa6, 0xe8, 0x87, 0x1f, 0xc2, 0x8a, 0xe4,
|
||||
0x14, 0xaf, 0x13, 0x53, 0x98, 0x5f, 0xc1, 0x6d, 0xc9, 0xbc, 0x7d, 0x6e, 0x58, 0x67, 0x44, 0x02,
|
||||
0xfe, 0xae, 0x16, 0x88, 0xcf, 0x27, 0x9b, 0x38, 0x9f, 0xc7, 0xd0, 0xf0, 0xe7, 0xc3, 0x6e, 0xd6,
|
||||
0xf6, 0x40, 0x55, 0x74, 0xec, 0x8a, 0xf3, 0x54, 0xd2, 0xd9, 0x6f, 0x4a, 0x73, 0xec, 0x81, 0x9f,
|
||||
0x4a, 0xd3, 0xdf, 0x78, 0x1b, 0x6e, 0x4a, 0x19, 0xe2, 0xce, 0x1b, 0x16, 0x12, 0x53, 0x3c, 0x49,
|
||||
0x88, 0x30, 0x2c, 0x1d, 0x3a, 0x7d, 0xe1, 0x55, 0xce, 0xf0, 0x12, 0x30, 0x99, 0x9a, 0x22, 0x73,
|
||||
0x85, 0x6f, 0x4a, 0xaa, 0x98, 0x92, 0x2d, 0x49, 0x32, 0x15, 0xa0, 0x92, 0xc5, 0x82, 0x51, 0x72,
|
||||
0x6c, 0xc1, 0x62, 0xa2, 0x7f, 0x00, 0x6b, 0xbe, 0x12, 0xd4, 0x6e, 0x47, 0xc4, 0x19, 0x9a, 0xae,
|
||||
0xab, 0xd4, 0xbd, 0x93, 0x26, 0x7e, 0x1f, 0xe6, 0x47, 0x44, 0x04, 0xa1, 0xf2, 0x16, 0x92, 0x9b,
|
||||
0x52, 0x19, 0xcc, 0xfa, 0x71, 0x1f, 0xee, 0x48, 0xe9, 0xdc, 0xa2, 0x89, 0xe2, 0xa3, 0x4a, 0xc9,
|
||||
0x6a, 0x60, 0x26, 0xa5, 0x1a, 0x98, 0x8d, 0xbc, 0xc5, 0x7c, 0xc4, 0x0d, 0x29, 0xcf, 0xfc, 0x4c,
|
||||
0xc9, 0xc5, 0x1e, 0xb7, 0xa9, 0xef, 0x2a, 0x66, 0x12, 0xf6, 0xd7, 0xc2, 0x0b, 0x7c, 0x55, 0x1e,
|
||||
0x9e, 0xb0, 0x19, 0xca, 0x87, 0x0e, 0xd9, 0xa4, 0x59, 0x33, 0x5d, 0x00, 0x5d, 0xad, 0x85, 0xce,
|
||||
0xeb, 0x21, 0x1a, 0x3e, 0x85, 0xe5, 0xb0, 0x5f, 0x9b, 0x49, 0x97, 0x65, 0xc8, 0x79, 0xf6, 0x05,
|
||||
0x91, 0xb1, 0x86, 0x37, 0xa4, 0xed, 0x7c, 0x9f, 0x37, 0x93, 0xed, 0x8c, 0x40, 0x18, 0x3b, 0x1d,
|
||||
0xb3, 0xea, 0x4b, 0x37, 0x96, 0xbc, 0x03, 0xf1, 0x06, 0x3e, 0x80, 0xd5, 0xa8, 0x67, 0x9b, 0x49,
|
||||
0xe5, 0x17, 0xfc, 0x2c, 0x25, 0x39, 0xbf, 0x99, 0xe4, 0x7e, 0x1c, 0xf8, 0x25, 0xc5, 0xb7, 0xcd,
|
||||
0x24, 0x52, 0x87, 0x66, 0x92, 0xab, 0xfb, 0x2a, 0x8e, 0x8e, 0xef, 0xf9, 0x66, 0x12, 0xe6, 0x06,
|
||||
0xc2, 0x66, 0x5f, 0xfe, 0xc0, 0x5d, 0x65, 0xa7, 0xba, 0x2b, 0x71, 0x48, 0x02, 0x87, 0xfa, 0x35,
|
||||
0x6c, 0x3a, 0x81, 0x11, 0xf8, 0xf2, 0x59, 0x31, 0x68, 0x38, 0xf3, 0x31, 0x58, 0x43, 0x6e, 0x6c,
|
||||
0x35, 0x02, 0xcc, 0xb4, 0x18, 0x9f, 0x04, 0x6e, 0x3c, 0x16, 0x24, 0x66, 0x12, 0xfc, 0x29, 0xac,
|
||||
0xa7, 0xc7, 0x87, 0x59, 0x24, 0x3f, 0x68, 0x41, 0xc9, 0xbf, 0x0c, 0x29, 0xdf, 0x9b, 0x95, 0xa1,
|
||||
0x70, 0x70, 0x78, 0x7c, 0xd4, 0xde, 0xee, 0xf0, 0x0f, 0xce, 0xb6, 0x0f, 0x75, 0xfd, 0xf9, 0x51,
|
||||
0xb7, 0x9e, 0xd9, 0xfa, 0x75, 0x16, 0x32, 0x7b, 0x2f, 0xd0, 0x67, 0x90, 0xe3, 0x5f, 0x5f, 0x4c,
|
||||
0xf9, 0xe4, 0xa6, 0x39, 0xed, 0x03, 0x13, 0x7c, 0xe3, 0xc7, 0xff, 0xf5, 0xeb, 0x9f, 0x67, 0x16,
|
||||
0x71, 0xa5, 0x35, 0xf9, 0x76, 0xeb, 0x62, 0xd2, 0x62, 0x61, 0xea, 0x91, 0xf6, 0x00, 0x7d, 0x0c,
|
||||
0xd9, 0xa3, 0xb1, 0x87, 0x52, 0x3f, 0xc5, 0x69, 0xa6, 0x7f, 0x73, 0x82, 0x57, 0x98, 0xd0, 0x05,
|
||||
0x0c, 0x42, 0xe8, 0x68, 0xec, 0x51, 0x91, 0x3f, 0x84, 0xb2, 0xfa, 0xc5, 0xc8, 0xb5, 0xdf, 0xe7,
|
||||
0x34, 0xaf, 0xff, 0x1a, 0x05, 0xdf, 0x66, 0x50, 0x37, 0x30, 0x12, 0x50, 0xfc, 0x9b, 0x16, 0x75,
|
||||
0x16, 0xdd, 0x4b, 0x0b, 0xa5, 0x7e, 0xbd, 0xd3, 0x4c, 0xff, 0x40, 0x25, 0x36, 0x0b, 0xef, 0xd2,
|
||||
0xa2, 0x22, 0xff, 0x44, 0x7c, 0x9b, 0xd2, 0xf3, 0xd0, 0x9d, 0x84, 0x6f, 0x13, 0xd4, 0x57, 0xf8,
|
||||
0xe6, 0x7a, 0x3a, 0x83, 0x00, 0xb9, 0xc5, 0x40, 0x56, 0xf1, 0xa2, 0x00, 0xe9, 0xf9, 0x2c, 0x8f,
|
||||
0xb4, 0x07, 0x5b, 0x3d, 0xc8, 0xb1, 0x17, 0x2e, 0xf4, 0xb9, 0xfc, 0xd1, 0x4c, 0x78, 0xea, 0x4b,
|
||||
0x59, 0xe8, 0xd0, 0xdb, 0x18, 0x5e, 0x66, 0x40, 0x35, 0x5c, 0xa2, 0x40, 0xec, 0x7d, 0xeb, 0x91,
|
||||
0xf6, 0x60, 0x43, 0x7b, 0x5f, 0xdb, 0xfa, 0x55, 0x0e, 0x72, 0xac, 0xb4, 0x8b, 0x2e, 0x00, 0x82,
|
||||
0xd7, 0x9e, 0xe8, 0xec, 0x62, 0xef, 0x47, 0xd1, 0xd9, 0xc5, 0x1f, 0x8a, 0x70, 0x93, 0x81, 0x2e,
|
||||
0xe3, 0x05, 0x0a, 0xca, 0x2a, 0xc6, 0x2d, 0x56, 0x04, 0xa7, 0x76, 0xfc, 0x1b, 0x4d, 0x54, 0xb6,
|
||||
0xf9, 0x59, 0x42, 0x49, 0xd2, 0x42, 0x4f, 0x3e, 0xd1, 0xed, 0x90, 0xf0, 0xdc, 0x83, 0xbf, 0xcb,
|
||||
0x00, 0x5b, 0xb8, 0x1e, 0x00, 0x3a, 0x8c, 0xe3, 0x91, 0xf6, 0xe0, 0xf3, 0x06, 0x5e, 0x12, 0x56,
|
||||
0x8e, 0xf4, 0xa0, 0x1f, 0x41, 0x2d, 0xfc, 0xa4, 0x81, 0xee, 0x26, 0x60, 0x45, 0x5f, 0x46, 0x9a,
|
||||
0x6f, 0x4d, 0x67, 0x12, 0x3a, 0xad, 0x31, 0x9d, 0x04, 0x38, 0x47, 0xbe, 0x20, 0x64, 0x64, 0x50,
|
||||
0x26, 0xb1, 0x06, 0xe8, 0x1f, 0x34, 0xf1, 0xe2, 0x14, 0xbc, 0x51, 0xa0, 0x24, 0xe9, 0xb1, 0x17,
|
||||
0x90, 0xe6, 0xbd, 0x6b, 0xb8, 0x84, 0x12, 0x7f, 0xc8, 0x94, 0xf8, 0x00, 0x2f, 0x07, 0x4a, 0x78,
|
||||
0xe6, 0x90, 0x78, 0xb6, 0xd0, 0xe2, 0xf3, 0x5b, 0xf8, 0x46, 0xc8, 0x38, 0xa1, 0xde, 0x60, 0xb1,
|
||||
0xf8, 0x3b, 0x43, 0xe2, 0x62, 0x85, 0xde, 0x2d, 0x12, 0x17, 0x2b, 0xfc, 0x48, 0x91, 0xb4, 0x58,
|
||||
0xfc, 0x55, 0x21, 0x69, 0xb1, 0xfc, 0x9e, 0xad, 0xff, 0x9b, 0x87, 0xc2, 0x36, 0xff, 0x26, 0x1c,
|
||||
0xd9, 0x50, 0xf2, 0xcb, 0xf4, 0x68, 0x2d, 0xa9, 0xce, 0x18, 0x5c, 0x6b, 0x9a, 0x77, 0x52, 0xfb,
|
||||
0x85, 0x42, 0x6f, 0x32, 0x85, 0xde, 0xc0, 0xab, 0x14, 0x59, 0x7c, 0x76, 0xde, 0xe2, 0xc5, 0xac,
|
||||
0x96, 0xd1, 0xef, 0x53, 0x43, 0xfc, 0x29, 0x54, 0xd4, 0x3a, 0x3a, 0x7a, 0x33, 0xb1, 0xb6, 0xa9,
|
||||
0x96, 0xe2, 0x9b, 0x78, 0x1a, 0x8b, 0x40, 0x7e, 0x8b, 0x21, 0xaf, 0xe1, 0x9b, 0x09, 0xc8, 0x0e,
|
||||
0x63, 0x0d, 0x81, 0xf3, 0x1a, 0x78, 0x32, 0x78, 0xa8, 0xc4, 0x9e, 0x0c, 0x1e, 0x2e, 0xa1, 0x4f,
|
||||
0x05, 0x1f, 0x33, 0x56, 0x0a, 0xee, 0x02, 0x04, 0x95, 0x6c, 0x94, 0x68, 0x4b, 0xe5, 0x5e, 0x17,
|
||||
0x75, 0x0e, 0xf1, 0x22, 0x38, 0xc6, 0x0c, 0x56, 0xec, 0xbb, 0x08, 0xec, 0xc0, 0x74, 0x3d, 0x7e,
|
||||
0x30, 0xab, 0xa1, 0xd2, 0x34, 0x4a, 0x9c, 0x4f, 0xb8, 0xbe, 0xdd, 0xbc, 0x3b, 0x95, 0x47, 0xa0,
|
||||
0xdf, 0x63, 0xe8, 0x77, 0x70, 0x33, 0x01, 0x7d, 0xc4, 0x79, 0xe9, 0x66, 0xfb, 0xff, 0x3c, 0x94,
|
||||
0x9f, 0x19, 0xa6, 0xe5, 0x11, 0xcb, 0xb0, 0x7a, 0x04, 0x9d, 0x42, 0x8e, 0x45, 0xea, 0xa8, 0x23,
|
||||
0x56, 0xcb, 0xb6, 0x51, 0x47, 0x1c, 0xaa, 0x69, 0xe2, 0x75, 0x06, 0xdc, 0xc4, 0x2b, 0x14, 0x78,
|
||||
0x18, 0x88, 0x6e, 0xb1, 0x52, 0x24, 0x9d, 0xf4, 0x4b, 0xc8, 0x8b, 0xd7, 0xbe, 0x88, 0xa0, 0x50,
|
||||
0xf1, 0xa7, 0x79, 0x2b, 0xb9, 0x33, 0x69, 0x2f, 0xab, 0x30, 0x2e, 0xe3, 0xa3, 0x38, 0x13, 0x80,
|
||||
0xa0, 0xc6, 0x1e, 0x5d, 0xd1, 0x58, 0x49, 0xbe, 0xb9, 0x9e, 0xce, 0x90, 0x64, 0x53, 0x15, 0xb3,
|
||||
0xef, 0xf3, 0x52, 0xdc, 0x3f, 0x86, 0xf9, 0xa7, 0x86, 0x7b, 0x8e, 0x22, 0xb1, 0x57, 0xf9, 0x56,
|
||||
0xac, 0xd9, 0x4c, 0xea, 0x12, 0x28, 0x77, 0x18, 0xca, 0x4d, 0xee, 0xca, 0x54, 0x94, 0x73, 0xc3,
|
||||
0xa5, 0x41, 0x0d, 0xf5, 0x21, 0xcf, 0x3f, 0x1d, 0x8b, 0xda, 0x2f, 0xf4, 0xf9, 0x59, 0xd4, 0x7e,
|
||||
0xe1, 0xaf, 0xcd, 0xae, 0x47, 0x19, 0x41, 0x51, 0x7e, 0xab, 0x85, 0x22, 0x0f, 0xf7, 0x91, 0xef,
|
||||
0xba, 0x9a, 0x6b, 0x69, 0xdd, 0x02, 0xeb, 0x2e, 0xc3, 0xba, 0x8d, 0x1b, 0xb1, 0xb5, 0x12, 0x9c,
|
||||
0x8f, 0xb4, 0x07, 0xef, 0x6b, 0xe8, 0x47, 0x00, 0xc1, 0xb3, 0x44, 0xec, 0x04, 0x46, 0x5f, 0x38,
|
||||
0x62, 0x27, 0x30, 0xf6, 0xa2, 0x81, 0x37, 0x19, 0xee, 0x06, 0xbe, 0x1b, 0xc5, 0xf5, 0x1c, 0xc3,
|
||||
0x72, 0x5f, 0x12, 0xe7, 0x3d, 0x5e, 0x65, 0x75, 0xcf, 0xcd, 0x11, 0x9d, 0xb2, 0x03, 0x25, 0xbf,
|
||||
0xea, 0x1c, 0xf5, 0xb6, 0xd1, 0x6a, 0x78, 0xd4, 0xdb, 0xc6, 0xca, 0xd5, 0x61, 0xb7, 0x13, 0xda,
|
||||
0x2d, 0x92, 0x95, 0x1e, 0xc0, 0x5f, 0xd4, 0x61, 0x9e, 0x66, 0xdd, 0x34, 0x39, 0x09, 0xea, 0x26,
|
||||
0xd1, 0xd9, 0xc7, 0xaa, 0xa8, 0xd1, 0xd9, 0xc7, 0x4b, 0x2e, 0xe1, 0xe4, 0x84, 0x5e, 0xb2, 0x5a,
|
||||
0xbc, 0x44, 0x41, 0x67, 0x6a, 0x43, 0x59, 0x29, 0xac, 0xa0, 0x04, 0x61, 0xe1, 0xf2, 0x6c, 0x34,
|
||||
0xdc, 0x25, 0x54, 0x65, 0xf0, 0x1b, 0x0c, 0x6f, 0x85, 0x87, 0x3b, 0x86, 0xd7, 0xe7, 0x1c, 0x14,
|
||||
0x50, 0xcc, 0x4e, 0x9c, 0xfb, 0x84, 0xd9, 0x85, 0xcf, 0xfe, 0x7a, 0x3a, 0x43, 0xea, 0xec, 0x82,
|
||||
0x83, 0xff, 0x0a, 0x2a, 0x6a, 0x79, 0x05, 0x25, 0x28, 0x1f, 0x29, 0x29, 0x47, 0xe3, 0x48, 0x52,
|
||||
0x75, 0x26, 0xec, 0xd9, 0x18, 0xa4, 0xa1, 0xb0, 0x51, 0xe0, 0x01, 0x14, 0x44, 0xbd, 0x25, 0xc9,
|
||||
0xa4, 0xe1, 0xf2, 0x73, 0x92, 0x49, 0x23, 0xc5, 0x9a, 0x70, 0xf6, 0xcc, 0x10, 0xe9, 0x95, 0x52,
|
||||
0xc6, 0x6a, 0x81, 0xf6, 0x84, 0x78, 0x69, 0x68, 0x41, 0x25, 0x33, 0x0d, 0x4d, 0xb9, 0xce, 0xa7,
|
||||
0xa1, 0x9d, 0x11, 0x4f, 0xf8, 0x03, 0x79, 0x4d, 0x46, 0x29, 0xc2, 0xd4, 0xf8, 0x88, 0xa7, 0xb1,
|
||||
0x24, 0x5d, 0x6e, 0x02, 0x40, 0x19, 0x1c, 0x2f, 0x01, 0x82, 0x6a, 0x50, 0x34, 0x63, 0x4d, 0xac,
|
||||
0x82, 0x47, 0x33, 0xd6, 0xe4, 0x82, 0x52, 0xd8, 0xf7, 0x05, 0xb8, 0xfc, 0x6e, 0x45, 0x91, 0x7f,
|
||||
0xa6, 0x01, 0x8a, 0x17, 0x8e, 0xd0, 0xc3, 0x64, 0xe9, 0x89, 0xb5, 0xf5, 0xe6, 0xbb, 0xaf, 0xc7,
|
||||
0x9c, 0x14, 0xce, 0x02, 0x95, 0x7a, 0x8c, 0x7b, 0xf4, 0x8a, 0x2a, 0xf5, 0x97, 0x1a, 0x54, 0x43,
|
||||
0x55, 0x27, 0x74, 0x3f, 0x65, 0x4d, 0x23, 0x25, 0xf7, 0xe6, 0xdb, 0xd7, 0xf2, 0x25, 0xa5, 0xf2,
|
||||
0xca, 0x0e, 0x90, 0x77, 0x9a, 0x9f, 0x68, 0x50, 0x0b, 0x57, 0xa9, 0x50, 0x8a, 0xec, 0x58, 0xc9,
|
||||
0xbe, 0xb9, 0x71, 0x3d, 0xe3, 0xf4, 0xe5, 0x09, 0xae, 0x33, 0x03, 0x28, 0x88, 0xba, 0x56, 0xd2,
|
||||
0xc6, 0x0f, 0x17, 0xfb, 0x93, 0x36, 0x7e, 0xa4, 0x28, 0x96, 0xb0, 0xf1, 0x1d, 0x7b, 0x40, 0x94,
|
||||
0x63, 0x26, 0x0a, 0x5f, 0x69, 0x68, 0xd3, 0x8f, 0x59, 0xa4, 0x6a, 0x96, 0x86, 0x16, 0x1c, 0x33,
|
||||
0x59, 0xf1, 0x42, 0x29, 0xc2, 0xae, 0x39, 0x66, 0xd1, 0x82, 0x59, 0xc2, 0x31, 0x63, 0x80, 0xca,
|
||||
0x31, 0x0b, 0x6a, 0x53, 0x49, 0xc7, 0x2c, 0xf6, 0x76, 0x91, 0x74, 0xcc, 0xe2, 0xe5, 0xad, 0x84,
|
||||
0x75, 0x64, 0xb8, 0xa1, 0x63, 0xb6, 0x94, 0x50, 0xc6, 0x42, 0xef, 0xa6, 0x18, 0x31, 0xf1, 0x49,
|
||||
0xa4, 0xf9, 0xde, 0x6b, 0x72, 0xa7, 0xee, 0x71, 0x6e, 0x7e, 0xb9, 0xc7, 0xff, 0x56, 0x83, 0xe5,
|
||||
0xa4, 0x12, 0x18, 0x4a, 0xc1, 0x49, 0x79, 0x4a, 0x69, 0x6e, 0xbe, 0x2e, 0xfb, 0x74, 0x6b, 0xf9,
|
||||
0xbb, 0xfe, 0x71, 0xfd, 0x5f, 0xbf, 0x5c, 0xd3, 0xfe, 0xe3, 0xcb, 0x35, 0xed, 0xbf, 0xbf, 0x5c,
|
||||
0xd3, 0xfe, 0xee, 0x7f, 0xd6, 0xe6, 0x4e, 0xf3, 0xec, 0x3f, 0x1a, 0x7f, 0xfb, 0x37, 0x01, 0x00,
|
||||
0x00, 0xff, 0xff, 0xee, 0x4f, 0x63, 0x90, 0xed, 0x3c, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -9516,11 +9461,6 @@ func (m *HashKVResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||
i -= len(m.XXX_unrecognized)
|
||||
copy(dAtA[i:], m.XXX_unrecognized)
|
||||
}
|
||||
if m.HashRevision != 0 {
|
||||
i = encodeVarintRpc(dAtA, i, uint64(m.HashRevision))
|
||||
i--
|
||||
dAtA[i] = 0x20
|
||||
}
|
||||
if m.CompactRevision != 0 {
|
||||
i = encodeVarintRpc(dAtA, i, uint64(m.CompactRevision))
|
||||
i--
|
||||
|
@ -9641,13 +9581,6 @@ func (m *SnapshotResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||
i -= len(m.XXX_unrecognized)
|
||||
copy(dAtA[i:], m.XXX_unrecognized)
|
||||
}
|
||||
if len(m.Version) > 0 {
|
||||
i -= len(m.Version)
|
||||
copy(dAtA[i:], m.Version)
|
||||
i = encodeVarintRpc(dAtA, i, uint64(len(m.Version)))
|
||||
i--
|
||||
dAtA[i] = 0x22
|
||||
}
|
||||
if len(m.Blob) > 0 {
|
||||
i -= len(m.Blob)
|
||||
copy(dAtA[i:], m.Blob)
|
||||
|
@ -11548,13 +11481,6 @@ func (m *StatusResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
|||
i -= len(m.XXX_unrecognized)
|
||||
copy(dAtA[i:], m.XXX_unrecognized)
|
||||
}
|
||||
if len(m.StorageVersion) > 0 {
|
||||
i -= len(m.StorageVersion)
|
||||
copy(dAtA[i:], m.StorageVersion)
|
||||
i = encodeVarintRpc(dAtA, i, uint64(len(m.StorageVersion)))
|
||||
i--
|
||||
dAtA[i] = 0x5a
|
||||
}
|
||||
if m.IsLearner {
|
||||
i--
|
||||
if m.IsLearner {
|
||||
|
@ -13533,9 +13459,6 @@ func (m *HashKVResponse) Size() (n int) {
|
|||
if m.CompactRevision != 0 {
|
||||
n += 1 + sovRpc(uint64(m.CompactRevision))
|
||||
}
|
||||
if m.HashRevision != 0 {
|
||||
n += 1 + sovRpc(uint64(m.HashRevision))
|
||||
}
|
||||
if m.XXX_unrecognized != nil {
|
||||
n += len(m.XXX_unrecognized)
|
||||
}
|
||||
|
@ -13590,10 +13513,6 @@ func (m *SnapshotResponse) Size() (n int) {
|
|||
if l > 0 {
|
||||
n += 1 + l + sovRpc(uint64(l))
|
||||
}
|
||||
l = len(m.Version)
|
||||
if l > 0 {
|
||||
n += 1 + l + sovRpc(uint64(l))
|
||||
}
|
||||
if m.XXX_unrecognized != nil {
|
||||
n += len(m.XXX_unrecognized)
|
||||
}
|
||||
|
@ -14470,10 +14389,6 @@ func (m *StatusResponse) Size() (n int) {
|
|||
if m.IsLearner {
|
||||
n += 2
|
||||
}
|
||||
l = len(m.StorageVersion)
|
||||
if l > 0 {
|
||||
n += 1 + l + sovRpc(uint64(l))
|
||||
}
|
||||
if m.XXX_unrecognized != nil {
|
||||
n += len(m.XXX_unrecognized)
|
||||
}
|
||||
|
@ -17653,25 +17568,6 @@ func (m *HashKVResponse) Unmarshal(dAtA []byte) error {
|
|||
break
|
||||
}
|
||||
}
|
||||
case 4:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field HashRevision", wireType)
|
||||
}
|
||||
m.HashRevision = 0
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowRpc
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
m.HashRevision |= int64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipRpc(dAtA[iNdEx:])
|
||||
|
@ -17969,38 +17865,6 @@ func (m *SnapshotResponse) Unmarshal(dAtA []byte) error {
|
|||
m.Blob = []byte{}
|
||||
}
|
||||
iNdEx = postIndex
|
||||
case 4:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowRpc
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
stringLen |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
intStringLen := int(stringLen)
|
||||
if intStringLen < 0 {
|
||||
return ErrInvalidLengthRpc
|
||||
}
|
||||
postIndex := iNdEx + intStringLen
|
||||
if postIndex < 0 {
|
||||
return ErrInvalidLengthRpc
|
||||
}
|
||||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.Version = string(dAtA[iNdEx:postIndex])
|
||||
iNdEx = postIndex
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipRpc(dAtA[iNdEx:])
|
||||
|
@ -22595,38 +22459,6 @@ func (m *StatusResponse) Unmarshal(dAtA []byte) error {
|
|||
}
|
||||
}
|
||||
m.IsLearner = bool(v != 0)
|
||||
case 11:
|
||||
if wireType != 2 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field StorageVersion", wireType)
|
||||
}
|
||||
var stringLen uint64
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowRpc
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
stringLen |= uint64(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
intStringLen := int(stringLen)
|
||||
if intStringLen < 0 {
|
||||
return ErrInvalidLengthRpc
|
||||
}
|
||||
postIndex := iNdEx + intStringLen
|
||||
if postIndex < 0 {
|
||||
return ErrInvalidLengthRpc
|
||||
}
|
||||
if postIndex > l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
m.StorageVersion = string(dAtA[iNdEx:postIndex])
|
||||
iNdEx = postIndex
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipRpc(dAtA[iNdEx:])
|
||||
|
|
|
@ -4,34 +4,13 @@ package etcdserverpb;
|
|||
import "gogoproto/gogo.proto";
|
||||
import "etcd/api/mvccpb/kv.proto";
|
||||
import "etcd/api/authpb/auth.proto";
|
||||
import "etcd/api/versionpb/version.proto";
|
||||
|
||||
// for grpc-gateway
|
||||
import "google/api/annotations.proto";
|
||||
import "protoc-gen-swagger/options/annotations.proto";
|
||||
|
||||
option (gogoproto.marshaler_all) = true;
|
||||
option (gogoproto.unmarshaler_all) = true;
|
||||
|
||||
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {
|
||||
security_definitions: {
|
||||
security: {
|
||||
key: "ApiKey";
|
||||
value: {
|
||||
type: TYPE_API_KEY;
|
||||
in: IN_HEADER;
|
||||
name: "Authorization";
|
||||
}
|
||||
}
|
||||
}
|
||||
security: {
|
||||
security_requirement: {
|
||||
key: "ApiKey";
|
||||
value: {};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
service KV {
|
||||
// Range gets the keys in the range from the key-value store.
|
||||
rpc Range(RangeRequest) returns (RangeResponse) {
|
||||
|
@ -409,16 +388,13 @@ service Auth {
|
|||
}
|
||||
|
||||
message ResponseHeader {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// cluster_id is the ID of the cluster which sent the response.
|
||||
uint64 cluster_id = 1;
|
||||
// member_id is the ID of the member which sent the response.
|
||||
uint64 member_id = 2;
|
||||
// revision is the key-value store revision when the request was applied, and it's
|
||||
// unset (so 0) in case of calls not interacting with key-value store.
|
||||
// revision is the key-value store revision when the request was applied.
|
||||
// For watch progress responses, the header.revision indicates progress. All future events
|
||||
// received in this stream are guaranteed to have a higher revision number than the
|
||||
// recieved in this stream are guaranteed to have a higher revision number than the
|
||||
// header.revision number.
|
||||
int64 revision = 3;
|
||||
// raft_term is the raft term when the request was applied.
|
||||
|
@ -426,16 +402,12 @@ message ResponseHeader {
|
|||
}
|
||||
|
||||
message RangeRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
enum SortOrder {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
NONE = 0; // default, no sorting
|
||||
ASCEND = 1; // lowest target value first
|
||||
DESCEND = 2; // highest target value first
|
||||
}
|
||||
enum SortTarget {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
KEY = 0;
|
||||
VERSION = 1;
|
||||
CREATE = 2;
|
||||
|
@ -481,24 +453,22 @@ message RangeRequest {
|
|||
|
||||
// min_mod_revision is the lower bound for returned key mod revisions; all keys with
|
||||
// lesser mod revisions will be filtered away.
|
||||
int64 min_mod_revision = 10 [(versionpb.etcd_version_field)="3.1"];
|
||||
int64 min_mod_revision = 10;
|
||||
|
||||
// max_mod_revision is the upper bound for returned key mod revisions; all keys with
|
||||
// greater mod revisions will be filtered away.
|
||||
int64 max_mod_revision = 11 [(versionpb.etcd_version_field)="3.1"];
|
||||
int64 max_mod_revision = 11;
|
||||
|
||||
// min_create_revision is the lower bound for returned key create revisions; all keys with
|
||||
// lesser create revisions will be filtered away.
|
||||
int64 min_create_revision = 12 [(versionpb.etcd_version_field)="3.1"];
|
||||
int64 min_create_revision = 12;
|
||||
|
||||
// max_create_revision is the upper bound for returned key create revisions; all keys with
|
||||
// greater create revisions will be filtered away.
|
||||
int64 max_create_revision = 13 [(versionpb.etcd_version_field)="3.1"];
|
||||
int64 max_create_revision = 13;
|
||||
}
|
||||
|
||||
message RangeResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// kvs is the list of key-value pairs matched by the range request.
|
||||
// kvs is empty when count is requested.
|
||||
|
@ -510,8 +480,6 @@ message RangeResponse {
|
|||
}
|
||||
|
||||
message PutRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// key is the key, in bytes, to put into the key-value store.
|
||||
bytes key = 1;
|
||||
// value is the value, in bytes, to associate with the key in the key-value store.
|
||||
|
@ -522,28 +490,24 @@ message PutRequest {
|
|||
|
||||
// If prev_kv is set, etcd gets the previous key-value pair before changing it.
|
||||
// The previous key-value pair will be returned in the put response.
|
||||
bool prev_kv = 4 [(versionpb.etcd_version_field)="3.1"];
|
||||
bool prev_kv = 4;
|
||||
|
||||
// If ignore_value is set, etcd updates the key using its current value.
|
||||
// Returns an error if the key does not exist.
|
||||
bool ignore_value = 5 [(versionpb.etcd_version_field)="3.2"];
|
||||
bool ignore_value = 5;
|
||||
|
||||
// If ignore_lease is set, etcd updates the key using its current lease.
|
||||
// Returns an error if the key does not exist.
|
||||
bool ignore_lease = 6 [(versionpb.etcd_version_field)="3.2"];
|
||||
bool ignore_lease = 6;
|
||||
}
|
||||
|
||||
message PutResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// if prev_kv is set in the request, the previous key-value pair will be returned.
|
||||
mvccpb.KeyValue prev_kv = 2 [(versionpb.etcd_version_field)="3.1"];
|
||||
mvccpb.KeyValue prev_kv = 2;
|
||||
}
|
||||
|
||||
message DeleteRangeRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// key is the first key to delete in the range.
|
||||
bytes key = 1;
|
||||
// range_end is the key following the last key to delete for the range [key, range_end).
|
||||
|
@ -555,61 +519,50 @@ message DeleteRangeRequest {
|
|||
|
||||
// If prev_kv is set, etcd gets the previous key-value pairs before deleting it.
|
||||
// The previous key-value pairs will be returned in the delete response.
|
||||
bool prev_kv = 3 [(versionpb.etcd_version_field)="3.1"];
|
||||
bool prev_kv = 3;
|
||||
}
|
||||
|
||||
message DeleteRangeResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// deleted is the number of keys deleted by the delete range request.
|
||||
int64 deleted = 2;
|
||||
// if prev_kv is set in the request, the previous key-value pairs will be returned.
|
||||
repeated mvccpb.KeyValue prev_kvs = 3 [(versionpb.etcd_version_field)="3.1"];
|
||||
repeated mvccpb.KeyValue prev_kvs = 3;
|
||||
}
|
||||
|
||||
message RequestOp {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// request is a union of request types accepted by a transaction.
|
||||
oneof request {
|
||||
RangeRequest request_range = 1;
|
||||
PutRequest request_put = 2;
|
||||
DeleteRangeRequest request_delete_range = 3;
|
||||
TxnRequest request_txn = 4 [(versionpb.etcd_version_field)="3.3"];
|
||||
TxnRequest request_txn = 4;
|
||||
}
|
||||
}
|
||||
|
||||
message ResponseOp {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// response is a union of response types returned by a transaction.
|
||||
oneof response {
|
||||
RangeResponse response_range = 1;
|
||||
PutResponse response_put = 2;
|
||||
DeleteRangeResponse response_delete_range = 3;
|
||||
TxnResponse response_txn = 4 [(versionpb.etcd_version_field)="3.3"];
|
||||
TxnResponse response_txn = 4;
|
||||
}
|
||||
}
|
||||
|
||||
message Compare {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
enum CompareResult {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
|
||||
EQUAL = 0;
|
||||
GREATER = 1;
|
||||
LESS = 2;
|
||||
NOT_EQUAL = 3 [(versionpb.etcd_version_enum_value)="3.1"];
|
||||
NOT_EQUAL = 3;
|
||||
}
|
||||
enum CompareTarget {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
|
||||
VERSION = 0;
|
||||
CREATE = 1;
|
||||
MOD = 2;
|
||||
VALUE = 3;
|
||||
LEASE = 4 [(versionpb.etcd_version_enum_value)="3.3"];
|
||||
LEASE = 4;
|
||||
}
|
||||
// result is logical comparison operation for this comparison.
|
||||
CompareResult result = 1;
|
||||
|
@ -627,13 +580,13 @@ message Compare {
|
|||
// value is the value of the given key, in bytes.
|
||||
bytes value = 7;
|
||||
// lease is the lease id of the given key.
|
||||
int64 lease = 8 [(versionpb.etcd_version_field)="3.3"];
|
||||
int64 lease = 8;
|
||||
// leave room for more target_union field tags, jump to 64
|
||||
}
|
||||
|
||||
// range_end compares the given target to all keys in the range [key, range_end).
|
||||
// See RangeRequest for more details on key ranges.
|
||||
bytes range_end = 64 [(versionpb.etcd_version_field)="3.3"];
|
||||
bytes range_end = 64;
|
||||
// TODO: fill out with most of the rest of RangeRequest fields when needed.
|
||||
}
|
||||
|
||||
|
@ -653,8 +606,6 @@ message Compare {
|
|||
// true.
|
||||
// 3. A list of database operations called f op. Like t op, but executed if guard evaluates to false.
|
||||
message TxnRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// compare is a list of predicates representing a conjunction of terms.
|
||||
// If the comparisons succeed, then the success requests will be processed in order,
|
||||
// and the response will contain their respective responses in order.
|
||||
|
@ -668,8 +619,6 @@ message TxnRequest {
|
|||
}
|
||||
|
||||
message TxnResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// succeeded is set to true if the compare evaluated to true or false otherwise.
|
||||
bool succeeded = 2;
|
||||
|
@ -681,8 +630,6 @@ message TxnResponse {
|
|||
// CompactionRequest compacts the key-value store up to a given revision. All superseded keys
|
||||
// with a revision less than the compaction revision will be removed.
|
||||
message CompactionRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// revision is the key-value store revision for the compaction operation.
|
||||
int64 revision = 1;
|
||||
// physical is set so the RPC will wait until the compaction is physically
|
||||
|
@ -692,48 +639,35 @@ message CompactionRequest {
|
|||
}
|
||||
|
||||
message CompactionResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message HashRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message HashKVRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
// revision is the key-value store revision for the hash operation.
|
||||
int64 revision = 1;
|
||||
}
|
||||
|
||||
message HashKVResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// hash is the hash value computed from the responding member's MVCC keys up to a given revision.
|
||||
uint32 hash = 2;
|
||||
// compact_revision is the compacted revision of key-value store when hash begins.
|
||||
int64 compact_revision = 3;
|
||||
// hash_revision is the revision up to which the hash is calculated.
|
||||
int64 hash_revision = 4 [(versionpb.etcd_version_field)="3.6"];
|
||||
}
|
||||
|
||||
message HashResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// hash is the hash value computed from the responding member's KV's backend.
|
||||
uint32 hash = 2;
|
||||
}
|
||||
|
||||
message SnapshotRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
}
|
||||
|
||||
message SnapshotResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
|
||||
// header has the current key-value store information. The first header in the snapshot
|
||||
// stream indicates the point in time of the snapshot.
|
||||
ResponseHeader header = 1;
|
||||
|
@ -743,26 +677,18 @@ message SnapshotResponse {
|
|||
|
||||
// blob contains the next chunk of the snapshot in the snapshot stream.
|
||||
bytes blob = 3;
|
||||
|
||||
// local version of server that created the snapshot.
|
||||
// In cluster with binaries with different version, each cluster can return different result.
|
||||
// Informs which etcd server version should be used when restoring the snapshot.
|
||||
string version = 4 [(versionpb.etcd_version_field)="3.6"];
|
||||
}
|
||||
|
||||
message WatchRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// request_union is a request to either create a new watcher or cancel an existing watcher.
|
||||
oneof request_union {
|
||||
WatchCreateRequest create_request = 1;
|
||||
WatchCancelRequest cancel_request = 2;
|
||||
WatchProgressRequest progress_request = 3 [(versionpb.etcd_version_field)="3.4"];
|
||||
WatchProgressRequest progress_request = 3;
|
||||
}
|
||||
}
|
||||
|
||||
message WatchCreateRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// key is the key to register for watching.
|
||||
bytes key = 1;
|
||||
|
||||
|
@ -783,8 +709,6 @@ message WatchCreateRequest {
|
|||
bool progress_notify = 4;
|
||||
|
||||
enum FilterType {
|
||||
option (versionpb.etcd_version_enum) = "3.1";
|
||||
|
||||
// filter out put event.
|
||||
NOPUT = 0;
|
||||
// filter out delete event.
|
||||
|
@ -792,38 +716,34 @@ message WatchCreateRequest {
|
|||
}
|
||||
|
||||
// filters filter the events at server side before it sends back to the watcher.
|
||||
repeated FilterType filters = 5 [(versionpb.etcd_version_field)="3.1"];
|
||||
repeated FilterType filters = 5;
|
||||
|
||||
// If prev_kv is set, created watcher gets the previous KV before the event happens.
|
||||
// If the previous KV is already compacted, nothing will be returned.
|
||||
bool prev_kv = 6 [(versionpb.etcd_version_field)="3.1"];
|
||||
bool prev_kv = 6;
|
||||
|
||||
// If watch_id is provided and non-zero, it will be assigned to this watcher.
|
||||
// Since creating a watcher in etcd is not a synchronous operation,
|
||||
// this can be used ensure that ordering is correct when creating multiple
|
||||
// watchers on the same stream. Creating a watcher with an ID already in
|
||||
// use on the stream will cause an error to be returned.
|
||||
int64 watch_id = 7 [(versionpb.etcd_version_field)="3.4"];
|
||||
int64 watch_id = 7;
|
||||
|
||||
// fragment enables splitting large revisions into multiple watch responses.
|
||||
bool fragment = 8 [(versionpb.etcd_version_field)="3.4"];
|
||||
bool fragment = 8;
|
||||
}
|
||||
|
||||
message WatchCancelRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.1";
|
||||
// watch_id is the watcher id to cancel so that no more events are transmitted.
|
||||
int64 watch_id = 1 [(versionpb.etcd_version_field)="3.1"];
|
||||
int64 watch_id = 1;
|
||||
}
|
||||
|
||||
// Requests the a watch stream progress status be sent in the watch response stream as soon as
|
||||
// possible.
|
||||
message WatchProgressRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
}
|
||||
|
||||
message WatchResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// watch_id is the ID of the watcher that corresponds to the response.
|
||||
int64 watch_id = 2;
|
||||
|
@ -849,17 +769,15 @@ message WatchResponse {
|
|||
int64 compact_revision = 5;
|
||||
|
||||
// cancel_reason indicates the reason for canceling the watcher.
|
||||
string cancel_reason = 6 [(versionpb.etcd_version_field)="3.4"];
|
||||
string cancel_reason = 6;
|
||||
|
||||
// framgment is true if large watch response was split over multiple responses.
|
||||
bool fragment = 7 [(versionpb.etcd_version_field)="3.4"];
|
||||
bool fragment = 7;
|
||||
|
||||
repeated mvccpb.Event events = 11;
|
||||
}
|
||||
|
||||
message LeaseGrantRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// TTL is the advisory time-to-live in seconds. Expired lease will return -1.
|
||||
int64 TTL = 1;
|
||||
// ID is the requested ID for the lease. If ID is set to 0, the lessor chooses an ID.
|
||||
|
@ -867,8 +785,6 @@ message LeaseGrantRequest {
|
|||
}
|
||||
|
||||
message LeaseGrantResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// ID is the lease ID for the granted lease.
|
||||
int64 ID = 2;
|
||||
|
@ -878,21 +794,15 @@ message LeaseGrantResponse {
|
|||
}
|
||||
|
||||
message LeaseRevokeRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// ID is the lease ID to revoke. When the ID is revoked, all associated keys will be deleted.
|
||||
int64 ID = 1;
|
||||
}
|
||||
|
||||
message LeaseRevokeResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message LeaseCheckpoint {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
|
||||
// ID is the lease ID to checkpoint.
|
||||
int64 ID = 1;
|
||||
|
||||
|
@ -901,26 +811,19 @@ message LeaseCheckpoint {
|
|||
}
|
||||
|
||||
message LeaseCheckpointRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
|
||||
repeated LeaseCheckpoint checkpoints = 1;
|
||||
}
|
||||
|
||||
message LeaseCheckpointResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message LeaseKeepAliveRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// ID is the lease ID for the lease to keep alive.
|
||||
int64 ID = 1;
|
||||
}
|
||||
|
||||
message LeaseKeepAliveResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// ID is the lease ID from the keep alive request.
|
||||
int64 ID = 2;
|
||||
|
@ -929,7 +832,6 @@ message LeaseKeepAliveResponse {
|
|||
}
|
||||
|
||||
message LeaseTimeToLiveRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.1";
|
||||
// ID is the lease ID for the lease.
|
||||
int64 ID = 1;
|
||||
// keys is true to query all the keys attached to this lease.
|
||||
|
@ -937,8 +839,6 @@ message LeaseTimeToLiveRequest {
|
|||
}
|
||||
|
||||
message LeaseTimeToLiveResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.1";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// ID is the lease ID from the keep alive request.
|
||||
int64 ID = 2;
|
||||
|
@ -951,26 +851,19 @@ message LeaseTimeToLiveResponse {
|
|||
}
|
||||
|
||||
message LeaseLeasesRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
}
|
||||
|
||||
message LeaseStatus {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
|
||||
int64 ID = 1;
|
||||
// TODO: int64 TTL = 2;
|
||||
}
|
||||
|
||||
message LeaseLeasesResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
repeated LeaseStatus leases = 2;
|
||||
}
|
||||
|
||||
message Member {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// ID is the member ID for this member.
|
||||
uint64 ID = 1;
|
||||
// name is the human-readable name of the member. If the member is not started, the name will be an empty string.
|
||||
|
@ -980,21 +873,17 @@ message Member {
|
|||
// clientURLs is the list of URLs the member exposes to clients for communication. If the member is not started, clientURLs will be empty.
|
||||
repeated string clientURLs = 4;
|
||||
// isLearner indicates if the member is raft learner.
|
||||
bool isLearner = 5 [(versionpb.etcd_version_field)="3.4"];
|
||||
bool isLearner = 5;
|
||||
}
|
||||
|
||||
message MemberAddRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// peerURLs is the list of URLs the added member will use to communicate with the cluster.
|
||||
repeated string peerURLs = 1;
|
||||
// isLearner indicates if the added member is raft learner.
|
||||
bool isLearner = 2 [(versionpb.etcd_version_field)="3.4"];
|
||||
bool isLearner = 2;
|
||||
}
|
||||
|
||||
message MemberAddResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// member is the member information for the added member.
|
||||
Member member = 2;
|
||||
|
@ -1003,22 +892,17 @@ message MemberAddResponse {
|
|||
}
|
||||
|
||||
message MemberRemoveRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// ID is the member ID of the member to remove.
|
||||
uint64 ID = 1;
|
||||
}
|
||||
|
||||
message MemberRemoveResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// members is a list of all members after removing the member.
|
||||
repeated Member members = 2;
|
||||
}
|
||||
|
||||
message MemberUpdateRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// ID is the member ID of the member to update.
|
||||
uint64 ID = 1;
|
||||
// peerURLs is the new list of URLs the member will use to communicate with the cluster.
|
||||
|
@ -1026,77 +910,56 @@ message MemberUpdateRequest {
|
|||
}
|
||||
|
||||
message MemberUpdateResponse{
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// members is a list of all members after updating the member.
|
||||
repeated Member members = 2 [(versionpb.etcd_version_field)="3.1"];
|
||||
repeated Member members = 2;
|
||||
}
|
||||
|
||||
message MemberListRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
bool linearizable = 1 [(versionpb.etcd_version_field)="3.5"];
|
||||
bool linearizable = 1;
|
||||
}
|
||||
|
||||
message MemberListResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// members is a list of all members associated with the cluster.
|
||||
repeated Member members = 2;
|
||||
}
|
||||
|
||||
message MemberPromoteRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
// ID is the member ID of the member to promote.
|
||||
uint64 ID = 1;
|
||||
}
|
||||
|
||||
message MemberPromoteResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.4";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// members is a list of all members after promoting the member.
|
||||
repeated Member members = 2;
|
||||
}
|
||||
|
||||
message DefragmentRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message DefragmentResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message MoveLeaderRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
// targetID is the node ID for the new leader.
|
||||
uint64 targetID = 1;
|
||||
}
|
||||
|
||||
message MoveLeaderResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.3";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
enum AlarmType {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
|
||||
NONE = 0; // default, used to query if any alarm is active
|
||||
NOSPACE = 1; // space quota is exhausted
|
||||
CORRUPT = 2 [(versionpb.etcd_version_enum_value)="3.3"]; // kv store corruption detected
|
||||
CORRUPT = 2; // kv store corruption detected
|
||||
}
|
||||
|
||||
message AlarmRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
enum AlarmAction {
|
||||
option (versionpb.etcd_version_enum) = "3.0";
|
||||
|
||||
GET = 0;
|
||||
ACTIVATE = 1;
|
||||
DEACTIVATE = 2;
|
||||
|
@ -1113,7 +976,6 @@ message AlarmRequest {
|
|||
}
|
||||
|
||||
message AlarmMember {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// memberID is the ID of the member associated with the raised alarm.
|
||||
uint64 memberID = 1;
|
||||
// alarm is the type of alarm which has been raised.
|
||||
|
@ -1121,19 +983,13 @@ message AlarmMember {
|
|||
}
|
||||
|
||||
message AlarmResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// alarms is a list of alarms associated with the alarm request.
|
||||
repeated AlarmMember alarms = 2;
|
||||
}
|
||||
|
||||
message DowngradeRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
enum DowngradeAction {
|
||||
option (versionpb.etcd_version_enum) = "3.5";
|
||||
|
||||
VALIDATE = 0;
|
||||
ENABLE = 1;
|
||||
CANCEL = 2;
|
||||
|
@ -1148,20 +1004,15 @@ message DowngradeRequest {
|
|||
}
|
||||
|
||||
message DowngradeResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// version is the current cluster version.
|
||||
string version = 2;
|
||||
}
|
||||
|
||||
message StatusRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message StatusResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// version is the cluster protocol version used by the responding member.
|
||||
string version = 2;
|
||||
|
@ -1174,71 +1025,55 @@ message StatusResponse {
|
|||
// raftTerm is the current raft term of the responding member.
|
||||
uint64 raftTerm = 6;
|
||||
// raftAppliedIndex is the current raft applied index of the responding member.
|
||||
uint64 raftAppliedIndex = 7 [(versionpb.etcd_version_field)="3.4"];
|
||||
uint64 raftAppliedIndex = 7;
|
||||
// errors contains alarm/health information and status.
|
||||
repeated string errors = 8 [(versionpb.etcd_version_field)="3.4"];
|
||||
repeated string errors = 8;
|
||||
// dbSizeInUse is the size of the backend database logically in use, in bytes, of the responding member.
|
||||
int64 dbSizeInUse = 9 [(versionpb.etcd_version_field)="3.4"];
|
||||
int64 dbSizeInUse = 9;
|
||||
// isLearner indicates if the member is raft learner.
|
||||
bool isLearner = 10 [(versionpb.etcd_version_field)="3.4"];
|
||||
// storageVersion is the version of the db file. It might be get updated with delay in relationship to the target cluster version.
|
||||
string storageVersion = 11 [(versionpb.etcd_version_field)="3.6"];
|
||||
bool isLearner = 10;
|
||||
}
|
||||
|
||||
message AuthEnableRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message AuthDisableRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message AuthStatusRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
}
|
||||
|
||||
message AuthenticateRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string name = 1;
|
||||
string password = 2;
|
||||
}
|
||||
|
||||
message AuthUserAddRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string name = 1;
|
||||
string password = 2;
|
||||
authpb.UserAddOptions options = 3 [(versionpb.etcd_version_field)="3.4"];
|
||||
string hashedPassword = 4 [(versionpb.etcd_version_field)="3.5"];
|
||||
authpb.UserAddOptions options = 3;
|
||||
string hashedPassword = 4;
|
||||
}
|
||||
|
||||
message AuthUserGetRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
message AuthUserDeleteRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
// name is the name of the user to delete.
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
message AuthUserChangePasswordRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// name is the name of the user whose password is being changed.
|
||||
string name = 1;
|
||||
// password is the new password for the user. Note that this field will be removed in the API layer.
|
||||
string password = 2;
|
||||
// hashedPassword is the new password for the user. Note that this field will be initialized in the API layer.
|
||||
string hashedPassword = 3 [(versionpb.etcd_version_field)="3.5"];
|
||||
string hashedPassword = 3;
|
||||
}
|
||||
|
||||
message AuthUserGrantRoleRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// user is the name of the user which should be granted a given role.
|
||||
string user = 1;
|
||||
// role is the name of the role to grant to the user.
|
||||
|
@ -1246,42 +1081,30 @@ message AuthUserGrantRoleRequest {
|
|||
}
|
||||
|
||||
message AuthUserRevokeRoleRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string name = 1;
|
||||
string role = 2;
|
||||
}
|
||||
|
||||
message AuthRoleAddRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// name is the name of the role to add to the authentication system.
|
||||
string name = 1;
|
||||
}
|
||||
|
||||
message AuthRoleGetRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string role = 1;
|
||||
}
|
||||
|
||||
message AuthUserListRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message AuthRoleListRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
}
|
||||
|
||||
message AuthRoleDeleteRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string role = 1;
|
||||
}
|
||||
|
||||
message AuthRoleGrantPermissionRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
// name is the name of the role which will be granted the permission.
|
||||
string name = 1;
|
||||
// perm is the permission to grant to the role.
|
||||
|
@ -1289,28 +1112,20 @@ message AuthRoleGrantPermissionRequest {
|
|||
}
|
||||
|
||||
message AuthRoleRevokePermissionRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
string role = 1;
|
||||
bytes key = 2;
|
||||
bytes range_end = 3;
|
||||
}
|
||||
|
||||
message AuthEnableResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthDisableResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthStatusResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
bool enabled = 2;
|
||||
// authRevision is the current revision of auth store
|
||||
|
@ -1318,93 +1133,67 @@ message AuthStatusResponse {
|
|||
}
|
||||
|
||||
message AuthenticateResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
// token is an authorized token that can be used in succeeding RPCs
|
||||
string token = 2;
|
||||
}
|
||||
|
||||
message AuthUserAddResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthUserGetResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
|
||||
repeated string roles = 2;
|
||||
}
|
||||
|
||||
message AuthUserDeleteResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthUserChangePasswordResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthUserGrantRoleResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthUserRevokeRoleResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthRoleAddResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthRoleGetResponse {
|
||||
ResponseHeader header = 1 [(versionpb.etcd_version_field)="3.0"];
|
||||
ResponseHeader header = 1;
|
||||
|
||||
repeated authpb.Permission perm = 2 [(versionpb.etcd_version_field)="3.0"];
|
||||
repeated authpb.Permission perm = 2;
|
||||
}
|
||||
|
||||
message AuthRoleListResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
|
||||
repeated string roles = 2;
|
||||
}
|
||||
|
||||
message AuthUserListResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
|
||||
repeated string users = 2;
|
||||
}
|
||||
|
||||
message AuthRoleDeleteResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthRoleGrantPermissionResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
||||
message AuthRoleRevokePermissionResponse {
|
||||
option (versionpb.etcd_version_msg) = "3.0";
|
||||
|
||||
ResponseHeader header = 1;
|
||||
}
|
||||
|
|
21
api/go.mod
21
api/go.mod
|
@ -3,23 +3,20 @@ module go.etcd.io/etcd/api/v3
|
|||
go 1.19
|
||||
|
||||
require (
|
||||
github.com/coreos/go-semver v0.3.1
|
||||
github.com/coreos/go-semver v0.3.0
|
||||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/golang/protobuf v1.5.3
|
||||
github.com/golang/protobuf v1.5.2
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1
|
||||
google.golang.org/grpc v1.51.0
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c
|
||||
google.golang.org/grpc v1.41.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
|
||||
golang.org/x/text v0.3.5 // indirect
|
||||
google.golang.org/protobuf v1.26.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
)
|
||||
|
||||
// Bad imports are sometimes causing attempts to pull that code.
|
||||
|
|
60
api/go.sum
60
api/go.sum
|
@ -1,24 +1,22 @@
|
|||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
||||
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
|
||||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
|
||||
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
|
@ -37,32 +35,29 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
|
|||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
|
@ -71,8 +66,11 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL
|
|||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
|
@ -83,9 +81,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
|||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -94,6 +91,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -101,23 +99,23 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -129,17 +127,17 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA
|
|||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 h1:b9mVrqYfq3P4bCdaLg1qtBnPzUYgglsIdjZkL/fQVOE=
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0=
|
||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
||||
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
|
||||
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
|
||||
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||
google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E=
|
||||
google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
|
@ -150,15 +148,13 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
|
|||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
|
||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
|
||||
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
|
|
@ -11,7 +11,6 @@ import (
|
|||
|
||||
_ "github.com/gogo/protobuf/gogoproto"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
_ "go.etcd.io/etcd/api/v3/versionpb"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
@ -287,33 +286,30 @@ func init() {
|
|||
func init() { proto.RegisterFile("membership.proto", fileDescriptor_949fe0d019050ef5) }
|
||||
|
||||
var fileDescriptor_949fe0d019050ef5 = []byte{
|
||||
// 401 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x52, 0xcd, 0xae, 0xd2, 0x40,
|
||||
0x14, 0xbe, 0xd3, 0xde, 0xdc, 0xdb, 0x9e, 0x6b, 0x10, 0x27, 0x24, 0x36, 0xa0, 0xb5, 0x61, 0xc5,
|
||||
0xaa, 0x24, 0x12, 0x36, 0xee, 0x54, 0x58, 0x60, 0xc4, 0xc5, 0x18, 0xdc, 0x92, 0x29, 0x1c, 0xb0,
|
||||
0x49, 0x69, 0xeb, 0xcc, 0x14, 0xf7, 0x2e, 0x7d, 0x02, 0xdf, 0xc2, 0x95, 0xef, 0xc0, 0xd2, 0x47,
|
||||
0x50, 0x7c, 0x11, 0xd3, 0x99, 0x42, 0x4b, 0x74, 0x75, 0x77, 0xa7, 0x5f, 0xcf, 0xf9, 0xfe, 0x5a,
|
||||
0x68, 0xef, 0x70, 0x17, 0xa1, 0x90, 0x1f, 0xe3, 0x3c, 0xcc, 0x45, 0xa6, 0x32, 0xfa, 0xa0, 0x46,
|
||||
0xf2, 0xa8, 0xdb, 0xd9, 0x66, 0xdb, 0x4c, 0xbf, 0x18, 0x96, 0x93, 0xd9, 0xe9, 0x06, 0xa8, 0x56,
|
||||
0xeb, 0x21, 0xcf, 0xe3, 0xe1, 0x1e, 0x85, 0x8c, 0xb3, 0x34, 0x8f, 0x4e, 0x93, 0xd9, 0xe8, 0x2f,
|
||||
0xa0, 0xc5, 0xf8, 0x46, 0xbd, 0x54, 0x4a, 0xc4, 0x51, 0xa1, 0x50, 0xd2, 0x1e, 0xb8, 0x39, 0xa2,
|
||||
0x58, 0x16, 0x22, 0x91, 0x1e, 0x09, 0xec, 0x81, 0xcb, 0x9c, 0x12, 0x58, 0x88, 0x44, 0xd2, 0xa7,
|
||||
0x00, 0xb1, 0x5c, 0x26, 0xc8, 0x45, 0x8a, 0xc2, 0xb3, 0x02, 0x32, 0x70, 0x98, 0x1b, 0xcb, 0xb7,
|
||||
0x06, 0x78, 0x71, 0xfb, 0xe5, 0x87, 0x67, 0x8f, 0xc2, 0x71, 0xff, 0x0d, 0x40, 0x83, 0x92, 0xc2,
|
||||
0x75, 0xca, 0x77, 0xe8, 0x91, 0x80, 0x0c, 0x5c, 0xa6, 0x67, 0xfa, 0x0c, 0xee, 0x56, 0x49, 0x8c,
|
||||
0xa9, 0x32, 0x42, 0x96, 0x16, 0x02, 0x03, 0x95, 0x52, 0x35, 0xd7, 0x77, 0x02, 0x37, 0x73, 0x9d,
|
||||
0x95, 0xb6, 0xc0, 0x9a, 0x4d, 0x34, 0xcd, 0x35, 0xb3, 0x66, 0x13, 0x3a, 0x85, 0x87, 0x82, 0x6f,
|
||||
0xd4, 0x92, 0x9f, 0xb5, 0xb4, 0xa7, 0xbb, 0xe7, 0x4f, 0xc2, 0x66, 0x3b, 0xe1, 0x65, 0x44, 0xd6,
|
||||
0x12, 0x97, 0x91, 0xa7, 0xf0, 0xc8, 0xac, 0x37, 0x89, 0x6c, 0x4d, 0xe4, 0x5d, 0x12, 0x35, 0x48,
|
||||
0xaa, 0x2f, 0x52, 0x23, 0xb5, 0xe3, 0x31, 0x78, 0xaf, 0x93, 0x42, 0x2a, 0x14, 0x1f, 0x4c, 0xd9,
|
||||
0xef, 0x51, 0x31, 0xfc, 0x54, 0xa0, 0x54, 0xb4, 0x0d, 0xf6, 0x1e, 0x45, 0x55, 0x45, 0x39, 0xd6,
|
||||
0x67, 0x5f, 0x09, 0xf4, 0xaa, 0xbb, 0xf9, 0x99, 0xbb, 0x71, 0xda, 0x03, 0xb7, 0xb2, 0x79, 0x2e,
|
||||
0xc1, 0x31, 0x80, 0xae, 0xe2, 0x3f, 0x19, 0xac, 0xfb, 0x67, 0x78, 0x07, 0x8f, 0x27, 0xd9, 0xe7,
|
||||
0x74, 0x2b, 0xf8, 0x1a, 0x67, 0xe9, 0x26, 0x6b, 0xf8, 0xf0, 0xe0, 0x16, 0x53, 0x1e, 0x25, 0xb8,
|
||||
0xd6, 0x2e, 0x1c, 0x76, 0x7a, 0x3c, 0x85, 0xb3, 0xfe, 0x0d, 0xf7, 0xaa, 0x73, 0xf8, 0xed, 0x5f,
|
||||
0x1d, 0x8e, 0x3e, 0xf9, 0x79, 0xf4, 0xc9, 0xaf, 0xa3, 0x4f, 0xbe, 0xfd, 0xf1, 0xaf, 0xa2, 0x1b,
|
||||
0xfd, 0x17, 0x8e, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xa3, 0xbd, 0xee, 0xdf, 0x02, 0x00,
|
||||
0x00,
|
||||
// 367 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0xc1, 0x4e, 0xf2, 0x40,
|
||||
0x14, 0x85, 0x99, 0x42, 0xf8, 0xdb, 0xcb, 0x1f, 0xc4, 0x09, 0x89, 0x8d, 0x68, 0x25, 0x5d, 0xb1,
|
||||
0x30, 0x98, 0xe8, 0x13, 0xa0, 0xb0, 0x20, 0x81, 0xcd, 0x18, 0xdd, 0x92, 0x56, 0x2e, 0xd8, 0xa4,
|
||||
0x74, 0xea, 0xcc, 0x54, 0xd7, 0xbe, 0x85, 0x4f, 0xe0, 0xb3, 0xb0, 0xf4, 0x11, 0x14, 0x5f, 0xc4,
|
||||
0x74, 0x5a, 0x4a, 0x49, 0xdc, 0xb8, 0xbb, 0x3d, 0xbd, 0xf7, 0x9c, 0xf3, 0x35, 0x85, 0xd6, 0x0a,
|
||||
0x57, 0x3e, 0x0a, 0xf9, 0x18, 0xc4, 0xfd, 0x58, 0x70, 0xc5, 0xe9, 0xff, 0x9d, 0x12, 0xfb, 0xc7,
|
||||
0xed, 0x25, 0x5f, 0x72, 0xfd, 0xe2, 0x22, 0x9d, 0xb2, 0x1d, 0x77, 0x02, 0x4d, 0xe6, 0x2d, 0xd4,
|
||||
0x40, 0x29, 0x11, 0xf8, 0x89, 0x42, 0x49, 0x3b, 0x60, 0xc5, 0x88, 0x62, 0x96, 0x88, 0x50, 0xda,
|
||||
0xa4, 0x5b, 0xed, 0x59, 0xcc, 0x4c, 0x85, 0x3b, 0x11, 0x4a, 0x7a, 0x0a, 0x10, 0xc8, 0x59, 0x88,
|
||||
0x9e, 0x88, 0x50, 0xd8, 0x46, 0x97, 0xf4, 0x4c, 0x66, 0x05, 0x72, 0x92, 0x09, 0xee, 0x00, 0xa0,
|
||||
0xe4, 0x44, 0xa1, 0x16, 0x79, 0x2b, 0xb4, 0x49, 0x97, 0xf4, 0x2c, 0xa6, 0x67, 0x7a, 0x06, 0x8d,
|
||||
0x87, 0x30, 0xc0, 0x48, 0x65, 0xfe, 0x86, 0xf6, 0x87, 0x4c, 0x4a, 0x13, 0xdc, 0x77, 0x02, 0xf5,
|
||||
0xa9, 0xee, 0x4d, 0x9b, 0x60, 0x8c, 0x87, 0xfa, 0xba, 0xc6, 0x8c, 0xf1, 0x90, 0x8e, 0xe0, 0x40,
|
||||
0x78, 0x0b, 0x35, 0xf3, 0x8a, 0x08, 0xdd, 0xa0, 0x71, 0x79, 0xd2, 0x2f, 0x93, 0xf6, 0xf7, 0x81,
|
||||
0x58, 0x53, 0xec, 0x03, 0x8e, 0xe0, 0x30, 0x5b, 0x2f, 0x1b, 0x55, 0xb5, 0x91, 0xbd, 0x6f, 0x54,
|
||||
0x32, 0xc9, 0xbf, 0xee, 0x4e, 0x71, 0xcf, 0xc1, 0xbe, 0x09, 0x13, 0xa9, 0x50, 0xdc, 0xa3, 0x90,
|
||||
0x01, 0x8f, 0x6e, 0x51, 0x31, 0x7c, 0x4a, 0x50, 0x2a, 0xda, 0x82, 0xea, 0x33, 0x8a, 0x1c, 0x3c,
|
||||
0x1d, 0xdd, 0x57, 0x02, 0x9d, 0x7c, 0x7d, 0x5a, 0x38, 0x95, 0x2e, 0x3a, 0x60, 0xe5, 0xa5, 0x0a,
|
||||
0x64, 0x33, 0x13, 0x34, 0xf8, 0x2f, 0x8d, 0x8d, 0x3f, 0x37, 0x1e, 0xc1, 0xd1, 0x90, 0xbf, 0x44,
|
||||
0x4b, 0xe1, 0xcd, 0x71, 0x1c, 0x2d, 0x78, 0x29, 0xde, 0x86, 0x7f, 0x18, 0x79, 0x7e, 0x88, 0x73,
|
||||
0x1d, 0x6e, 0xb2, 0xed, 0xe3, 0x16, 0xc5, 0x28, 0x50, 0xae, 0xdb, 0xeb, 0x2f, 0xa7, 0xb2, 0xde,
|
||||
0x38, 0xe4, 0x63, 0xe3, 0x90, 0xcf, 0x8d, 0x43, 0xde, 0xbe, 0x9d, 0x8a, 0x5f, 0xd7, 0xff, 0xd3,
|
||||
0xd5, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x93, 0x7d, 0x0b, 0x87, 0x02, 0x00, 0x00,
|
||||
}
|
||||
|
||||
func (m *RaftAttributes) Marshal() (dAtA []byte, err error) {
|
||||
|
|
|
@ -2,7 +2,6 @@ syntax = "proto3";
|
|||
package membershippb;
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "etcd/api/versionpb/version.proto";
|
||||
|
||||
option (gogoproto.marshaler_all) = true;
|
||||
option (gogoproto.sizer_all) = true;
|
||||
|
@ -11,8 +10,6 @@ option (gogoproto.goproto_getters_all) = false;
|
|||
|
||||
// RaftAttributes represents the raft related attributes of an etcd member.
|
||||
message RaftAttributes {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
// peerURLs is the list of peers in the raft cluster.
|
||||
repeated string peer_urls = 1;
|
||||
// isLearner indicates if the member is raft learner.
|
||||
|
@ -21,36 +18,26 @@ message RaftAttributes {
|
|||
|
||||
// Attributes represents all the non-raft related attributes of an etcd member.
|
||||
message Attributes {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
string name = 1;
|
||||
repeated string client_urls = 2;
|
||||
}
|
||||
|
||||
message Member {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
uint64 ID = 1;
|
||||
RaftAttributes raft_attributes = 2;
|
||||
Attributes member_attributes = 3;
|
||||
}
|
||||
|
||||
message ClusterVersionSetRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
string ver = 1;
|
||||
}
|
||||
|
||||
message ClusterMemberAttrSetRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
uint64 member_ID = 1;
|
||||
Attributes member_attributes = 2;
|
||||
}
|
||||
|
||||
message DowngradeInfoSetRequest {
|
||||
option (versionpb.etcd_version_msg) = "3.5";
|
||||
|
||||
bool enabled = 1;
|
||||
string ver = 2;
|
||||
}
|
|
@ -21,76 +21,74 @@ import (
|
|||
|
||||
// server-side error
|
||||
var (
|
||||
ErrGRPCEmptyKey = status.Error(codes.InvalidArgument, "etcdserver: key is not provided")
|
||||
ErrGRPCKeyNotFound = status.Error(codes.InvalidArgument, "etcdserver: key not found")
|
||||
ErrGRPCValueProvided = status.Error(codes.InvalidArgument, "etcdserver: value is provided")
|
||||
ErrGRPCLeaseProvided = status.Error(codes.InvalidArgument, "etcdserver: lease is provided")
|
||||
ErrGRPCTooManyOps = status.Error(codes.InvalidArgument, "etcdserver: too many operations in txn request")
|
||||
ErrGRPCDuplicateKey = status.Error(codes.InvalidArgument, "etcdserver: duplicate key given in txn request")
|
||||
ErrGRPCInvalidClientAPIVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid client api version")
|
||||
ErrGRPCInvalidSortOption = status.Error(codes.InvalidArgument, "etcdserver: invalid sort option")
|
||||
ErrGRPCCompacted = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted")
|
||||
ErrGRPCFutureRev = status.Error(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision")
|
||||
ErrGRPCNoSpace = status.Error(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded")
|
||||
ErrGRPCEmptyKey = status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err()
|
||||
ErrGRPCKeyNotFound = status.New(codes.InvalidArgument, "etcdserver: key not found").Err()
|
||||
ErrGRPCValueProvided = status.New(codes.InvalidArgument, "etcdserver: value is provided").Err()
|
||||
ErrGRPCLeaseProvided = status.New(codes.InvalidArgument, "etcdserver: lease is provided").Err()
|
||||
ErrGRPCTooManyOps = status.New(codes.InvalidArgument, "etcdserver: too many operations in txn request").Err()
|
||||
ErrGRPCDuplicateKey = status.New(codes.InvalidArgument, "etcdserver: duplicate key given in txn request").Err()
|
||||
ErrGRPCCompacted = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision has been compacted").Err()
|
||||
ErrGRPCFutureRev = status.New(codes.OutOfRange, "etcdserver: mvcc: required revision is a future revision").Err()
|
||||
ErrGRPCNoSpace = status.New(codes.ResourceExhausted, "etcdserver: mvcc: database space exceeded").Err()
|
||||
|
||||
ErrGRPCLeaseNotFound = status.Error(codes.NotFound, "etcdserver: requested lease not found")
|
||||
ErrGRPCLeaseExist = status.Error(codes.FailedPrecondition, "etcdserver: lease already exists")
|
||||
ErrGRPCLeaseTTLTooLarge = status.Error(codes.OutOfRange, "etcdserver: too large lease TTL")
|
||||
ErrGRPCLeaseNotFound = status.New(codes.NotFound, "etcdserver: requested lease not found").Err()
|
||||
ErrGRPCLeaseExist = status.New(codes.FailedPrecondition, "etcdserver: lease already exists").Err()
|
||||
ErrGRPCLeaseTTLTooLarge = status.New(codes.OutOfRange, "etcdserver: too large lease TTL").Err()
|
||||
|
||||
ErrGRPCWatchCanceled = status.Error(codes.Canceled, "etcdserver: watch canceled")
|
||||
ErrGRPCWatchCanceled = status.New(codes.Canceled, "etcdserver: watch canceled").Err()
|
||||
|
||||
ErrGRPCMemberExist = status.Error(codes.FailedPrecondition, "etcdserver: member ID already exist")
|
||||
ErrGRPCPeerURLExist = status.Error(codes.FailedPrecondition, "etcdserver: Peer URLs already exists")
|
||||
ErrGRPCMemberNotEnoughStarted = status.Error(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members")
|
||||
ErrGRPCMemberBadURLs = status.Error(codes.InvalidArgument, "etcdserver: given member URLs are invalid")
|
||||
ErrGRPCMemberNotFound = status.Error(codes.NotFound, "etcdserver: member not found")
|
||||
ErrGRPCMemberNotLearner = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member")
|
||||
ErrGRPCLearnerNotReady = status.Error(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader")
|
||||
ErrGRPCTooManyLearners = status.Error(codes.FailedPrecondition, "etcdserver: too many learner members in cluster")
|
||||
ErrGRPCMemberExist = status.New(codes.FailedPrecondition, "etcdserver: member ID already exist").Err()
|
||||
ErrGRPCPeerURLExist = status.New(codes.FailedPrecondition, "etcdserver: Peer URLs already exists").Err()
|
||||
ErrGRPCMemberNotEnoughStarted = status.New(codes.FailedPrecondition, "etcdserver: re-configuration failed due to not enough started members").Err()
|
||||
ErrGRPCMemberBadURLs = status.New(codes.InvalidArgument, "etcdserver: given member URLs are invalid").Err()
|
||||
ErrGRPCMemberNotFound = status.New(codes.NotFound, "etcdserver: member not found").Err()
|
||||
ErrGRPCMemberNotLearner = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member").Err()
|
||||
ErrGRPCLearnerNotReady = status.New(codes.FailedPrecondition, "etcdserver: can only promote a learner member which is in sync with leader").Err()
|
||||
ErrGRPCTooManyLearners = status.New(codes.FailedPrecondition, "etcdserver: too many learner members in cluster").Err()
|
||||
|
||||
ErrGRPCRequestTooLarge = status.Error(codes.InvalidArgument, "etcdserver: request is too large")
|
||||
ErrGRPCRequestTooManyRequests = status.Error(codes.ResourceExhausted, "etcdserver: too many requests")
|
||||
ErrGRPCRequestTooLarge = status.New(codes.InvalidArgument, "etcdserver: request is too large").Err()
|
||||
ErrGRPCRequestTooManyRequests = status.New(codes.ResourceExhausted, "etcdserver: too many requests").Err()
|
||||
|
||||
ErrGRPCRootUserNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not exist")
|
||||
ErrGRPCRootRoleNotExist = status.Error(codes.FailedPrecondition, "etcdserver: root user does not have root role")
|
||||
ErrGRPCUserAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: user name already exists")
|
||||
ErrGRPCUserEmpty = status.Error(codes.InvalidArgument, "etcdserver: user name is empty")
|
||||
ErrGRPCUserNotFound = status.Error(codes.FailedPrecondition, "etcdserver: user name not found")
|
||||
ErrGRPCRoleAlreadyExist = status.Error(codes.FailedPrecondition, "etcdserver: role name already exists")
|
||||
ErrGRPCRoleNotFound = status.Error(codes.FailedPrecondition, "etcdserver: role name not found")
|
||||
ErrGRPCRoleEmpty = status.Error(codes.InvalidArgument, "etcdserver: role name is empty")
|
||||
ErrGRPCAuthFailed = status.Error(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password")
|
||||
ErrGRPCPermissionNotGiven = status.Error(codes.InvalidArgument, "etcdserver: permission not given")
|
||||
ErrGRPCPermissionDenied = status.Error(codes.PermissionDenied, "etcdserver: permission denied")
|
||||
ErrGRPCRoleNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: role is not granted to the user")
|
||||
ErrGRPCPermissionNotGranted = status.Error(codes.FailedPrecondition, "etcdserver: permission is not granted to the role")
|
||||
ErrGRPCAuthNotEnabled = status.Error(codes.FailedPrecondition, "etcdserver: authentication is not enabled")
|
||||
ErrGRPCInvalidAuthToken = status.Error(codes.Unauthenticated, "etcdserver: invalid auth token")
|
||||
ErrGRPCInvalidAuthMgmt = status.Error(codes.InvalidArgument, "etcdserver: invalid auth management")
|
||||
ErrGRPCAuthOldRevision = status.Error(codes.InvalidArgument, "etcdserver: revision of auth store is old")
|
||||
ErrGRPCRootUserNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not exist").Err()
|
||||
ErrGRPCRootRoleNotExist = status.New(codes.FailedPrecondition, "etcdserver: root user does not have root role").Err()
|
||||
ErrGRPCUserAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: user name already exists").Err()
|
||||
ErrGRPCUserEmpty = status.New(codes.InvalidArgument, "etcdserver: user name is empty").Err()
|
||||
ErrGRPCUserNotFound = status.New(codes.FailedPrecondition, "etcdserver: user name not found").Err()
|
||||
ErrGRPCRoleAlreadyExist = status.New(codes.FailedPrecondition, "etcdserver: role name already exists").Err()
|
||||
ErrGRPCRoleNotFound = status.New(codes.FailedPrecondition, "etcdserver: role name not found").Err()
|
||||
ErrGRPCRoleEmpty = status.New(codes.InvalidArgument, "etcdserver: role name is empty").Err()
|
||||
ErrGRPCAuthFailed = status.New(codes.InvalidArgument, "etcdserver: authentication failed, invalid user ID or password").Err()
|
||||
ErrGRPCPermissionNotGiven = status.New(codes.InvalidArgument, "etcdserver: permission not given").Err()
|
||||
ErrGRPCPermissionDenied = status.New(codes.PermissionDenied, "etcdserver: permission denied").Err()
|
||||
ErrGRPCRoleNotGranted = status.New(codes.FailedPrecondition, "etcdserver: role is not granted to the user").Err()
|
||||
ErrGRPCPermissionNotGranted = status.New(codes.FailedPrecondition, "etcdserver: permission is not granted to the role").Err()
|
||||
ErrGRPCAuthNotEnabled = status.New(codes.FailedPrecondition, "etcdserver: authentication is not enabled").Err()
|
||||
ErrGRPCInvalidAuthToken = status.New(codes.Unauthenticated, "etcdserver: invalid auth token").Err()
|
||||
ErrGRPCInvalidAuthMgmt = status.New(codes.InvalidArgument, "etcdserver: invalid auth management").Err()
|
||||
ErrGRPCAuthOldRevision = status.New(codes.InvalidArgument, "etcdserver: revision of auth store is old").Err()
|
||||
|
||||
ErrGRPCNoLeader = status.Error(codes.Unavailable, "etcdserver: no leader")
|
||||
ErrGRPCNotLeader = status.Error(codes.FailedPrecondition, "etcdserver: not leader")
|
||||
ErrGRPCLeaderChanged = status.Error(codes.Unavailable, "etcdserver: leader changed")
|
||||
ErrGRPCNotCapable = status.Error(codes.FailedPrecondition, "etcdserver: not capable")
|
||||
ErrGRPCStopped = status.Error(codes.Unavailable, "etcdserver: server stopped")
|
||||
ErrGRPCTimeout = status.Error(codes.Unavailable, "etcdserver: request timed out")
|
||||
ErrGRPCTimeoutDueToLeaderFail = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure")
|
||||
ErrGRPCTimeoutDueToConnectionLost = status.Error(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost")
|
||||
ErrGRPCTimeoutWaitAppliedIndex = status.Error(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long")
|
||||
ErrGRPCUnhealthy = status.Error(codes.Unavailable, "etcdserver: unhealthy cluster")
|
||||
ErrGRPCCorrupt = status.Error(codes.DataLoss, "etcdserver: corrupt cluster")
|
||||
ErrGRPCNotSupportedForLearner = status.Error(codes.FailedPrecondition, "etcdserver: rpc not supported for learner")
|
||||
ErrGRPCBadLeaderTransferee = status.Error(codes.FailedPrecondition, "etcdserver: bad leader transferee")
|
||||
ErrGRPCNoLeader = status.New(codes.Unavailable, "etcdserver: no leader").Err()
|
||||
ErrGRPCNotLeader = status.New(codes.FailedPrecondition, "etcdserver: not leader").Err()
|
||||
ErrGRPCLeaderChanged = status.New(codes.Unavailable, "etcdserver: leader changed").Err()
|
||||
ErrGRPCNotCapable = status.New(codes.Unavailable, "etcdserver: not capable").Err()
|
||||
ErrGRPCStopped = status.New(codes.Unavailable, "etcdserver: server stopped").Err()
|
||||
ErrGRPCTimeout = status.New(codes.Unavailable, "etcdserver: request timed out").Err()
|
||||
ErrGRPCTimeoutDueToLeaderFail = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to previous leader failure").Err()
|
||||
ErrGRPCTimeoutDueToConnectionLost = status.New(codes.Unavailable, "etcdserver: request timed out, possibly due to connection lost").Err()
|
||||
ErrGRPCTimeoutWaitAppliedIndex = status.New(codes.Unavailable, "etcdserver: request timed out, waiting for the applied index took too long").Err()
|
||||
ErrGRPCUnhealthy = status.New(codes.Unavailable, "etcdserver: unhealthy cluster").Err()
|
||||
ErrGRPCCorrupt = status.New(codes.DataLoss, "etcdserver: corrupt cluster").Err()
|
||||
ErrGPRCNotSupportedForLearner = status.New(codes.Unavailable, "etcdserver: rpc not supported for learner").Err()
|
||||
ErrGRPCBadLeaderTransferee = status.New(codes.FailedPrecondition, "etcdserver: bad leader transferee").Err()
|
||||
|
||||
ErrGRPCWrongDowngradeVersionFormat = status.Error(codes.InvalidArgument, "etcdserver: wrong downgrade target version format")
|
||||
ErrGRPCInvalidDowngradeTargetVersion = status.Error(codes.InvalidArgument, "etcdserver: invalid downgrade target version")
|
||||
ErrGRPCClusterVersionUnavailable = status.Error(codes.FailedPrecondition, "etcdserver: cluster version not found during downgrade")
|
||||
ErrGRPCDowngradeInProcess = status.Error(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress")
|
||||
ErrGRPCNoInflightDowngrade = status.Error(codes.FailedPrecondition, "etcdserver: no inflight downgrade job")
|
||||
ErrGRPCClusterVersionUnavailable = status.New(codes.Unavailable, "etcdserver: cluster version not found during downgrade").Err()
|
||||
ErrGRPCWrongDowngradeVersionFormat = status.New(codes.InvalidArgument, "etcdserver: wrong downgrade target version format").Err()
|
||||
ErrGRPCInvalidDowngradeTargetVersion = status.New(codes.InvalidArgument, "etcdserver: invalid downgrade target version").Err()
|
||||
ErrGRPCDowngradeInProcess = status.New(codes.FailedPrecondition, "etcdserver: cluster has a downgrade job in progress").Err()
|
||||
ErrGRPCNoInflightDowngrade = status.New(codes.FailedPrecondition, "etcdserver: no inflight downgrade job").Err()
|
||||
|
||||
ErrGRPCCanceled = status.Error(codes.Canceled, "etcdserver: request canceled")
|
||||
ErrGRPCDeadlineExceeded = status.Error(codes.DeadlineExceeded, "etcdserver: context deadline exceeded")
|
||||
ErrGRPCCanceled = status.New(codes.Canceled, "etcdserver: request canceled").Err()
|
||||
ErrGRPCDeadlineExceeded = status.New(codes.DeadlineExceeded, "etcdserver: context deadline exceeded").Err()
|
||||
|
||||
errStringToError = map[string]error{
|
||||
ErrorDesc(ErrGRPCEmptyKey): ErrGRPCEmptyKey,
|
||||
|
@ -100,7 +98,6 @@ var (
|
|||
|
||||
ErrorDesc(ErrGRPCTooManyOps): ErrGRPCTooManyOps,
|
||||
ErrorDesc(ErrGRPCDuplicateKey): ErrGRPCDuplicateKey,
|
||||
ErrorDesc(ErrGRPCInvalidSortOption): ErrGRPCInvalidSortOption,
|
||||
ErrorDesc(ErrGRPCCompacted): ErrGRPCCompacted,
|
||||
ErrorDesc(ErrGRPCFutureRev): ErrGRPCFutureRev,
|
||||
ErrorDesc(ErrGRPCNoSpace): ErrGRPCNoSpace,
|
||||
|
@ -148,7 +145,7 @@ var (
|
|||
ErrorDesc(ErrGRPCTimeoutDueToConnectionLost): ErrGRPCTimeoutDueToConnectionLost,
|
||||
ErrorDesc(ErrGRPCUnhealthy): ErrGRPCUnhealthy,
|
||||
ErrorDesc(ErrGRPCCorrupt): ErrGRPCCorrupt,
|
||||
ErrorDesc(ErrGRPCNotSupportedForLearner): ErrGRPCNotSupportedForLearner,
|
||||
ErrorDesc(ErrGPRCNotSupportedForLearner): ErrGPRCNotSupportedForLearner,
|
||||
ErrorDesc(ErrGRPCBadLeaderTransferee): ErrGRPCBadLeaderTransferee,
|
||||
|
||||
ErrorDesc(ErrGRPCClusterVersionUnavailable): ErrGRPCClusterVersionUnavailable,
|
||||
|
@ -167,7 +164,6 @@ var (
|
|||
ErrLeaseProvided = Error(ErrGRPCLeaseProvided)
|
||||
ErrTooManyOps = Error(ErrGRPCTooManyOps)
|
||||
ErrDuplicateKey = Error(ErrGRPCDuplicateKey)
|
||||
ErrInvalidSortOption = Error(ErrGRPCInvalidSortOption)
|
||||
ErrCompacted = Error(ErrGRPCCompacted)
|
||||
ErrFutureRev = Error(ErrGRPCFutureRev)
|
||||
ErrNoSpace = Error(ErrGRPCNoSpace)
|
||||
|
|
|
@ -22,7 +22,7 @@ import (
|
|||
)
|
||||
|
||||
func TestConvert(t *testing.T) {
|
||||
e1 := status.Error(codes.InvalidArgument, "etcdserver: key is not provided")
|
||||
e1 := status.New(codes.InvalidArgument, "etcdserver: key is not provided").Err()
|
||||
e2 := ErrGRPCEmptyKey
|
||||
e3 := ErrEmptyKey
|
||||
|
||||
|
|
|
@ -26,26 +26,13 @@ import (
|
|||
var (
|
||||
// MinClusterVersion is the min cluster version this etcd binary is compatible with.
|
||||
MinClusterVersion = "3.0.0"
|
||||
Version = "3.6.0-alpha.0"
|
||||
Version = "3.5.9"
|
||||
APIVersion = "unknown"
|
||||
|
||||
// Git SHA Value will be set during build
|
||||
GitSHA = "Not provided (use ./build instead of go build)"
|
||||
)
|
||||
|
||||
// Get all constant versions defined in a centralized place.
|
||||
var (
|
||||
V3_0 = semver.Version{Major: 3, Minor: 0}
|
||||
V3_1 = semver.Version{Major: 3, Minor: 1}
|
||||
V3_2 = semver.Version{Major: 3, Minor: 2}
|
||||
V3_3 = semver.Version{Major: 3, Minor: 3}
|
||||
V3_4 = semver.Version{Major: 3, Minor: 4}
|
||||
V3_5 = semver.Version{Major: 3, Minor: 5}
|
||||
V3_6 = semver.Version{Major: 3, Minor: 6}
|
||||
V3_7 = semver.Version{Major: 3, Minor: 7}
|
||||
V4_0 = semver.Version{Major: 4, Minor: 0}
|
||||
)
|
||||
|
||||
func init() {
|
||||
ver, err := semver.NewVersion(Version)
|
||||
if err == nil {
|
||||
|
@ -56,7 +43,6 @@ func init() {
|
|||
type Versions struct {
|
||||
Server string `json:"etcdserver"`
|
||||
Cluster string `json:"etcdcluster"`
|
||||
Storage string `json:"storage"`
|
||||
// TODO: raft state machine version
|
||||
}
|
||||
|
||||
|
@ -68,15 +54,3 @@ func Cluster(v string) string {
|
|||
}
|
||||
return fmt.Sprintf("%s.%s", vs[0], vs[1])
|
||||
}
|
||||
|
||||
func Compare(ver1, ver2 semver.Version) int {
|
||||
return ver1.Compare(ver2)
|
||||
}
|
||||
|
||||
func LessThan(ver1, ver2 semver.Version) bool {
|
||||
return ver1.LessThan(ver2)
|
||||
}
|
||||
|
||||
func Equal(ver1, ver2 semver.Version) bool {
|
||||
return ver1.Equal(ver2)
|
||||
}
|
||||
|
|
|
@ -1,85 +0,0 @@
|
|||
// Copyright 2022 The etcd Authors
|
||||
//
|
||||
// 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.
|
||||
|
||||
package version
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/coreos/go-semver/semver"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestVersionCompare(t *testing.T) {
|
||||
cases := []struct {
|
||||
name string
|
||||
ver1 semver.Version
|
||||
ver2 semver.Version
|
||||
expectedCompareResult int
|
||||
expectedLessThanResult bool
|
||||
expectedEqualResult bool
|
||||
}{
|
||||
{
|
||||
name: "ver1 should be great than ver2",
|
||||
ver1: V3_5,
|
||||
ver2: V3_4,
|
||||
expectedCompareResult: 1,
|
||||
expectedLessThanResult: false,
|
||||
expectedEqualResult: false,
|
||||
},
|
||||
{
|
||||
name: "ver1(4.0) should be great than ver2",
|
||||
ver1: V4_0,
|
||||
ver2: V3_7,
|
||||
expectedCompareResult: 1,
|
||||
expectedLessThanResult: false,
|
||||
expectedEqualResult: false,
|
||||
},
|
||||
{
|
||||
name: "ver1 should be less than ver2",
|
||||
ver1: V3_5,
|
||||
ver2: V3_6,
|
||||
expectedCompareResult: -1,
|
||||
expectedLessThanResult: true,
|
||||
expectedEqualResult: false,
|
||||
},
|
||||
{
|
||||
name: "ver1 should be less than ver2 (4.0)",
|
||||
ver1: V3_5,
|
||||
ver2: V4_0,
|
||||
expectedCompareResult: -1,
|
||||
expectedLessThanResult: true,
|
||||
expectedEqualResult: false,
|
||||
},
|
||||
{
|
||||
name: "ver1 should be equal to ver2",
|
||||
ver1: V3_5,
|
||||
ver2: V3_5,
|
||||
expectedCompareResult: 0,
|
||||
expectedLessThanResult: false,
|
||||
expectedEqualResult: true,
|
||||
},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
compareResult := Compare(tc.ver1, tc.ver2)
|
||||
lessThanResult := LessThan(tc.ver1, tc.ver2)
|
||||
equalResult := Equal(tc.ver1, tc.ver2)
|
||||
|
||||
assert.Equal(t, tc.expectedCompareResult, compareResult)
|
||||
assert.Equal(t, tc.expectedLessThanResult, lessThanResult)
|
||||
assert.Equal(t, tc.expectedEqualResult, equalResult)
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||
// source: version.proto
|
||||
|
||||
package versionpb
|
||||
|
||||
import (
|
||||
fmt "fmt"
|
||||
math "math"
|
||||
|
||||
_ "github.com/gogo/protobuf/gogoproto"
|
||||
protobuf "github.com/gogo/protobuf/protoc-gen-gogo/descriptor"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
)
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
var _ = proto.Marshal
|
||||
var _ = fmt.Errorf
|
||||
var _ = math.Inf
|
||||
|
||||
// This is a compile-time assertion to ensure that this generated file
|
||||
// is compatible with the proto package it is being compiled against.
|
||||
// A compilation error at this line likely means your copy of the
|
||||
// proto package needs to be updated.
|
||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
|
||||
|
||||
var E_EtcdVersionMsg = &proto.ExtensionDesc{
|
||||
ExtendedType: (*protobuf.MessageOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50000,
|
||||
Name: "versionpb.etcd_version_msg",
|
||||
Tag: "bytes,50000,opt,name=etcd_version_msg",
|
||||
Filename: "version.proto",
|
||||
}
|
||||
|
||||
var E_EtcdVersionField = &proto.ExtensionDesc{
|
||||
ExtendedType: (*protobuf.FieldOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50001,
|
||||
Name: "versionpb.etcd_version_field",
|
||||
Tag: "bytes,50001,opt,name=etcd_version_field",
|
||||
Filename: "version.proto",
|
||||
}
|
||||
|
||||
var E_EtcdVersionEnum = &proto.ExtensionDesc{
|
||||
ExtendedType: (*protobuf.EnumOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50002,
|
||||
Name: "versionpb.etcd_version_enum",
|
||||
Tag: "bytes,50002,opt,name=etcd_version_enum",
|
||||
Filename: "version.proto",
|
||||
}
|
||||
|
||||
var E_EtcdVersionEnumValue = &proto.ExtensionDesc{
|
||||
ExtendedType: (*protobuf.EnumValueOptions)(nil),
|
||||
ExtensionType: (*string)(nil),
|
||||
Field: 50003,
|
||||
Name: "versionpb.etcd_version_enum_value",
|
||||
Tag: "bytes,50003,opt,name=etcd_version_enum_value",
|
||||
Filename: "version.proto",
|
||||
}
|
||||
|
||||
func init() {
|
||||
proto.RegisterExtension(E_EtcdVersionMsg)
|
||||
proto.RegisterExtension(E_EtcdVersionField)
|
||||
proto.RegisterExtension(E_EtcdVersionEnum)
|
||||
proto.RegisterExtension(E_EtcdVersionEnumValue)
|
||||
}
|
||||
|
||||
func init() { proto.RegisterFile("version.proto", fileDescriptor_7d2c07d79758f814) }
|
||||
|
||||
var fileDescriptor_7d2c07d79758f814 = []byte{
|
||||
// 261 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x2d, 0x4b, 0x2d, 0x2a,
|
||||
0xce, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x84, 0x72, 0x0b, 0x92, 0xa4,
|
||||
0x44, 0xd2, 0xf3, 0xd3, 0xf3, 0xc1, 0xa2, 0xfa, 0x20, 0x16, 0x44, 0x81, 0x94, 0x42, 0x7a, 0x7e,
|
||||
0x7e, 0x7a, 0x4e, 0xaa, 0x3e, 0x98, 0x97, 0x54, 0x9a, 0xa6, 0x9f, 0x92, 0x5a, 0x9c, 0x5c, 0x94,
|
||||
0x59, 0x50, 0x92, 0x5f, 0x04, 0x51, 0x61, 0xe5, 0xc7, 0x25, 0x90, 0x5a, 0x92, 0x9c, 0x12, 0x0f,
|
||||
0x35, 0x29, 0x3e, 0xb7, 0x38, 0x5d, 0x48, 0x5e, 0x0f, 0xa2, 0x4d, 0x0f, 0xa6, 0x4d, 0xcf, 0x37,
|
||||
0xb5, 0xb8, 0x38, 0x31, 0x3d, 0xd5, 0xbf, 0xa0, 0x24, 0x33, 0x3f, 0xaf, 0x58, 0xe2, 0x42, 0x1b,
|
||||
0xb3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x1f, 0x48, 0x6b, 0x18, 0x44, 0xa7, 0x6f, 0x71, 0x7a, 0x07,
|
||||
0x23, 0xa3, 0x55, 0x00, 0x97, 0x10, 0x8a, 0x79, 0x69, 0x99, 0xa9, 0x39, 0x29, 0x42, 0xb2, 0x18,
|
||||
0x26, 0xba, 0x81, 0xc4, 0x61, 0xe6, 0x5d, 0x84, 0x9a, 0x27, 0x80, 0x64, 0x1e, 0x58, 0x01, 0xc8,
|
||||
0x44, 0x5f, 0x2e, 0x41, 0x14, 0x13, 0x53, 0xf3, 0x4a, 0x73, 0x85, 0x64, 0x30, 0x0c, 0x74, 0xcd,
|
||||
0x2b, 0xcd, 0x85, 0x99, 0x77, 0x09, 0x6a, 0x1e, 0x3f, 0x92, 0x79, 0x20, 0x79, 0x90, 0x71, 0xb1,
|
||||
0x5c, 0xe2, 0x18, 0xc6, 0xc5, 0x97, 0x25, 0xe6, 0x94, 0xa6, 0x0a, 0x29, 0x62, 0x35, 0x34, 0x0c,
|
||||
0x24, 0x07, 0x33, 0xf9, 0x32, 0xd4, 0x64, 0x11, 0x34, 0x93, 0xc1, 0x8a, 0x3a, 0x18, 0x19, 0x9d,
|
||||
0x04, 0x4e, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, 0x39, 0xc6, 0x19, 0x8f,
|
||||
0xe5, 0x18, 0x92, 0xd8, 0xc0, 0xa6, 0x19, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x77, 0x44, 0xe2,
|
||||
0xa4, 0xbc, 0x01, 0x00, 0x00,
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
syntax = "proto3";
|
||||
package versionpb;
|
||||
|
||||
import "gogoproto/gogo.proto";
|
||||
import "google/protobuf/descriptor.proto";
|
||||
|
||||
option (gogoproto.marshaler_all) = true;
|
||||
option (gogoproto.unmarshaler_all) = true;
|
||||
|
||||
// Indicates etcd version that introduced the message, used to determine minimal etcd version required to interpret wal that includes this message.
|
||||
extend google.protobuf.MessageOptions {
|
||||
optional string etcd_version_msg = 50000;
|
||||
}
|
||||
|
||||
// Indicates etcd version that introduced the field, used to determine minimal etcd version required to interpret wal that sets this field.
|
||||
extend google.protobuf.FieldOptions {
|
||||
optional string etcd_version_field = 50001;
|
||||
}
|
||||
|
||||
// Indicates etcd version that introduced the enum, used to determine minimal etcd version required to interpret wal that uses this enum.
|
||||
extend google.protobuf.EnumOptions {
|
||||
optional string etcd_version_enum = 50002;
|
||||
}
|
||||
|
||||
// Indicates etcd version that introduced the enum value, used to determine minimal etcd version required to interpret wal that sets this enum value.
|
||||
extend google.protobuf.EnumValueOptions {
|
||||
optional string etcd_version_enum_value = 50003;
|
||||
}
|
|
@ -1,31 +1,4 @@
|
|||
[
|
||||
{
|
||||
"project": "github.com/VividCortex/ewma",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/anishathalye/porcupine",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/benbjohnson/clock",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/beorn7/perks/quantile",
|
||||
"licenses": [
|
||||
|
@ -63,11 +36,11 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/cheggaaa/pb/v3",
|
||||
"project": "github.com/cockroachdb/datadriven",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
||||
"confidence": 0.9916666666666667
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -89,6 +62,15 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/cpuguy83/go-md2man/v2/md2man",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/creack/pty",
|
||||
"licenses": [
|
||||
|
@ -117,25 +99,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/fatih/color",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/go-logr/logr",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/go-logr/stdr",
|
||||
"project": "github.com/etcd-io/gofail/runtime",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
|
@ -188,15 +152,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/google/go-cmp/cmp",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
||||
"confidence": 0.9663865546218487
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/gorilla/websocket",
|
||||
"licenses": [
|
||||
|
@ -233,15 +188,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/grpc-ecosystem/grpc-gateway/v2",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
||||
"confidence": 0.979253112033195
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/inconshreveable/mousetrap",
|
||||
"licenses": [
|
||||
|
@ -261,7 +207,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/mattn/go-colorable",
|
||||
"project": "github.com/json-iterator/go",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
|
@ -269,15 +215,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/mattn/go-isatty",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 0.9587628865979382
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/mattn/go-runewidth",
|
||||
"licenses": [
|
||||
|
@ -296,6 +233,24 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/modern-go/concurrent",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/modern-go/reflect2",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/olekukonko/tablewriter",
|
||||
"licenses": [
|
||||
|
@ -351,7 +306,16 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/rivo/uniseg",
|
||||
"project": "github.com/russross/blackfriday/v2",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "BSD 2-clause \"Simplified\" License",
|
||||
"confidence": 0.9626168224299065
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/shurcooL/sanitized_anchor_name",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
|
@ -396,7 +360,7 @@
|
|||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/stretchr/testify",
|
||||
"project": "github.com/stretchr/testify/assert",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
|
@ -413,6 +377,15 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/urfave/cli",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "MIT License",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "github.com/xiang90/probing",
|
||||
"licenses": [
|
||||
|
@ -494,6 +467,15 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.etcd.io/etcd/raft/v3",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.etcd.io/etcd/server/v3",
|
||||
"licenses": [
|
||||
|
@ -521,15 +503,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.etcd.io/raft/v3",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc",
|
||||
"licenses": [
|
||||
|
@ -548,15 +521,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.opentelemetry.io/otel/exporters/otlp/internal/retry",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.opentelemetry.io/otel/exporters/otlp/otlptrace",
|
||||
"licenses": [
|
||||
|
@ -575,15 +539,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.opentelemetry.io/otel/metric",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "go.opentelemetry.io/otel/sdk",
|
||||
"licenses": [
|
||||
|
@ -719,6 +674,15 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "gopkg.in/cheggaaa/pb.v1",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "BSD 3-clause \"New\" or \"Revised\" License",
|
||||
"confidence": 0.9916666666666667
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "gopkg.in/natefinch/lumberjack.v2",
|
||||
"licenses": [
|
||||
|
@ -750,15 +714,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "sigs.k8s.io/json",
|
||||
"licenses": [
|
||||
{
|
||||
"type": "Apache License 2.0",
|
||||
"confidence": 0.9617021276595744
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"project": "sigs.k8s.io/yaml",
|
||||
"licenses": [
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
echo -e "\\e[91mDEPRECATED!!! Use build.sh script instead.\\e[0m\\n"
|
||||
sleep 1
|
||||
|
||||
source ./build.sh
|
|
@ -0,0 +1 @@
|
|||
powershell -ExecutionPolicy Bypass -File build.ps1
|
|
@ -0,0 +1,81 @@
|
|||
$ORG_PATH="go.etcd.io"
|
||||
$REPO_PATH="$ORG_PATH/etcd"
|
||||
$PWD = $((Get-Item -Path ".\" -Verbose).FullName)
|
||||
$FSROOT = $((Get-Location).Drive.Name+":")
|
||||
$FSYS = $((Get-WMIObject win32_logicaldisk -filter "DeviceID = '$FSROOT'").filesystem)
|
||||
|
||||
if ($FSYS.StartsWith("FAT","CurrentCultureIgnoreCase")) {
|
||||
echo "Error: Cannot build etcd using the $FSYS filesystem (use NTFS instead)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Set $Env:GO_LDFLAGS="-s" for building without symbols.
|
||||
$GO_LDFLAGS="$Env:GO_LDFLAGS -X $REPO_PATH/version.GitSHA=$GIT_SHA"
|
||||
|
||||
# rebuild symlinks
|
||||
git ls-files -s cmd | select-string -pattern 120000 | ForEach {
|
||||
$l = $_.ToString()
|
||||
$lnkname = $l.Split(' ')[1]
|
||||
$target = "$(git log -p HEAD -- $lnkname | select -last 2 | select -first 1)"
|
||||
$target = $target.SubString(1,$target.Length-1).Replace("/","\")
|
||||
$lnkname = $lnkname.Replace("/","\")
|
||||
|
||||
$terms = $lnkname.Split("\")
|
||||
$dirname = $terms[0..($terms.length-2)] -join "\"
|
||||
$lnkname = "$PWD\$lnkname"
|
||||
$targetAbs = "$((Get-Item -Path "$dirname\$target").FullName)"
|
||||
$targetAbs = $targetAbs.Replace("/", "\")
|
||||
|
||||
if (test-path -pathtype container "$targetAbs") {
|
||||
if (Test-Path "$lnkname") {
|
||||
if ((Get-Item "$lnkname") -is [System.IO.DirectoryInfo]) {
|
||||
# rd so deleting junction doesn't take files with it
|
||||
cmd /c rd "$lnkname"
|
||||
}
|
||||
}
|
||||
if (Test-Path "$lnkname") {
|
||||
if (!((Get-Item "$lnkname") -is [System.IO.DirectoryInfo])) {
|
||||
cmd /c del /A /F "$lnkname"
|
||||
}
|
||||
}
|
||||
cmd /c mklink /J "$lnkname" "$targetAbs" ">NUL"
|
||||
} else {
|
||||
# Remove file with symlink data (first run)
|
||||
if (Test-Path "$lnkname") {
|
||||
cmd /c del /A /F "$lnkname"
|
||||
}
|
||||
cmd /c mklink /H "$lnkname" "$targetAbs" ">NUL"
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $env:GOPATH) {
|
||||
$orgpath="$PWD\gopath\src\" + $ORG_PATH.Replace("/", "\")
|
||||
if (Test-Path "$orgpath\etcd") {
|
||||
if ((Get-Item "$orgpath\etcd") -is [System.IO.DirectoryInfo]) {
|
||||
# rd so deleting junction doesn't take files with it
|
||||
cmd /c rd "$orgpath\etcd"
|
||||
}
|
||||
}
|
||||
if (Test-Path "$orgpath") {
|
||||
if ((Get-Item "$orgpath") -is [System.IO.DirectoryInfo]) {
|
||||
# rd so deleting junction doesn't take files with it
|
||||
cmd /c rd "$orgpath"
|
||||
}
|
||||
}
|
||||
if (Test-Path "$orgpath") {
|
||||
if (!((Get-Item "$orgpath") -is [System.IO.DirectoryInfo])) {
|
||||
# Remove file with symlink data (first run)
|
||||
cmd /c del /A /F "$orgpath"
|
||||
}
|
||||
}
|
||||
cmd /c mkdir "$orgpath"
|
||||
cmd /c mklink /J "$orgpath\etcd" "$PWD" ">NUL"
|
||||
$env:GOPATH = "$PWD\gopath"
|
||||
}
|
||||
|
||||
# Static compilation is useful when etcd is run in a container
|
||||
$env:CGO_ENABLED = 0
|
||||
$env:GO15VENDOREXPERIMENT = 1
|
||||
$GIT_SHA="$(git rev-parse --short HEAD)"
|
||||
go build -a -installsuffix cgo -ldflags $GO_LDFLAGS -o bin\etcd.exe "$REPO_PATH"
|
||||
go build -a -installsuffix cgo -ldflags $GO_LDFLAGS -o bin\etcdctl.exe "$REPO_PATH\etcdctl"
|
|
@ -0,0 +1,145 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
source ./scripts/test_lib.sh
|
||||
|
||||
GIT_SHA=$(git rev-parse --short HEAD || echo "GitNotFound")
|
||||
if [[ -n "${FAILPOINTS:-}" ]]; then
|
||||
GIT_SHA="$GIT_SHA"-FAILPOINTS
|
||||
fi
|
||||
|
||||
VERSION_SYMBOL="${ROOT_MODULE}/api/v3/version.GitSHA"
|
||||
|
||||
# use go env if noset
|
||||
GOOS=${GOOS:-$(go env GOOS)}
|
||||
GOARCH=${GOARCH:-$(go env GOARCH)}
|
||||
|
||||
# Set GO_LDFLAGS="-s" for building without symbols for debugging.
|
||||
# shellcheck disable=SC2206
|
||||
GO_LDFLAGS=(${GO_LDFLAGS:-} "-X=${VERSION_SYMBOL}=${GIT_SHA}")
|
||||
GO_BUILD_ENV=("CGO_ENABLED=0" "GO_BUILD_FLAGS=${GO_BUILD_FLAGS:-}" "GOOS=${GOOS}" "GOARCH=${GOARCH}")
|
||||
|
||||
# enable/disable failpoints
|
||||
toggle_failpoints() {
|
||||
mode="$1"
|
||||
if command -v gofail >/dev/null 2>&1; then
|
||||
run gofail "$mode" server/etcdserver/ server/mvcc/backend/ server/wal/
|
||||
elif [[ "$mode" != "disable" ]]; then
|
||||
log_error "FAILPOINTS set but gofail not found"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
toggle_failpoints_default() {
|
||||
mode="disable"
|
||||
if [[ -n "${FAILPOINTS:-}" ]]; then mode="enable"; fi
|
||||
toggle_failpoints "$mode"
|
||||
}
|
||||
|
||||
etcd_build() {
|
||||
out="bin"
|
||||
if [[ -n "${BINDIR:-}" ]]; then out="${BINDIR}"; fi
|
||||
toggle_failpoints_default
|
||||
|
||||
run rm -f "${out}/etcd"
|
||||
(
|
||||
cd ./server
|
||||
# Static compilation is useful when etcd is run in a container. $GO_BUILD_FLAGS is OK
|
||||
# shellcheck disable=SC2086
|
||||
run env "${GO_BUILD_ENV[@]}" go build ${GO_BUILD_FLAGS:-} \
|
||||
-trimpath \
|
||||
-installsuffix=cgo \
|
||||
"-ldflags=${GO_LDFLAGS[*]}" \
|
||||
-o="../${out}/etcd" . || return 2
|
||||
) || return 2
|
||||
|
||||
run rm -f "${out}/etcdutl"
|
||||
# shellcheck disable=SC2086
|
||||
(
|
||||
cd ./etcdutl
|
||||
run env GO_BUILD_FLAGS="${GO_BUILD_FLAGS:-}" "${GO_BUILD_ENV[@]}" go build ${GO_BUILD_FLAGS:-} \
|
||||
-trimpath \
|
||||
-installsuffix=cgo \
|
||||
"-ldflags=${GO_LDFLAGS[*]}" \
|
||||
-o="../${out}/etcdutl" . || return 2
|
||||
) || return 2
|
||||
|
||||
run rm -f "${out}/etcdctl"
|
||||
# shellcheck disable=SC2086
|
||||
(
|
||||
cd ./etcdctl
|
||||
run env GO_BUILD_FLAGS="${GO_BUILD_FLAGS:-}" "${GO_BUILD_ENV[@]}" go build ${GO_BUILD_FLAGS:-} \
|
||||
-trimpath \
|
||||
-installsuffix=cgo \
|
||||
"-ldflags=${GO_LDFLAGS[*]}" \
|
||||
-o="../${out}/etcdctl" . || return 2
|
||||
) || return 2
|
||||
# Verify whether symbol we overriden exists
|
||||
# For cross-compiling we cannot run: ${out}/etcd --version | grep -q "Git SHA: ${GIT_SHA}"
|
||||
|
||||
# We need symbols to do this check:
|
||||
if [[ "${GO_LDFLAGS[*]}" != *"-s"* ]]; then
|
||||
go tool nm "${out}/etcd" | grep "${VERSION_SYMBOL}" > /dev/null
|
||||
if [[ "${PIPESTATUS[*]}" != "0 0" ]]; then
|
||||
log_error "FAIL: Symbol ${VERSION_SYMBOL} not found in binary: ${out}/etcd"
|
||||
return 2
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
tools_build() {
|
||||
out="bin"
|
||||
if [[ -n "${BINDIR:-}" ]]; then out="${BINDIR}"; fi
|
||||
tools_path="tools/benchmark
|
||||
tools/etcd-dump-db
|
||||
tools/etcd-dump-logs
|
||||
tools/local-tester/bridge"
|
||||
for tool in ${tools_path}
|
||||
do
|
||||
echo "Building" "'${tool}'"...
|
||||
run rm -f "${out}/${tool}"
|
||||
# shellcheck disable=SC2086
|
||||
run env GO_BUILD_FLAGS="${GO_BUILD_FLAGS:-}" CGO_ENABLED=0 go build ${GO_BUILD_FLAGS:-} \
|
||||
-trimpath \
|
||||
-installsuffix=cgo \
|
||||
"-ldflags=${GO_LDFLAGS[*]}" \
|
||||
-o="${out}/${tool}" "./${tool}" || return 2
|
||||
done
|
||||
tests_build "${@}"
|
||||
}
|
||||
|
||||
tests_build() {
|
||||
out="bin"
|
||||
if [[ -n "${BINDIR:-}" ]]; then out="${BINDIR}"; fi
|
||||
tools_path="
|
||||
functional/cmd/etcd-agent
|
||||
functional/cmd/etcd-proxy
|
||||
functional/cmd/etcd-runner
|
||||
functional/cmd/etcd-tester"
|
||||
(
|
||||
cd tests || exit 2
|
||||
for tool in ${tools_path}; do
|
||||
echo "Building" "'${tool}'"...
|
||||
run rm -f "../${out}/${tool}"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
run env CGO_ENABLED=0 GO_BUILD_FLAGS="${GO_BUILD_FLAGS:-}" go build ${GO_BUILD_FLAGS:-} \
|
||||
-installsuffix=cgo \
|
||||
"-ldflags=${GO_LDFLAGS[*]}" \
|
||||
-o="../${out}/${tool}" "./${tool}" || return 2
|
||||
done
|
||||
) || return 2
|
||||
}
|
||||
|
||||
toggle_failpoints_default
|
||||
|
||||
# only build when called directly, not sourced
|
||||
if echo "$0" | grep -E "build(.sh)?$" >/dev/null; then
|
||||
if etcd_build; then
|
||||
log_success "SUCCESS: etcd_build (GOARCH=${GOARCH})"
|
||||
else
|
||||
log_error "FAIL: etcd_build (GOARCH=${GOARCH})"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
|
@ -1,112 +0,0 @@
|
|||
# etcd/client
|
||||
|
||||
etcd/client is the Go client library for etcd.
|
||||
|
||||
[![GoDoc](https://godoc.org/go.etcd.io/etcd/client?status.png)](https://godoc.org/go.etcd.io/etcd/client)
|
||||
|
||||
For full compatibility, it is recommended to install released versions of clients using go modules.
|
||||
|
||||
## Install
|
||||
|
||||
```bash
|
||||
go get go.etcd.io/etcd/v3/client
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"go.etcd.io/etcd/v3/client"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cfg := client.Config{
|
||||
Endpoints: []string{"http://127.0.0.1:2379"},
|
||||
Transport: client.DefaultTransport,
|
||||
// set timeout per request to fail fast when the target endpoint is unavailable
|
||||
HeaderTimeoutPerRequest: time.Second,
|
||||
}
|
||||
c, err := client.New(cfg)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
kapi := client.NewKeysAPI(c)
|
||||
// set "/foo" key with "bar" value
|
||||
log.Print("Setting '/foo' key with 'bar' value")
|
||||
resp, err := kapi.Set(context.Background(), "/foo", "bar", nil)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
} else {
|
||||
// print common key info
|
||||
log.Printf("Set is done. Metadata is %q\n", resp)
|
||||
}
|
||||
// get "/foo" key's value
|
||||
log.Print("Getting '/foo' key value")
|
||||
resp, err = kapi.Get(context.Background(), "/foo", nil)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
} else {
|
||||
// print common key info
|
||||
log.Printf("Get is done. Metadata is %q\n", resp)
|
||||
// print value
|
||||
log.Printf("%q key has %q value\n", resp.Node.Key, resp.Node.Value)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
etcd client might return three types of errors.
|
||||
|
||||
- context error
|
||||
|
||||
Each API call has its first parameter as `context`. A context can be canceled or have an attached deadline. If the context is canceled or reaches its deadline, the responding context error will be returned no matter what internal errors the API call has already encountered.
|
||||
|
||||
- cluster error
|
||||
|
||||
Each API call tries to send request to the cluster endpoints one by one until it successfully gets a response. If a requests to an endpoint fails, due to exceeding per request timeout or connection issues, the error will be added into a list of errors. If all possible endpoints fail, a cluster error that includes all encountered errors will be returned.
|
||||
|
||||
- response error
|
||||
|
||||
If the response gets from the cluster is invalid, a plain string error will be returned. For example, it might be a invalid JSON error.
|
||||
|
||||
Here is the example code to handle client errors:
|
||||
|
||||
```go
|
||||
cfg := client.Config{Endpoints: []string{"http://etcd1:2379","http://etcd2:2379","http://etcd3:2379"}}
|
||||
c, err := client.New(cfg)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
kapi := client.NewKeysAPI(c)
|
||||
resp, err := kapi.Set(ctx, "test", "bar", nil)
|
||||
if err != nil {
|
||||
if err == context.Canceled {
|
||||
// ctx is canceled by another routine
|
||||
} else if err == context.DeadlineExceeded {
|
||||
// ctx is attached with a deadline and it exceeded
|
||||
} else if cerr, ok := err.(*client.ClusterError); ok {
|
||||
// process (cerr.Errors)
|
||||
} else {
|
||||
// bad cluster endpoints, which are not etcd servers
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Caveat
|
||||
|
||||
1. etcd/client prefers to use the same endpoint as long as the endpoint continues to work well. This saves socket resources, and improves efficiency for both client and server side. This preference doesn't remove consistency from the data consumed by the client because data replicated to each etcd member has already passed through the consensus process.
|
||||
|
||||
2. etcd/client does round-robin rotation on other available endpoints if the preferred endpoint isn't functioning properly. For example, if the member that etcd/client connects to is hard killed, etcd/client will fail on the first attempt with the killed member, and succeed on the second attempt with another member. If it fails to talk to all available endpoints, it will return all errors happened.
|
||||
|
||||
3. Default etcd/client cannot handle the case that the remote server is SIGSTOPed now. TCP keepalive mechanism doesn't help in this scenario because operating system may still send TCP keep-alive packets. Over time we'd like to improve this functionality, but solving this issue isn't high priority because a real-life case in which a server is stopped, but the connection is kept alive, hasn't been brought to our attention.
|
||||
|
||||
4. etcd/client cannot detect whether a member is healthy with watches and non-quorum read requests. If the member is isolated from the cluster, etcd/client may retrieve outdated data. Instead, users can either issue quorum read requests or monitor the /health endpoint for member health information.
|
|
@ -1,236 +0,0 @@
|
|||
// Copyright 2015 The etcd Authors
|
||||
//
|
||||
// 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.
|
||||
|
||||
package client
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
type Role struct {
|
||||
Role string `json:"role"`
|
||||
Permissions Permissions `json:"permissions"`
|
||||
Grant *Permissions `json:"grant,omitempty"`
|
||||
Revoke *Permissions `json:"revoke,omitempty"`
|
||||
}
|
||||
|
||||
type Permissions struct {
|
||||
KV rwPermission `json:"kv"`
|
||||
}
|
||||
|
||||
type rwPermission struct {
|
||||
Read []string `json:"read"`
|
||||
Write []string `json:"write"`
|
||||
}
|
||||
|
||||
type PermissionType int
|
||||
|
||||
const (
|
||||
ReadPermission PermissionType = iota
|
||||
WritePermission
|
||||
ReadWritePermission
|
||||
)
|
||||
|
||||
// NewAuthRoleAPI constructs a new AuthRoleAPI that uses HTTP to
|
||||
// interact with etcd's role creation and modification features.
|
||||
func NewAuthRoleAPI(c Client) AuthRoleAPI {
|
||||
return &httpAuthRoleAPI{
|
||||
client: c,
|
||||
}
|
||||
}
|
||||
|
||||
type AuthRoleAPI interface {
|
||||
// AddRole adds a role.
|
||||
AddRole(ctx context.Context, role string) error
|
||||
|
||||
// RemoveRole removes a role.
|
||||
RemoveRole(ctx context.Context, role string) error
|
||||
|
||||
// GetRole retrieves role details.
|
||||
GetRole(ctx context.Context, role string) (*Role, error)
|
||||
|
||||
// GrantRoleKV grants a role some permission prefixes for the KV store.
|
||||
GrantRoleKV(ctx context.Context, role string, prefixes []string, permType PermissionType) (*Role, error)
|
||||
|
||||
// RevokeRoleKV revokes some permission prefixes for a role on the KV store.
|
||||
RevokeRoleKV(ctx context.Context, role string, prefixes []string, permType PermissionType) (*Role, error)
|
||||
|
||||
// ListRoles lists roles.
|
||||
ListRoles(ctx context.Context) ([]string, error)
|
||||
}
|
||||
|
||||
type httpAuthRoleAPI struct {
|
||||
client httpClient
|
||||
}
|
||||
|
||||
type authRoleAPIAction struct {
|
||||
verb string
|
||||
name string
|
||||
role *Role
|
||||
}
|
||||
|
||||
type authRoleAPIList struct{}
|
||||
|
||||
func (list *authRoleAPIList) HTTPRequest(ep url.URL) *http.Request {
|
||||
u := v2AuthURL(ep, "roles", "")
|
||||
req, _ := http.NewRequest(http.MethodGet, u.String(), nil)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
return req
|
||||
}
|
||||
|
||||
func (l *authRoleAPIAction) HTTPRequest(ep url.URL) *http.Request {
|
||||
u := v2AuthURL(ep, "roles", l.name)
|
||||
if l.role == nil {
|
||||
req, _ := http.NewRequest(l.verb, u.String(), nil)
|
||||
return req
|
||||
}
|
||||
b, err := json.Marshal(l.role)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
body := bytes.NewReader(b)
|
||||
req, _ := http.NewRequest(l.verb, u.String(), body)
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
return req
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) ListRoles(ctx context.Context) ([]string, error) {
|
||||
resp, body, err := r.client.Do(ctx, &authRoleAPIList{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = assertStatusCode(resp.StatusCode, http.StatusOK); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var roleList struct {
|
||||
Roles []Role `json:"roles"`
|
||||
}
|
||||
if err = json.Unmarshal(body, &roleList); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ret := make([]string, 0, len(roleList.Roles))
|
||||
for _, r := range roleList.Roles {
|
||||
ret = append(ret, r.Role)
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) AddRole(ctx context.Context, rolename string) error {
|
||||
role := &Role{
|
||||
Role: rolename,
|
||||
}
|
||||
return r.addRemoveRole(ctx, &authRoleAPIAction{
|
||||
verb: "PUT",
|
||||
name: rolename,
|
||||
role: role,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) RemoveRole(ctx context.Context, rolename string) error {
|
||||
return r.addRemoveRole(ctx, &authRoleAPIAction{
|
||||
verb: "DELETE",
|
||||
name: rolename,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) addRemoveRole(ctx context.Context, req *authRoleAPIAction) error {
|
||||
resp, body, err := r.client.Do(ctx, req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := assertStatusCode(resp.StatusCode, http.StatusOK, http.StatusCreated); err != nil {
|
||||
var sec authError
|
||||
err := json.Unmarshal(body, &sec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return sec
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) GetRole(ctx context.Context, rolename string) (*Role, error) {
|
||||
return r.modRole(ctx, &authRoleAPIAction{
|
||||
verb: "GET",
|
||||
name: rolename,
|
||||
})
|
||||
}
|
||||
|
||||
func buildRWPermission(prefixes []string, permType PermissionType) rwPermission {
|
||||
var out rwPermission
|
||||
switch permType {
|
||||
case ReadPermission:
|
||||
out.Read = prefixes
|
||||
case WritePermission:
|
||||
out.Write = prefixes
|
||||
case ReadWritePermission:
|
||||
out.Read = prefixes
|
||||
out.Write = prefixes
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) GrantRoleKV(ctx context.Context, rolename string, prefixes []string, permType PermissionType) (*Role, error) {
|
||||
rwp := buildRWPermission(prefixes, permType)
|
||||
role := &Role{
|
||||
Role: rolename,
|
||||
Grant: &Permissions{
|
||||
KV: rwp,
|
||||
},
|
||||
}
|
||||
return r.modRole(ctx, &authRoleAPIAction{
|
||||
verb: "PUT",
|
||||
name: rolename,
|
||||
role: role,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) RevokeRoleKV(ctx context.Context, rolename string, prefixes []string, permType PermissionType) (*Role, error) {
|
||||
rwp := buildRWPermission(prefixes, permType)
|
||||
role := &Role{
|
||||
Role: rolename,
|
||||
Revoke: &Permissions{
|
||||
KV: rwp,
|
||||
},
|
||||
}
|
||||
return r.modRole(ctx, &authRoleAPIAction{
|
||||
verb: "PUT",
|
||||
name: rolename,
|
||||
role: role,
|
||||
})
|
||||
}
|
||||
|
||||
func (r *httpAuthRoleAPI) modRole(ctx context.Context, req *authRoleAPIAction) (*Role, error) {
|
||||
resp, body, err := r.client.Do(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err = assertStatusCode(resp.StatusCode, http.StatusOK); err != nil {
|
||||
var sec authError
|
||||
err = json.Unmarshal(body, &sec)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return nil, sec
|
||||
}
|
||||
var role Role
|
||||
if err = json.Unmarshal(body, &role); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &role, nil
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue