Compare commits
266 Commits
storage-do
...
master
Author | SHA1 | Date |
---|---|---|
Benjamin Wang | 66553d4f07 | |
Thomas Jungblut | e3f2638aea | |
Benjamin Wang | de6415801e | |
Marek Siarkowicz | fd3e338d88 | |
Marek Siarkowicz | 486462a907 | |
Marek Siarkowicz | 519617cfd0 | |
Marek Siarkowicz | 1217548acf | |
dependabot[bot] | 1d472bb6e4 | |
Marek Siarkowicz | 9c659eb4e0 | |
Marek Siarkowicz | 1420292b10 | |
Marek Siarkowicz | 1663600bec | |
Marek Siarkowicz | 09b9f889e7 | |
Benjamin Wang | bb155a6629 | |
Benjamin Wang | 812fce2c7e | |
Marek Siarkowicz | b7e7811ba4 | |
Benjamin Wang | b92d099360 | |
Marek Siarkowicz | 5e7349b44c | |
Marek Siarkowicz | 43b2477c28 | |
James Blair | f140cc14b3 | |
Marek Siarkowicz | 96987d8b5e | |
Marek Siarkowicz | 6f2a5b710f | |
Marek Siarkowicz | 57258759c6 | |
Marek Siarkowicz | ea3255b477 | |
Marek Siarkowicz | 8de14bd36e | |
Marek Siarkowicz | fb16bca44a | |
James Blair | 2791422f77 | |
James Blair | 8c483f31ad | |
Marek Siarkowicz | 90cbadc660 | |
Marek Siarkowicz | 32ea42b51c | |
Marek Siarkowicz | cb3730a30f | |
Marek Siarkowicz | 34cbf4cd6f | |
Thomas Jungblut | 84a9af17cc | |
Marek Siarkowicz | 7d27e33a12 | |
Benjamin Wang | 899a51e110 | |
Marek Siarkowicz | 6979318108 | |
Marek Siarkowicz | 974655e02c | |
Marek Siarkowicz | da49157b20 | |
Marek Siarkowicz | 7bbc738ec4 | |
Marek Siarkowicz | a081d52bd4 | |
Marek Siarkowicz | a268a67e45 | |
Marek Siarkowicz | 455c0c6b81 | |
Prasad Chandrasekaran | 3a8c6d749f | |
Geeta Gharpure | 06350aba43 | |
Benjamin Wang | 7444985cab | |
Benjamin Wang | 74bb688ece | |
dependabot[bot] | cdff0b3a31 | |
dependabot[bot] | 09921806af | |
Marek Siarkowicz | a6ab774458 | |
Marek Siarkowicz | b366cda70f | |
Benjamin Wang | c104a4d01b | |
Benjamin Wang | 20c4247d2c | |
kkkkun | 03c9e71b49 | |
Marek Siarkowicz | 61736c329d | |
Marek Siarkowicz | 00b4156080 | |
Benjamin Wang | 693f25d6b9 | |
Benjamin Wang | a6f51651ca | |
Marek Siarkowicz | f410c6e6df | |
Marek Siarkowicz | 53af854871 | |
Marek Siarkowicz | f91f6d8414 | |
Marek Siarkowicz | eb56d86e40 | |
Marek Siarkowicz | b80fb0a1ce | |
shivanshu1333 | dffc35e421 | |
Chao Chen | e6c8bf82e0 | |
Marek Siarkowicz | a708bed336 | |
scuzk373x@gmai.com | 798d2b7923 | |
Benjamin Wang | 75229f7e39 | |
Benjamin Wang | 6c5fde5138 | |
caojiamingalan | b9e30bf878 | |
Benjamin Wang | caee53237e | |
Chao Chen | b2c39fc8e6 | |
Daljit Singh | dcc4c1efb0 | |
Benjamin Wang | faf5945603 | |
James Blair | 3d40ee69bb | |
Jintao Zhang | 0f32b588be | |
Thomas Jungblut | dfbe2038f3 | |
Benjamin Wang | d3e43d4de6 | |
Benjamin Wang | fe24da8c67 | |
dependabot[bot] | 64b11ef8b0 | |
dependabot[bot] | caf9a0dadd | |
Benjamin Wang | cdbc2c1f5d | |
James Blair | 4a2fdb8ba8 | |
James Blair | 41b5e21748 | |
Marek Siarkowicz | 337164ba4a | |
Benjamin Wang | 8cb3fab8d9 | |
Azanul | b46dc0a1e4 | |
James Blair | 3b7e1223ab | |
Benjamin Wang | 8da2a5bf46 | |
Benjamin Wang | 004195bb6e | |
Benjamin Wang | a9864d4edb | |
Benjamin Wang | 53b23d32db | |
James Blair | 41446dbad9 | |
Marek Siarkowicz | 5773d94c22 | |
Jintao Zhang | 8f887d3a79 | |
Sahdev Zala | 0073fd4225 | |
Sahdev Zala | ea47d5bec7 | |
Benjamin Wang | b1df8c468f | |
Benjamin Wang | 98ebb67777 | |
Wei Fu | 59b8522687 | |
dependabot[bot] | 42e2c9d4c9 | |
Benjamin Wang | bd5d0a5bbb | |
dependabot[bot] | 904e5072d6 | |
Marek Siarkowicz | 8b5ec05ede | |
James Blair | ef9b6a6280 | |
Marek Siarkowicz | 7cc98e6392 | |
Jintao Zhang | b0b922cd71 | |
Benjamin Wang | bf903e5007 | |
Benjamin Wang | 3413f2e08d | |
Marek Siarkowicz | 16bf0f6641 | |
Hitoshi Mitake | 09b8673200 | |
Hitoshi Mitake | 08a4cd46fe | |
Benjamin Wang | e11dee6498 | |
Benjamin Wang | cdd9846b56 | |
Benjamin Wang | 82fc4258a7 | |
Wei Fu | b365f3cda4 | |
Bogdan Kanivets | ef91e8ae78 | |
Bogdan Kanivets | 4418e793a0 | |
Chao Chen | 9e1e378e9e | |
Benjamin Wang | 24b3ae9a17 | |
Marek Siarkowicz | 04346e870f | |
Benjamin Wang | 67c272e8ba | |
Benjamin Wang | a4f8f56496 | |
Cenk Alti | 2efecd1978 | |
Marek Siarkowicz | 4872b679a5 | |
James Blair | b2ee9887d1 | |
James Blair | a0063d76e7 | |
James Blair | 4153ecb93b | |
James Blair | bdfa70d02b | |
Benjamin Wang | 8c715f8a40 | |
dependabot[bot] | 820bcddc6d | |
Benjamin Wang | 1eb1b6ca69 | |
qsyqian | fbc34d1222 | |
Marek Siarkowicz | 633e2dcc26 | |
Wei Fu | befb283cca | |
Benjamin Wang | 51a26f8d58 | |
yellowzf | 523a961453 | |
cui fliter | 0c919dc212 | |
Benjamin Wang | 19ec574f45 | |
Marek Siarkowicz | 7e161d5664 | |
Sam Batschelet | a708e94749 | |
Marek Siarkowicz | 75b09410e5 | |
Marek Siarkowicz | f3c9db9c46 | |
Marek Siarkowicz | efcbd95f71 | |
Marek Siarkowicz | 6429f47631 | |
Marek Siarkowicz | 112aad1ea7 | |
Benjamin Wang | 9b10f20004 | |
Benjamin Wang | 9683b7912a | |
James Blair | 5a5b5a1c5d | |
James Blair | 1798730cd8 | |
dependabot[bot] | 29f9d06527 | |
Marek Siarkowicz | 4675e5c6a3 | |
Marek Siarkowicz | 6e53792568 | |
Marek Siarkowicz | 0efa1c19ef | |
Marek Siarkowicz | 911c40a347 | |
Marek Siarkowicz | 05ed91d76d | |
Benjamin Wang | 2df32102ca | |
yellowzf | ca221208d2 | |
Bogdan Kanivets | c338882d7a | |
Marek Siarkowicz | 14f21a124e | |
James Blair | 012b429f14 | |
Marek Siarkowicz | ffbaac8305 | |
Benjamin Wang | 52dfd4bbed | |
Benjamin Wang | 2bf495d93b | |
Chao Chen | c846b087db | |
Benjamin Wang | 2fd86a12a9 | |
James Blair | 941d760e42 | |
James Blair | ffe41987f9 | |
James Blair | 09ae3a641c | |
Marek Siarkowicz | 2a0c989662 | |
Marek Siarkowicz | 3d9890ff0e | |
Marek Siarkowicz | 831ce4c3cf | |
Benjamin Wang | d0ca536283 | |
Benjamin Wang | 67ec1a4d30 | |
Benjamin Wang | fa7067d0d8 | |
Marek Siarkowicz | e9900f6fff | |
Prasad Chandrasekaran | db07ec9561 | |
Prasad Chandrasekaran | 9878b134eb | |
Marek Siarkowicz | 9a922091ed | |
Marek Siarkowicz | 962e15038e | |
Marek Siarkowicz | d77c618e6a | |
Benjamin Wang | 05b663fbe8 | |
Benjamin Wang | e3db9dc616 | |
Marek Siarkowicz | 165a76b506 | |
Benjamin Wang | 5d1130f8d8 | |
Benjamin Wang | 1c455d4993 | |
Marek Siarkowicz | 2bb9930ffa | |
Marek Siarkowicz | dd248518d1 | |
James Blair | 3f5ad36039 | |
Benjamin Wang | 7f6d0d04ac | |
Chao Chen | f31d0eafb9 | |
Benjamin Wang | b404d25d84 | |
AngstyDuck | a7344da7d3 | |
Marek Siarkowicz | d81d3c3487 | |
Prasad Chandrasekaran | c863f1f8c0 | |
Marek Siarkowicz | 1e479f8c3c | |
Marek Siarkowicz | aa373e54df | |
Marek Siarkowicz | ad20230e07 | |
Marek Siarkowicz | f6161673af | |
Benjamin Wang | b7ad0382ad | |
Benjamin Wang | 3024d9461d | |
Marek Siarkowicz | b14b468661 | |
Hitoshi Mitake | a0cffb6a1f | |
qsyqian | 0cd1b7beaa | |
Benjamin Wang | 0a7dd2186b | |
James Blair | bb057ddae6 | |
Marek Siarkowicz | 767b59f0b0 | |
Rajalakshmi Girish | ac61b36e06 | |
Marek Siarkowicz | 7c68be4cf3 | |
Marek Siarkowicz | 249c0d71d4 | |
Marek Siarkowicz | 40f71ef3c6 | |
Marek Siarkowicz | 79eabc1cbf | |
Marek Siarkowicz | 92366a5338 | |
Benjamin Wang | 08d25b2e3e | |
Benjamin Wang | 8a17ed10bd | |
dependabot[bot] | d10cabd3f9 | |
dependabot[bot] | 58ec96a6ce | |
Benjamin Wang | b75499437b | |
Chao Chen | e9b1a0e70f | |
Marek Siarkowicz | cfe154209c | |
Marek Siarkowicz | 2c16812841 | |
Marek Siarkowicz | 9b5680c5f1 | |
Benjamin Wang | ecb64030fb | |
James Blair | b84e4273f7 | |
Benjamin Wang | 3ef5985bcd | |
Rajalakshmi Girish | c9998a7e63 | |
Benjamin Wang | 5021cd924c | |
Chao Chen | bb060586ce | |
Hitoshi Mitake | 49b59cc8e5 | |
Benjamin Wang | 4785f5a7ba | |
Benjamin Wang | b089474b01 | |
dependabot[bot] | 4c4bd63fa1 | |
Benjamin Wang | 0deaec0e4f | |
Marek Siarkowicz | 7462c61b31 | |
James Blair | b9533ca98b | |
Wei Fu | 09d053e035 | |
Marek Siarkowicz | 46ab121cb7 | |
Marek Siarkowicz | 7e2e5c68de | |
aimuz | b052092297 | |
Marek Siarkowicz | 7450cd886d | |
Marek Siarkowicz | cd24847086 | |
Rajalakshmi Girish | 81fccc13da | |
Benjamin Wang | c7d81acaf0 | |
Benjamin Wang | 6d11f8ceb5 | |
Msk233 | 26fdf46001 | |
Hitoshi Mitake | c9b368119e | |
Hitoshi Mitake | 975854f07f | |
Marek Siarkowicz | e04120042e | |
Marek Siarkowicz | f13b7502ef | |
Marek Siarkowicz | f6822b4225 | |
James Blair | ab65ee3d01 | |
Wei Fu | b4f49a55a5 | |
Marek Siarkowicz | 045192683c | |
Marek Siarkowicz | 2fd9a1914e | |
Benjamin Wang | 4485db379e | |
Benjamin Wang | 9b310ea316 | |
Wei Fu | aa787d9f51 | |
James Blair | 18e3acae0e | |
Benjamin Wang | 8c5e9ad455 | |
Benjamin Wang | 0f3fb04f1f | |
Benjamin Wang | 1dbc9db621 | |
dependabot[bot] | a2426712cc | |
Benjamin Wang | d589a0b5f6 | |
Marek Siarkowicz | c2d78a316a | |
Benjamin Wang | 146f44d35e | |
Benjamin Wang | 211b4320c3 | |
sharathsivakumar | 32c83becf5 | |
Wei Fu | 1ba577e499 |
|
@ -1,92 +1,102 @@
|
||||||
|
---
|
||||||
name: Bug Report
|
name: Bug Report
|
||||||
description: Report a bug encountered while operating Etcd
|
description: Report a bug encountered while operating etcd
|
||||||
labels:
|
labels:
|
||||||
- type/bug
|
- type/bug
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: checkboxes
|
||||||
attributes:
|
id: confirmations
|
||||||
value: |
|
attributes:
|
||||||
Please read https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md
|
label: Bug report criteria
|
||||||
If this matter is security related, please disclose it privately via security@etcd.io.
|
description: Please confirm this bug report meets the following criteria.
|
||||||
Please fill the form below and provide as much information as possible.
|
options:
|
||||||
Not doing so may result in your bug not being addressed in a timely manner.
|
- 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: textarea
|
- type: markdown
|
||||||
id: problem
|
attributes:
|
||||||
attributes:
|
value: |
|
||||||
label: What happened?
|
Please fill the form below and provide as much information as possible.
|
||||||
validations:
|
Not doing so may result in your bug not being addressed in a timely manner.
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: expected
|
id: problem
|
||||||
attributes:
|
attributes:
|
||||||
label: What did you expect to happen?
|
label: What happened?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: repro
|
id: expected
|
||||||
attributes:
|
attributes:
|
||||||
label: How can we reproduce it (as minimally and precisely as possible)?
|
label: What did you expect to happen?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: additional
|
id: repro
|
||||||
attributes:
|
attributes:
|
||||||
label: Anything else we need to know?
|
label: How can we reproduce it (as minimally and precisely as possible)?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: etcdVersion
|
id: additional
|
||||||
attributes:
|
attributes:
|
||||||
label: Etcd version (please run commands below)
|
label: Anything else we need to know?
|
||||||
value: |
|
|
||||||
<details>
|
|
||||||
|
|
||||||
```console
|
- type: textarea
|
||||||
$ etcd --version
|
id: etcdVersion
|
||||||
# paste output here
|
attributes:
|
||||||
|
label: Etcd version (please run commands below)
|
||||||
|
value: |
|
||||||
|
<details>
|
||||||
|
|
||||||
$ etcdctl version
|
```console
|
||||||
# paste output here
|
$ etcd --version
|
||||||
```
|
# paste output here
|
||||||
|
|
||||||
</details>
|
$ etcdctl version
|
||||||
validations:
|
# paste output here
|
||||||
required: true
|
```
|
||||||
|
|
||||||
- type: textarea
|
</details>
|
||||||
id: config
|
validations:
|
||||||
attributes:
|
required: true
|
||||||
label: Etcd configuration (command line flags or environment variables)
|
|
||||||
value: |
|
|
||||||
<details>
|
|
||||||
|
|
||||||
# paste your configuration here
|
- type: textarea
|
||||||
|
id: config
|
||||||
|
attributes:
|
||||||
|
label: Etcd configuration (command line flags or environment variables)
|
||||||
|
value: |
|
||||||
|
<details>
|
||||||
|
|
||||||
</details>
|
# paste your configuration here
|
||||||
|
|
||||||
- type: textarea
|
</details>
|
||||||
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
|
- type: textarea
|
||||||
$ etcdctl member list -w table
|
id: etcdDebugInformation
|
||||||
# paste output here
|
attributes:
|
||||||
|
label: Etcd debug information (please run commands below, feel free to obfuscate the IP address or FQDN in the output)
|
||||||
|
value: |
|
||||||
|
<details>
|
||||||
|
|
||||||
$ etcdctl --endpoints=<member list> endpoint status -w table
|
```console
|
||||||
# paste output here
|
$ etcdctl member list -w table
|
||||||
```
|
# paste output here
|
||||||
|
|
||||||
</details>
|
$ etcdctl --endpoints=<member list> endpoint status -w table
|
||||||
|
# paste output here
|
||||||
|
```
|
||||||
|
|
||||||
- type: textarea
|
</details>
|
||||||
id: logs
|
|
||||||
attributes:
|
- type: textarea
|
||||||
label: Relevant log output
|
id: logs
|
||||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
attributes:
|
||||||
render: shell
|
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,5 +1,6 @@
|
||||||
|
---
|
||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Question
|
- name: Question
|
||||||
url: https://github.com/etcd-io/etcd/discussions
|
url: https://github.com/etcd-io/etcd/discussions
|
||||||
about: Question relating to Etcd
|
about: Question relating to Etcd
|
||||||
|
|
|
@ -1,18 +1,19 @@
|
||||||
|
---
|
||||||
name: Feature request
|
name: Feature request
|
||||||
description: Provide idea for a new feature
|
description: Provide idea for a new feature
|
||||||
labels:
|
labels:
|
||||||
- type/feature
|
- type/feature
|
||||||
body:
|
body:
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: feature
|
id: feature
|
||||||
attributes:
|
attributes:
|
||||||
label: What would you like to be added?
|
label: What would you like to be added?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: rationale
|
id: rationale
|
||||||
attributes:
|
attributes:
|
||||||
label: Why is this needed?
|
label: Why is this needed?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
|
@ -1,30 +1,31 @@
|
||||||
|
---
|
||||||
name: Membership nomination
|
name: Membership nomination
|
||||||
description: Nominate new etcd members
|
description: Nominate new etcd members
|
||||||
labels:
|
labels:
|
||||||
- area/community
|
- area/community
|
||||||
body:
|
body:
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: feature
|
id: feature
|
||||||
attributes:
|
attributes:
|
||||||
label: Who would you like to nominate?
|
label: Who would you like to nominate?
|
||||||
validations:
|
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
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- id: requirements
|
||||||
id: rationale
|
type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: How do the new members meet the regular active contribution requirements?
|
label: Requirements
|
||||||
validations:
|
options:
|
||||||
required: true
|
- 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,33 +1,34 @@
|
||||||
|
---
|
||||||
name: Flaking Test
|
name: Flaking Test
|
||||||
description: Report flaky tests
|
description: Report flaky tests
|
||||||
labels:
|
labels:
|
||||||
- type/flake
|
- type/flake
|
||||||
body:
|
body:
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: workflows
|
id: workflows
|
||||||
attributes:
|
attributes:
|
||||||
label: Which github workflows are flaking?
|
label: Which github workflows are flaking?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: tests
|
id: tests
|
||||||
attributes:
|
attributes:
|
||||||
label: Which tests are flaking?
|
label: Which tests are flaking?
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
- type: input
|
- type: input
|
||||||
id: link
|
id: link
|
||||||
attributes:
|
attributes:
|
||||||
label: Github Action link
|
label: Github Action link
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: reason
|
id: reason
|
||||||
attributes:
|
attributes:
|
||||||
label: Reason for failure (if possible)
|
label: Reason for failure (if possible)
|
||||||
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: additional
|
id: additional
|
||||||
attributes:
|
attributes:
|
||||||
label: Anything else we need to know?
|
label: Anything else we need to know?
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: github-actions
|
- package-ecosystem: github-actions
|
||||||
|
@ -10,11 +11,11 @@ updates:
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
allow:
|
allow:
|
||||||
- dependency-type: all
|
- dependency-type: all
|
||||||
|
|
||||||
- package-ecosystem: gomod
|
- package-ecosystem: gomod
|
||||||
directory: /tools/mod # Not linked from /go.mod
|
directory: /tools/mod # Not linked from /go.mod
|
||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
allow:
|
allow:
|
||||||
- dependency-type: all
|
- dependency-type: all
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
# Configuration for probot-stale - https://github.com/probot/stale
|
# Configuration for probot-stale - https://github.com/probot/stale
|
||||||
|
|
||||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||||
|
@ -27,11 +28,7 @@ exemptAssignees: false
|
||||||
staleLabel: stale
|
staleLabel: stale
|
||||||
|
|
||||||
# Comment to post when marking as stale. Set to `false` to disable
|
# Comment to post when marking as stale. Set to `false` to disable
|
||||||
markComment: >
|
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.
|
||||||
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.
|
# Comment to post when removing the stale label.
|
||||||
# unmarkComment: >
|
# unmarkComment: >
|
||||||
# Your comment here.
|
# Your comment here.
|
||||||
|
|
|
@ -1,13 +1,11 @@
|
||||||
|
---
|
||||||
name: Build
|
name: Build
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -22,10 +20,12 @@ jobs:
|
||||||
- linux-ppc64le
|
- linux-ppc64le
|
||||||
- linux-s390x
|
- linux-s390x
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
with:
|
with:
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
- env:
|
- env:
|
||||||
TARGET: ${{ matrix.target }}
|
TARGET: ${{ matrix.target }}
|
||||||
run: |
|
run: |
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
# For most projects, this workflow file will not need changing; you simply need
|
# For most projects, this workflow file will not need changing; you simply need
|
||||||
# to commit it to your repository.
|
# to commit it to your repository.
|
||||||
#
|
#
|
||||||
|
@ -10,18 +11,15 @@
|
||||||
# supported CodeQL languages.
|
# supported CodeQL languages.
|
||||||
#
|
#
|
||||||
name: "CodeQL"
|
name: "CodeQL"
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main, release-3.4, release-3.5, release-3.6 ]
|
branches: [main, release-3.4, release-3.5, release-3.6]
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
# The branches below must be a subset of the branches above
|
||||||
branches: [ main ]
|
branches: [main]
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '20 14 * * 5'
|
- cron: '20 14 * * 5'
|
||||||
|
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
name: Analyze
|
name: Analyze
|
||||||
|
@ -30,44 +28,28 @@ jobs:
|
||||||
actions: read
|
actions: read
|
||||||
contents: read
|
contents: read
|
||||||
security-events: write
|
security-events: write
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
language: [ 'go' ]
|
|
||||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||||
# Learn more:
|
# 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
|
# 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:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
# Initializes the CodeQL tools for scanning.
|
- name: Initialize CodeQL
|
||||||
- name: Initialize CodeQL
|
uses: github/codeql-action/init@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||||
uses: github/codeql-action/init@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12
|
with:
|
||||||
with:
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
languages: ${{ matrix.language }}
|
# By default, queries listed here will override any specified in a config file.
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
# By default, queries listed here will override any specified in a config file.
|
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
languages: ${{ matrix.language }}
|
||||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
# 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)
|
||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
- name: Autobuild
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
uses: github/codeql-action/autobuild@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||||
- name: Autobuild
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/autobuild@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12
|
uses: github/codeql-action/analyze@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||||
|
|
||||||
# ℹ️ 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@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12
|
|
||||||
|
|
|
@ -1,18 +1,18 @@
|
||||||
|
---
|
||||||
name: Test contrib/mixin
|
name: Test contrib/mixin
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- run: |
|
with:
|
||||||
set -euo pipefail
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
|
- run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
make -C contrib/mixin tools test
|
make -C contrib/mixin tools test
|
||||||
|
|
|
@ -1,32 +1,32 @@
|
||||||
|
---
|
||||||
name: Coverage
|
name: Coverage
|
||||||
on: [push]
|
on: [push]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
coverage:
|
coverage:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-amd64-coverage
|
- linux-amd64-coverage
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- env:
|
with:
|
||||||
TARGET: ${{ matrix.target }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
run: |
|
- env:
|
||||||
mkdir "${TARGET}"
|
TARGET: ${{ matrix.target }}
|
||||||
case "${TARGET}" in
|
run: |
|
||||||
linux-amd64-coverage)
|
mkdir "${TARGET}"
|
||||||
GOARCH=amd64 ./scripts/codecov_upload.sh
|
case "${TARGET}" in
|
||||||
;;
|
linux-amd64-coverage)
|
||||||
*)
|
GOARCH=amd64 ./scripts/codecov_upload.sh
|
||||||
echo "Failed to find target"
|
;;
|
||||||
exit 1
|
*)
|
||||||
;;
|
echo "Failed to find target"
|
||||||
esac
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
|
@ -1,40 +1,45 @@
|
||||||
|
---
|
||||||
name: E2E-arm64
|
name: E2E-arm64
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 1 * * *' # runs daily at 1am.
|
- cron: '0 1 * * *' # runs daily at 1am.
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
# this is to prevent the job to run at forked projects
|
# this is to prevent the job to run at forked projects
|
||||||
if: github.repository == 'etcd-io/etcd'
|
if: github.repository == 'etcd-io/etcd'
|
||||||
runs-on: [Linux, ARM64]
|
runs-on: [self-hosted, Linux, ARM64]
|
||||||
needs: goversion
|
container: golang:1.19-bullseye
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-arm64-e2e
|
- linux-arm64-e2e
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
# https://github.com/actions/checkout/issues/1169
|
||||||
with:
|
- run: git config --system --add safe.directory '*'
|
||||||
ref: main
|
- id: goversion
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
- run: date
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- env:
|
with:
|
||||||
TARGET: ${{ matrix.target }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
run: |
|
- env:
|
||||||
set -euo pipefail
|
TARGET: ${{ matrix.target }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
go clean -testcache
|
||||||
|
|
||||||
echo "${TARGET}"
|
echo "${TARGET}"
|
||||||
case "${TARGET}" in
|
case "${TARGET}" in
|
||||||
linux-arm64-e2e)
|
linux-arm64-e2e)
|
||||||
GOOS=linux GOARCH=arm64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
GOOS=linux GOARCH=arm64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target"
|
echo "Failed to find target"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1,39 +1,39 @@
|
||||||
|
---
|
||||||
name: E2E
|
name: E2E
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-amd64-e2e
|
- linux-amd64-e2e
|
||||||
- linux-386-e2e
|
- linux-386-e2e
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- run: date
|
with:
|
||||||
- env:
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
TARGET: ${{ matrix.target }}
|
- env:
|
||||||
run: |
|
TARGET: ${{ matrix.target }}
|
||||||
set -euo pipefail
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
go clean -testcache
|
||||||
|
|
||||||
echo "${TARGET}"
|
echo "${TARGET}"
|
||||||
case "${TARGET}" in
|
case "${TARGET}" in
|
||||||
linux-amd64-e2e)
|
linux-amd64-e2e)
|
||||||
GOOS=linux GOARCH=amd64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
VERBOSE=1 GOOS=linux GOARCH=amd64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||||
;;
|
;;
|
||||||
linux-386-e2e)
|
linux-386-e2e)
|
||||||
GOOS=linux GOARCH=386 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e
|
VERBOSE=1 GOOS=linux GOARCH=386 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target"
|
echo "Failed to find target"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1,26 +1,26 @@
|
||||||
|
---
|
||||||
name: Fuzzing v3rpc
|
name: Fuzzing v3rpc
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
fuzzing:
|
fuzzing:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
env:
|
env:
|
||||||
TARGET_PATH: ./server/etcdserver/api/v3rpc
|
TARGET_PATH: ./server/etcdserver/api/v3rpc
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- run: |
|
with:
|
||||||
set -euo pipefail
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
|
- run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
GOARCH=amd64 CPU=4 make fuzz
|
GOARCH=amd64 CPU=4 make fuzz
|
||||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
path: "${{env.TARGET_PATH}}/testdata/fuzz/**/*"
|
path: "${{env.TARGET_PATH}}/testdata/fuzz/**/*"
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
name: Go version setup
|
|
||||||
|
|
||||||
env:
|
|
||||||
GO_VERSION: "1.19.8"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
outputs:
|
|
||||||
goversion:
|
|
||||||
value: ${{ jobs.version.outputs.goversion }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
version:
|
|
||||||
name: Set Go version variable for all the workflows
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
goversion: ${{ steps.step1.outputs.goversion }}
|
|
||||||
steps:
|
|
||||||
- id: step1
|
|
||||||
run: |
|
|
||||||
echo "Go Version: $GO_VERSION"
|
|
||||||
echo "goversion=$GO_VERSION" >> $GITHUB_OUTPUT
|
|
|
@ -1,17 +1,17 @@
|
||||||
|
---
|
||||||
name: Go Vulnerability Checker
|
name: Go Vulnerability Checker
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
with:
|
with:
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
- run: date
|
- run: date
|
||||||
- run: |
|
- run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
|
@ -1,39 +1,38 @@
|
||||||
|
---
|
||||||
name: grpcProxy-tests
|
name: grpcProxy-tests
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-amd64-grpcproxy-integration
|
- linux-amd64-grpcproxy-integration
|
||||||
- linux-amd64-grpcproxy-e2e
|
- linux-amd64-grpcproxy-e2e
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- run: date
|
with:
|
||||||
- env:
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
TARGET: ${{ matrix.target }}
|
- env:
|
||||||
run: |
|
TARGET: ${{ matrix.target }}
|
||||||
set -euo pipefail
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
echo "${TARGET}"
|
echo "${TARGET}"
|
||||||
case "${TARGET}" in
|
case "${TARGET}" in
|
||||||
linux-amd64-grpcproxy-integration)
|
linux-amd64-grpcproxy-integration)
|
||||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-integration
|
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-integration
|
||||||
;;
|
;;
|
||||||
linux-amd64-grpcproxy-e2e)
|
linux-amd64-grpcproxy-e2e)
|
||||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-e2e
|
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-e2e
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target"
|
echo "Failed to find target"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
name: Measure Test Flakiness
|
name: Measure Test Flakiness
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
@ -11,12 +12,12 @@ jobs:
|
||||||
name: Measure Test Flakiness
|
name: Measure Test Flakiness
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- env:
|
- env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
./scripts/measure-test-flakiness.sh
|
./scripts/measure-test-flakiness.sh
|
||||||
make bin/etcd-test-analyzer
|
make bin/etcd-test-analyzer
|
||||||
bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main
|
bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main
|
||||||
|
|
|
@ -1,34 +1,34 @@
|
||||||
|
---
|
||||||
name: Release
|
name: Release
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
main:
|
main:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- name: release
|
with:
|
||||||
run: |
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
set -euo pipefail
|
- name: release
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
git config --global user.email "github-action@etcd.io"
|
git config --global user.email "github-action@etcd.io"
|
||||||
git config --global user.name "Github Action"
|
git config --global user.name "Github Action"
|
||||||
gpg --batch --gen-key <<EOF
|
gpg --batch --gen-key <<EOF
|
||||||
%no-protection
|
%no-protection
|
||||||
Key-Type: 1
|
Key-Type: 1
|
||||||
Key-Length: 2048
|
Key-Length: 2048
|
||||||
Subkey-Type: 1
|
Subkey-Type: 1
|
||||||
Subkey-Length: 2048
|
Subkey-Length: 2048
|
||||||
Name-Real: Github Action
|
Name-Real: Github Action
|
||||||
Name-Email: github-action@etcd.io
|
Name-Email: github-action@etcd.io
|
||||||
Expire-Date: 0
|
Expire-Date: 0
|
||||||
EOF
|
EOF
|
||||||
DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99
|
DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99
|
||||||
- name: test-image
|
- name: test-image
|
||||||
run: |
|
run: |
|
||||||
VERSION=3.6.99 ./scripts/test_images.sh
|
VERSION=3.6.99 ./scripts/test_images.sh
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
name: Robustness Nightly
|
name: Robustness Nightly
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
on:
|
on:
|
||||||
|
@ -14,6 +15,14 @@ jobs:
|
||||||
count: 100
|
count: 100
|
||||||
testTimeout: 200m
|
testTimeout: 200m
|
||||||
artifactName: main
|
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:
|
release-35:
|
||||||
uses: ./.github/workflows/robustness-template.yaml
|
uses: ./.github/workflows/robustness-template.yaml
|
||||||
with:
|
with:
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
---
|
||||||
|
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,3 +1,4 @@
|
||||||
|
---
|
||||||
name: Reusable Robustness Workflow
|
name: Reusable Robustness Workflow
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
|
@ -15,46 +16,50 @@ on:
|
||||||
artifactName:
|
artifactName:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
runs-on:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: "['ubuntu-latest']"
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
timeout-minutes: 210
|
timeout-minutes: 210
|
||||||
runs-on: ubuntu-latest
|
runs-on: ${{ fromJson(inputs.runs-on) }}
|
||||||
needs: goversion
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- name: test-robustness
|
with:
|
||||||
env:
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
- name: test-robustness
|
||||||
run: |
|
env:
|
||||||
set -euo pipefail
|
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
go clean -testcache
|
||||||
|
|
||||||
# Use --failfast to avoid overriding report generated by failed test
|
# Use --failfast to avoid overriding report generated by failed test
|
||||||
GO_TEST_FLAGS="-v --count ${{ inputs.count }} --timeout ${{ inputs.testTimeout }} --failfast --run TestRobustness"
|
GO_TEST_FLAGS="-v --count ${{ inputs.count }} --timeout ${{ inputs.testTimeout }} --failfast --run TestRobustness"
|
||||||
case "${ETCD_BRANCH}" in
|
case "${ETCD_BRANCH}" in
|
||||||
release-3.5)
|
release-3.5)
|
||||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-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)
|
release-3.4)
|
||||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.4
|
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.4
|
||||||
;;
|
;;
|
||||||
main)
|
main)
|
||||||
make gofail-enable
|
make gofail-enable
|
||||||
make build
|
make build
|
||||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness
|
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target ${ETCD_BRANCH}"
|
echo "Failed to find target ${ETCD_BRANCH}"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: ${{ inputs.artifactName }}
|
name: ${{ inputs.artifactName }}
|
||||||
path: /tmp/results/*
|
path: /tmp/results/*
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
name: Robustness
|
name: Robustness
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
name: Scorecards supply-chain security
|
name: Scorecards supply-chain security
|
||||||
on:
|
on:
|
||||||
# Only the default branch is supported.
|
# Only the default branch is supported.
|
||||||
|
@ -5,7 +6,7 @@ on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '45 1 * * 0'
|
- cron: '45 1 * * 0'
|
||||||
push:
|
push:
|
||||||
branches: [ "main" ]
|
branches: ["main"]
|
||||||
|
|
||||||
# Declare default permissions as read only.
|
# Declare default permissions as read only.
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
@ -22,7 +23,7 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: "Checkout code"
|
- name: "Checkout code"
|
||||||
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # tag=v3.0.0
|
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # tag=v3.0.0
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
@ -49,6 +50,6 @@ jobs:
|
||||||
|
|
||||||
# Upload the results to GitHub's code scanning dashboard.
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
- name: "Upload to code-scanning"
|
- name: "Upload to code-scanning"
|
||||||
uses: github/codeql-action/upload-sarif@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # tag=v1.0.26
|
uses: github/codeql-action/upload-sarif@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # tag=v1.0.26
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|
|
@ -1,23 +1,24 @@
|
||||||
|
---
|
||||||
name: Static Analysis
|
name: Static Analysis
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
run:
|
run:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
with:
|
with:
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
- name: golangci-lint
|
- name: golangci-lint
|
||||||
uses: golangci/golangci-lint-action@08e2f20817b15149a52b5b3ebe7de50aff2ba8c5 # v3.4.0
|
uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3.6.0
|
||||||
with:
|
with:
|
||||||
version: v1.49.0
|
version: v1.49.0
|
||||||
|
args: --config tools/.golangci.yaml
|
||||||
- name: protoc
|
- name: protoc
|
||||||
uses: arduino/setup-protoc@64c0c85d18e984422218383b81c52f8b077404d3 # v1.1.2
|
uses: arduino/setup-protoc@149f6c87b92550901b26acd1632e11c3662e381f # v1.3.0
|
||||||
with:
|
with:
|
||||||
version: '3.14.0'
|
version: '3.14.0'
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
|
@ -1,56 +1,62 @@
|
||||||
|
---
|
||||||
name: Tests-arm64
|
name: Tests-arm64
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '30 1 * * *' # runs daily at 1:30 am.
|
- cron: '30 1 * * *' # runs daily at 1:30 am.
|
||||||
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
# this is to prevent the job to run at forked projects
|
# this is to prevent the job to run at forked projects
|
||||||
if: github.repository == 'etcd-io/etcd'
|
if: github.repository == 'etcd-io/etcd'
|
||||||
runs-on: [Linux, ARM64]
|
runs-on: [self-hosted, Linux, ARM64]
|
||||||
needs: goversion
|
container: golang:1.19-bullseye
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-arm64-integration-1-cpu
|
- linux-arm64-integration-1-cpu
|
||||||
- linux-arm64-integration-2-cpu
|
- linux-arm64-integration-2-cpu
|
||||||
- linux-arm64-integration-4-cpu
|
- linux-arm64-integration-4-cpu
|
||||||
- linux-arm64-unit-4-cpu-race
|
- linux-arm64-unit-4-cpu-race
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
# https://github.com/actions/checkout/issues/1169
|
||||||
with:
|
- run: git config --system --add safe.directory '*'
|
||||||
ref: main
|
- id: goversion
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
- run: date
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- env:
|
with:
|
||||||
TARGET: ${{ matrix.target }}
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
run: |
|
- env:
|
||||||
set -euo pipefail
|
TARGET: ${{ matrix.target }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
go clean -testcache
|
||||||
|
|
||||||
mkdir "${TARGET}"
|
mkdir "${TARGET}"
|
||||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||||
case "${TARGET}" in
|
case "${TARGET}" in
|
||||||
linux-arm64-integration-1-cpu)
|
linux-arm64-integration-1-cpu)
|
||||||
GOOS=linux GOARCH=arm64 CPU=1 make test-integration
|
GOOS=linux GOARCH=arm64 CPU=1 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-arm64-integration-2-cpu)
|
linux-arm64-integration-2-cpu)
|
||||||
GOOS=linux GOARCH=arm64 CPU=2 make test-integration
|
GOOS=linux GOARCH=arm64 CPU=2 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-arm64-integration-4-cpu)
|
linux-arm64-integration-4-cpu)
|
||||||
GOOS=linux GOARCH=arm64 CPU=4 make test-integration
|
GOOS=linux GOARCH=arm64 CPU=4 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-arm64-unit-4-cpu-race)
|
linux-arm64-unit-4-cpu-race)
|
||||||
GOOS=linux GOARCH=arm64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
GOOS=linux GOARCH=arm64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target"
|
echo "Failed to find target"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
path: ./**/junit_*.xml
|
path: ./**/junit_*.xml
|
||||||
|
|
|
@ -1,56 +1,56 @@
|
||||||
|
---
|
||||||
name: Tests
|
name: Tests
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
jobs:
|
jobs:
|
||||||
goversion:
|
|
||||||
uses: ./.github/workflows/go-version.yaml
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: goversion
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
target:
|
target:
|
||||||
- linux-amd64-integration-1-cpu
|
- linux-amd64-integration-1-cpu
|
||||||
- linux-amd64-integration-2-cpu
|
- linux-amd64-integration-2-cpu
|
||||||
- linux-amd64-integration-4-cpu
|
- linux-amd64-integration-4-cpu
|
||||||
- linux-amd64-unit-4-cpu-race
|
- linux-amd64-unit-4-cpu-race
|
||||||
- linux-386-unit-1-cpu
|
- linux-386-unit-1-cpu
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
- id: goversion
|
||||||
with:
|
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||||
- run: date
|
with:
|
||||||
- env:
|
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||||
TARGET: ${{ matrix.target }}
|
- env:
|
||||||
run: |
|
TARGET: ${{ matrix.target }}
|
||||||
set -euo pipefail
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
go clean -testcache
|
||||||
|
|
||||||
mkdir "${TARGET}"
|
mkdir "${TARGET}"
|
||||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||||
case "${TARGET}" in
|
case "${TARGET}" in
|
||||||
linux-amd64-integration-1-cpu)
|
linux-amd64-integration-1-cpu)
|
||||||
GOOS=linux GOARCH=amd64 CPU=1 make test-integration
|
GOOS=linux GOARCH=amd64 CPU=1 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-amd64-integration-2-cpu)
|
linux-amd64-integration-2-cpu)
|
||||||
GOOS=linux GOARCH=amd64 CPU=2 make test-integration
|
GOOS=linux GOARCH=amd64 CPU=2 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-amd64-integration-4-cpu)
|
linux-amd64-integration-4-cpu)
|
||||||
GOOS=linux GOARCH=amd64 CPU=4 make test-integration
|
GOOS=linux GOARCH=amd64 CPU=4 make test-integration
|
||||||
;;
|
;;
|
||||||
linux-amd64-unit-4-cpu-race)
|
linux-amd64-unit-4-cpu-race)
|
||||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
GOOS=linux GOARCH=amd64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||||
;;
|
;;
|
||||||
linux-386-unit-1-cpu)
|
linux-386-unit-1-cpu)
|
||||||
GOOS=linux GOARCH=386 CPU=1 GO_TEST_FLAGS='-p=4' make test-unit
|
GOOS=linux GOARCH=386 CPU=1 GO_TEST_FLAGS='-p=4' make test-unit
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Failed to find target"
|
echo "Failed to find target"
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
path: ./**/junit_*.xml
|
path: ./**/junit_*.xml
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
1.19.10
|
|
@ -4,6 +4,23 @@ Previous change logs can be found at [CHANGELOG-3.3](https://github.com/etcd-io/
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
## v3.4.27 (tbd)
|
||||||
|
|
||||||
|
### etcd server
|
||||||
|
- Fix [corruption check may get a `ErrCompacted` error when server has just been compacted](https://github.com/etcd-io/etcd/pull/16047)
|
||||||
|
- Improve [Lease put performance for the case that auth is disabled or the user is admin](https://github.com/etcd-io/etcd/pull/16020)
|
||||||
|
|
||||||
|
## v3.4.26 (2023-05-12)
|
||||||
|
|
||||||
|
### 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/15814).
|
||||||
|
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
- Compile binaries using [go 1.19.9](https://github.com/etcd-io/etcd/pull/15823)
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
## v3.4.25 (2023-04-14)
|
## v3.4.25 (2023-04-14)
|
||||||
|
|
||||||
### etcd server
|
### etcd server
|
||||||
|
|
|
@ -4,7 +4,28 @@ Previous change logs can be found at [CHANGELOG-3.4](https://github.com/etcd-io/
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
## v3.5.8 (TBD)
|
## 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
|
### 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 --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15483) to enable support for TLS 1.3.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
## Production recommendation
|
## Production recommendation
|
||||||
|
|
||||||
The minimum recommended etcd versions to run in **production** are v3.4.8+ and v3.5.4+. Refer to the [versioning policy](https://etcd.io/docs/v3.5/op-guide/versioning/) for more details.
|
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
|
### v3.5 data corruption issue
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
FROM --platform=linux/s390x gcr.io/distroless/static-debian11
|
ARG ARCH=amd64
|
||||||
|
FROM --platform=linux/${ARCH} gcr.io/distroless/static-debian11
|
||||||
|
|
||||||
ADD etcd /usr/local/bin/
|
ADD etcd /usr/local/bin/
|
||||||
ADD etcdctl /usr/local/bin/
|
ADD etcdctl /usr/local/bin/
|
|
@ -1,13 +0,0 @@
|
||||||
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"]
|
|
|
@ -1,13 +0,0 @@
|
||||||
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"]
|
|
|
@ -1,13 +0,0 @@
|
||||||
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"]
|
|
|
@ -112,8 +112,19 @@ depend on to make decisions in the best interest of the project in a consistent
|
||||||
- Initiating, contributing and resolving discussions (emails, GitHub issues, meetings)
|
- Initiating, contributing and resolving discussions (emails, GitHub issues, meetings)
|
||||||
- Identifying subtle or complex issues in designs and implementation PRs
|
- Identifying subtle or complex issues in designs and implementation PRs
|
||||||
- Directly contributed to the project through implementation and / or review
|
- Directly contributed to the project through implementation and / or review
|
||||||
- Subscribed to [etcd-maintainers@googlegroups.com]
|
- Sponsored by two active maintainers and elected by supermajority
|
||||||
- Elected by supermajority of active maintainers.
|
- 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
|
### Responsibilities and privileges
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
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.
|
|
@ -4,43 +4,177 @@
|
||||||
|
|
||||||
Speed up issue management.
|
Speed up issue management.
|
||||||
|
|
||||||
The `etcd` issues are listed at https://github.com/etcd-io/etcd/issues
|
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`.
|
||||||
and are identified with labels. For example, an issue that is identified
|
|
||||||
as a bug will eventually be set to label `area/bug`. New issues will
|
|
||||||
start out without any labels, but typically `etcd` maintainers and active contributors
|
|
||||||
add labels based on their findings. The detailed list of labels can be found at
|
|
||||||
https://github.com/kubernetes/kubernetes/labels
|
|
||||||
|
|
||||||
Following are few predetermined searches on issues for convenience:
|
The etcd project uses labels to indicate common attributes such as `area`, `type` and `priority` of incoming issues.
|
||||||
* [Bugs](https://github.com/etcd-io/etcd/labels/area%2Fbug)
|
|
||||||
* [Help Wanted](https://github.com/etcd-io/etcd/labels/Help%20Wanted)
|
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>.
|
||||||
* [Longest untriaged issues](https://github.com/etcd-io/etcd/issues?utf8=%E2%9C%93&q=is%3Aopen+sort%3Aupdated-asc+)
|
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
These guidelines serves as a primary document for triaging an incoming issues in
|
This document serves as the primary guidelines for triaging incoming issues in `etcd`.
|
||||||
`etcd`. Everyone is welcome to help manage issues and PRs but the work and responsibilities discussed in this document are created with `etcd` maintainers and active contributors in mind.
|
|
||||||
|
|
||||||
## Validate if an issue is a bug
|
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.
|
||||||
|
|
||||||
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 require more information, leave a comment for the issue reporter.
|
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.
|
||||||
|
|
||||||
## Inactive issues
|
## Step 1 - Find an issue to triage
|
||||||
|
|
||||||
Issues that lack enough information from the issue reporter should be closed if issue reporter do not provide information in 60 days.
|
To get started you can use the following recommended issue searches to identify issues that are in need of triage:
|
||||||
|
|
||||||
## Duplicate issues
|
* [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+)
|
||||||
|
|
||||||
If an issue is a duplicate, add a comment stating so along with a reference for the original issue and close it.
|
## Step 2 - Check the issue is valid
|
||||||
|
|
||||||
## Issues that don't belong to etcd
|
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.
|
||||||
|
|
||||||
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. Close the issue unless a maintainer and issue reporter see a need to keep it open for tracking purpose.
|
### Issues that don't belong to etcd
|
||||||
|
|
||||||
## Verify important labels are in place
|
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.
|
||||||
|
|
||||||
Make sure that issue has label on areas it belongs to, proper assignees are added and milestone is identified. If any of these labels are missing, add one. If labels can not be assigned due to limited privilege or correct label can not be decided, that’s fine, contact maintainers if needed.
|
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.
|
||||||
|
|
||||||
## Poke issue owner if needed
|
### Duplicate issues
|
||||||
|
|
||||||
If an issue owned by a developer has no PR created in 30 days, contact the issue owner and ask for a PR or to release ownership if needed.
|
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.
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -251,13 +251,16 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"type_url": {
|
"type_url": {
|
||||||
"type": "string"
|
"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."
|
||||||
},
|
},
|
||||||
"value": {
|
"value": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte",
|
||||||
|
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"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": {
|
"runtimeError": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
|
|
@ -108,13 +108,16 @@
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"type_url": {
|
"type_url": {
|
||||||
"type": "string"
|
"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."
|
||||||
},
|
},
|
||||||
"value": {
|
"value": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "byte"
|
"format": "byte",
|
||||||
|
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"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": {
|
"runtimeError": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
# 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,6 +1,6 @@
|
||||||
# The official list of maintainers and reviewers for the project maintenance.
|
# The official list of maintainers and reviewers for the project maintenance.
|
||||||
#
|
#
|
||||||
# Refer to the GOVERNANCE.md for description of the roles.
|
# Refer to the https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md for description of the roles.
|
||||||
#
|
#
|
||||||
# Names should be added to this file like so:
|
# Names should be added to this file like so:
|
||||||
# Individual's name <submission email address> (@GITHUB_HANDLE) pkg:*
|
# Individual's name <submission email address> (@GITHUB_HANDLE) pkg:*
|
||||||
|
@ -11,8 +11,8 @@
|
||||||
# MAINTAINERS
|
# MAINTAINERS
|
||||||
Benjamin Wang <wachao@vmware.com> (ahrtr@) pkg:*
|
Benjamin Wang <wachao@vmware.com> (ahrtr@) pkg:*
|
||||||
Hitoshi Mitake <h.mitake@gmail.com> (@mitake) pkg:*
|
Hitoshi Mitake <h.mitake@gmail.com> (@mitake) pkg:*
|
||||||
Marek Siarkowicz <marek.siarkowicz@gmail.com> (@serathius) pkg:*
|
Marek Siarkowicz <siarkowicz@google.com> <marek.siarkowicz@gmail.com> (@serathius) pkg:*
|
||||||
Piotr Tabor <ptab@google.com> (@ptabor) pkg:*
|
Piotr Tabor <piotr.tabor@gmail.com> (@ptabor) pkg:*
|
||||||
Sahdev Zala <spzala@us.ibm.com> (@spzala) pkg:*
|
Sahdev Zala <spzala@us.ibm.com> (@spzala) pkg:*
|
||||||
|
|
||||||
# REVIEWERS
|
# REVIEWERS
|
||||||
|
|
31
Makefile
31
Makefile
|
@ -64,8 +64,8 @@ fuzz:
|
||||||
|
|
||||||
verify: verify-gofmt verify-bom verify-lint verify-dep verify-shellcheck verify-goword \
|
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-govet verify-license-header verify-receiver-name verify-mod-tidy verify-shellcheck \
|
||||||
verify-shellws verify-proto-annotations verify-genproto verify-goimport
|
verify-shellws verify-proto-annotations verify-genproto verify-goimport verify-yamllint
|
||||||
fix: fix-bom fix-lint
|
fix: fix-goimports fix-bom fix-lint fix-yamllint
|
||||||
./scripts/fix.sh
|
./scripts/fix.sh
|
||||||
|
|
||||||
.PHONY: verify-gofmt
|
.PHONY: verify-gofmt
|
||||||
|
@ -76,7 +76,7 @@ verify-gofmt:
|
||||||
verify-bom:
|
verify-bom:
|
||||||
PASSES="bom" ./scripts/test.sh
|
PASSES="bom" ./scripts/test.sh
|
||||||
|
|
||||||
.PHONY: update-bom
|
.PHONY: fix-bom
|
||||||
fix-bom:
|
fix-bom:
|
||||||
./scripts/updatebom.sh
|
./scripts/updatebom.sh
|
||||||
|
|
||||||
|
@ -86,11 +86,11 @@ verify-dep:
|
||||||
|
|
||||||
.PHONY: verify-lint
|
.PHONY: verify-lint
|
||||||
verify-lint:
|
verify-lint:
|
||||||
golangci-lint run
|
golangci-lint run --config tools/.golangci.yaml
|
||||||
|
|
||||||
.PHONY: update-lint
|
.PHONY: fix-lint
|
||||||
fix-lint:
|
fix-lint:
|
||||||
golangci-lint run --fix
|
golangci-lint run --config tools/.golangci.yaml --fix
|
||||||
|
|
||||||
.PHONY: verify-shellcheck
|
.PHONY: verify-shellcheck
|
||||||
verify-shellcheck:
|
verify-shellcheck:
|
||||||
|
@ -132,12 +132,29 @@ verify-genproto:
|
||||||
verify-goimport:
|
verify-goimport:
|
||||||
PASSES="goimport" ./scripts/test.sh
|
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
|
# Cleanup
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f ./codecov
|
rm -f ./codecov
|
||||||
rm -rf ./covdir
|
rm -rf ./covdir
|
||||||
rm -f ./bin/Dockerfile-release*
|
rm -f ./bin/Dockerfile-release
|
||||||
rm -rf ./bin/etcd*
|
rm -rf ./bin/etcd*
|
||||||
rm -rf ./default.etcd
|
rm -rf ./default.etcd
|
||||||
rm -rf ./tests/e2e/default.etcd
|
rm -rf ./tests/e2e/default.etcd
|
||||||
|
|
19
Procfile
19
Procfile
|
@ -6,4 +6,21 @@ 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
|
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
|
#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 Procfile.learner
|
# 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>
|
||||||
|
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
# 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
|
|
||||||
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>
|
|
|
@ -1,7 +0,0 @@
|
||||||
# Use goreman to run `go install github.com/mattn/goreman@latest`
|
|
||||||
# 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
|
|
36
README.md
36
README.md
|
@ -27,6 +27,10 @@ etcd is used [in production by many companies](./ADOPTERS.md), and the developme
|
||||||
|
|
||||||
See [etcdctl][etcdctl] for a simple command line client.
|
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/
|
[raft]: https://raft.github.io/
|
||||||
[k8s]: http://kubernetes.io/
|
[k8s]: http://kubernetes.io/
|
||||||
[doorman]: https://github.com/youtube/doorman
|
[doorman]: https://github.com/youtube/doorman
|
||||||
|
@ -47,7 +51,6 @@ 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 more installation guides, please check out [play.etcd.io](http://play.etcd.io) and [operating etcd](https://etcd.io/docs/latest/op-guide).
|
||||||
|
|
||||||
[github-release]: https://github.com/etcd-io/etcd/releases
|
[github-release]: https://github.com/etcd-io/etcd/releases
|
||||||
[branch-management]: https://etcd.io/docs/latest/branch_management
|
|
||||||
|
|
||||||
### Running etcd
|
### Running etcd
|
||||||
|
|
||||||
|
@ -70,15 +73,15 @@ This will bring up etcd listening on port 2379 for client communication and on p
|
||||||
|
|
||||||
Next, let's set a single key, and then retrieve it:
|
Next, let's set a single key, and then retrieve it:
|
||||||
|
|
||||||
```
|
```bash
|
||||||
etcdctl put mykey "this is awesome"
|
etcdctl put mykey "this is awesome"
|
||||||
etcdctl get mykey
|
etcdctl get mykey
|
||||||
```
|
```
|
||||||
|
|
||||||
etcd is now running and serving client requests. For more, please check out:
|
etcd is now running and serving client requests. For more, please check out:
|
||||||
|
|
||||||
- [Interactive etcd playground](http://play.etcd.io)
|
* [Interactive etcd playground](http://play.etcd.io)
|
||||||
- [Animated quick demo](https://etcd.io/docs/latest/demo)
|
* [Animated quick demo](https://etcd.io/docs/latest/demo)
|
||||||
|
|
||||||
### etcd TCP ports
|
### etcd TCP ports
|
||||||
|
|
||||||
|
@ -116,13 +119,14 @@ go get go.etcd.io/etcd/client/v3
|
||||||
|
|
||||||
Now it's time to dig into the full etcd API and other guides.
|
Now it's time to dig into the full etcd API and other guides.
|
||||||
|
|
||||||
- Read the full [documentation][].
|
* Read the full [documentation].
|
||||||
- Explore the full gRPC [API][].
|
* Review etcd [frequently asked questions].
|
||||||
- Set up a [multi-machine cluster][clustering].
|
* Explore the full gRPC [API].
|
||||||
- Learn the [config format, env variables and flags][configuration].
|
* Set up a [multi-machine cluster][clustering].
|
||||||
- Find [language bindings and tools][integrations].
|
* Learn the [config format, env variables and flags][configuration].
|
||||||
- Use TLS to [secure an etcd cluster][security].
|
* Find [language bindings and tools][integrations].
|
||||||
- [Tune etcd][tuning].
|
* Use TLS to [secure an etcd cluster][security].
|
||||||
|
* [Tune etcd][tuning].
|
||||||
|
|
||||||
[documentation]: https://etcd.io/docs/latest
|
[documentation]: https://etcd.io/docs/latest
|
||||||
[api]: https://etcd.io/docs/latest/learning/api
|
[api]: https://etcd.io/docs/latest/learning/api
|
||||||
|
@ -134,9 +138,9 @@ Now it's time to dig into the full etcd API and other guides.
|
||||||
|
|
||||||
## Contact
|
## Contact
|
||||||
|
|
||||||
- Email: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
* 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/))
|
* 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](#community-meetings)
|
||||||
|
|
||||||
### Community meetings
|
### Community meetings
|
||||||
|
|
||||||
|
@ -163,7 +167,9 @@ Please refer to [community-membership.md](Documentation/contributor-guide/commun
|
||||||
|
|
||||||
## Reporting bugs
|
## 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.
|
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
|
||||||
|
|
||||||
## Reporting a security vulnerability
|
## Reporting a security vulnerability
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
|
|
||||||
_ "github.com/gogo/protobuf/gogoproto"
|
_ "github.com/gogo/protobuf/gogoproto"
|
||||||
proto "github.com/golang/protobuf/proto"
|
proto "github.com/golang/protobuf/proto"
|
||||||
|
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
|
||||||
authpb "go.etcd.io/etcd/api/v3/authpb"
|
authpb "go.etcd.io/etcd/api/v3/authpb"
|
||||||
mvccpb "go.etcd.io/etcd/api/v3/mvccpb"
|
mvccpb "go.etcd.io/etcd/api/v3/mvccpb"
|
||||||
_ "go.etcd.io/etcd/api/v3/versionpb"
|
_ "go.etcd.io/etcd/api/v3/versionpb"
|
||||||
|
@ -6185,284 +6186,287 @@ func init() {
|
||||||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
||||||
|
|
||||||
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
||||||
// 4424 bytes of a gzipped FileDescriptorProto
|
// 4478 bytes of a gzipped FileDescriptorProto
|
||||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0xdf, 0x6f, 0x1c, 0x49,
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0xdf, 0x6f, 0x1c, 0x49,
|
||||||
0x5a, 0xee, 0x19, 0xcf, 0x8c, 0xe7, 0x9b, 0xf1, 0x78, 0x5c, 0x71, 0xb2, 0x93, 0xd9, 0xc4, 0xf1,
|
0x5a, 0xee, 0x19, 0x7b, 0xc6, 0xf3, 0xcd, 0x78, 0x3c, 0xae, 0x38, 0xd9, 0xc9, 0x6c, 0xe2, 0x78,
|
||||||
0x76, 0x36, 0xbb, 0xd9, 0xec, 0xae, 0x9d, 0xd8, 0xc9, 0x2d, 0x04, 0xed, 0x72, 0x13, 0x7b, 0x36,
|
0x3b, 0x9b, 0xdd, 0x6c, 0x36, 0xf1, 0x24, 0x76, 0x72, 0x0b, 0x41, 0xbb, 0xdc, 0xc4, 0x9e, 0x4d,
|
||||||
0x31, 0x71, 0x6c, 0x5f, 0x7b, 0x92, 0xbd, 0x5d, 0xa4, 0x1b, 0xda, 0x33, 0x15, 0xbb, 0xcf, 0x33,
|
0x4c, 0x1c, 0xdb, 0xd7, 0x9e, 0x64, 0x6f, 0x83, 0x74, 0xa6, 0x3d, 0x53, 0x19, 0xf7, 0x79, 0xa6,
|
||||||
0xdd, 0x73, 0xdd, 0x3d, 0x8e, 0x7d, 0x3c, 0xdc, 0x71, 0x70, 0x9c, 0x0e, 0xa4, 0x93, 0x38, 0x24,
|
0x7b, 0xae, 0xbb, 0xed, 0xd8, 0xcb, 0xc3, 0x1d, 0x07, 0xc7, 0xe9, 0x40, 0x3a, 0x89, 0x45, 0x42,
|
||||||
0x74, 0x42, 0xf0, 0x82, 0x90, 0xe0, 0xe1, 0x40, 0xf0, 0xc0, 0x03, 0x02, 0x89, 0x07, 0x78, 0x80,
|
0x27, 0x04, 0x2f, 0x08, 0x09, 0x1e, 0x0e, 0x04, 0x0f, 0x3c, 0x20, 0x90, 0x78, 0x80, 0x07, 0x78,
|
||||||
0x07, 0x24, 0x24, 0xfe, 0x01, 0x58, 0xee, 0x89, 0x3f, 0x02, 0xa1, 0xfa, 0xd5, 0x55, 0xdd, 0x5d,
|
0x40, 0x42, 0xe2, 0x1f, 0x80, 0xe5, 0x9e, 0xf8, 0x23, 0x10, 0xaa, 0x5f, 0x5d, 0xd5, 0xdd, 0xd5,
|
||||||
0x6d, 0x7b, 0xcf, 0x5e, 0xdd, 0xcb, 0x66, 0xba, 0xea, 0xfb, 0x55, 0xdf, 0x57, 0xdf, 0xf7, 0x55,
|
0xb6, 0xf7, 0xec, 0xd5, 0xbd, 0xac, 0xa7, 0xab, 0xbe, 0x5f, 0xf5, 0x7d, 0xf5, 0x7d, 0x5f, 0xd5,
|
||||||
0x7d, 0x5f, 0x79, 0xa1, 0xec, 0x8f, 0x7a, 0x8b, 0x23, 0xdf, 0x0b, 0x3d, 0x54, 0xc5, 0x61, 0xaf,
|
0xf7, 0xd5, 0x06, 0x4a, 0xfe, 0xa8, 0xbb, 0x30, 0xf2, 0xbd, 0xd0, 0x43, 0x15, 0x1c, 0x76, 0x7b,
|
||||||
0x1f, 0x60, 0xff, 0x10, 0xfb, 0xa3, 0xdd, 0xe6, 0xdc, 0x9e, 0xb7, 0xe7, 0xd1, 0x89, 0x25, 0xf2,
|
0x01, 0xf6, 0x0f, 0xb0, 0x3f, 0xda, 0x69, 0xcc, 0xf6, 0xbd, 0xbe, 0x47, 0x27, 0x9a, 0xe4, 0x17,
|
||||||
0x8b, 0xc1, 0x34, 0x1b, 0x04, 0x66, 0xc9, 0x1e, 0x39, 0x4b, 0xc3, 0xc3, 0x5e, 0x6f, 0xb4, 0xbb,
|
0x83, 0x69, 0xd4, 0x09, 0x4c, 0xd3, 0x1e, 0x39, 0xcd, 0xe1, 0x41, 0xb7, 0x3b, 0xda, 0x69, 0xee,
|
||||||
0x74, 0x70, 0xc8, 0x67, 0x9a, 0xd1, 0x8c, 0x3d, 0x0e, 0xf7, 0x47, 0xbb, 0xf4, 0x1f, 0x3e, 0xb7,
|
0x1d, 0xf0, 0x99, 0x46, 0x34, 0x63, 0xef, 0x87, 0xbb, 0xa3, 0x1d, 0xfa, 0x87, 0xcf, 0xcd, 0x47,
|
||||||
0x10, 0xcd, 0x1d, 0x62, 0x3f, 0x70, 0x3c, 0x77, 0xb4, 0x2b, 0x7e, 0x71, 0x88, 0x6b, 0x7b, 0x9e,
|
0x73, 0x07, 0xd8, 0x0f, 0x1c, 0xcf, 0x1d, 0xed, 0x88, 0x5f, 0x1c, 0xe2, 0x4a, 0xdf, 0xf3, 0xfa,
|
||||||
0xb7, 0x37, 0xc0, 0x0c, 0xdf, 0x75, 0xbd, 0xd0, 0x0e, 0x1d, 0xcf, 0x0d, 0xd8, 0xac, 0xf9, 0x23,
|
0x03, 0xcc, 0xf0, 0x5d, 0xd7, 0x0b, 0xed, 0xd0, 0xf1, 0xdc, 0x80, 0xcf, 0xde, 0xa6, 0x7f, 0xba,
|
||||||
0x03, 0x6a, 0x16, 0x0e, 0x46, 0x9e, 0x1b, 0xe0, 0x27, 0xd8, 0xee, 0x63, 0x1f, 0x5d, 0x07, 0xe8,
|
0x77, 0xfa, 0xd8, 0xbd, 0x13, 0xbc, 0xb6, 0xfb, 0x7d, 0xec, 0x37, 0xbd, 0x11, 0x85, 0x48, 0x43,
|
||||||
0x0d, 0xc6, 0x41, 0x88, 0xfd, 0xae, 0xd3, 0x6f, 0x18, 0x0b, 0xc6, 0xed, 0x49, 0xab, 0xcc, 0x47,
|
0x9b, 0x3f, 0x36, 0xa0, 0x6a, 0xe1, 0x60, 0xe4, 0xb9, 0x01, 0x7e, 0x82, 0xed, 0x1e, 0xf6, 0xd1,
|
||||||
0xd6, 0xfb, 0xe8, 0x75, 0x28, 0x0f, 0xf1, 0x70, 0x97, 0xcd, 0xe6, 0xe8, 0xec, 0x14, 0x1b, 0x58,
|
0x55, 0x80, 0xee, 0x60, 0x3f, 0x08, 0xb1, 0xbf, 0xed, 0xf4, 0xea, 0xc6, 0xbc, 0x71, 0x73, 0xdc,
|
||||||
0xef, 0xa3, 0x26, 0x4c, 0xf9, 0xf8, 0xd0, 0x21, 0xec, 0x1b, 0xf9, 0x05, 0xe3, 0x76, 0xde, 0x8a,
|
0x2a, 0xf1, 0x91, 0xd5, 0x1e, 0x7a, 0x13, 0x4a, 0x43, 0x3c, 0xdc, 0x61, 0xb3, 0x39, 0x3a, 0x3b,
|
||||||
0xbe, 0x09, 0xa2, 0x6f, 0xbf, 0x0c, 0xbb, 0x21, 0xf6, 0x87, 0x8d, 0x49, 0x86, 0x48, 0x06, 0x3a,
|
0xc9, 0x06, 0x56, 0x7b, 0xa8, 0x01, 0x93, 0x3e, 0x3e, 0x70, 0x88, 0xb0, 0xf5, 0xfc, 0xbc, 0x71,
|
||||||
0xd8, 0x1f, 0x3e, 0x2c, 0x7d, 0xef, 0xef, 0x1a, 0xf9, 0x95, 0xc5, 0xbb, 0xe6, 0x3f, 0x17, 0xa0,
|
0x33, 0x6f, 0x45, 0xdf, 0x04, 0xd1, 0xb7, 0x5f, 0x85, 0xdb, 0x21, 0xf6, 0x87, 0xf5, 0x71, 0x86,
|
||||||
0x6a, 0xd9, 0xee, 0x1e, 0xb6, 0xf0, 0xb7, 0xc6, 0x38, 0x08, 0x51, 0x1d, 0xf2, 0x07, 0xf8, 0x98,
|
0x48, 0x06, 0x3a, 0xd8, 0x1f, 0x3e, 0x2c, 0x7e, 0xff, 0xef, 0xea, 0xf9, 0xa5, 0x85, 0xbb, 0xe6,
|
||||||
0xca, 0x51, 0xb5, 0xc8, 0x4f, 0x46, 0xc8, 0xdd, 0xc3, 0x5d, 0xec, 0x32, 0x09, 0xaa, 0x84, 0x90,
|
0x3f, 0x4f, 0x40, 0xc5, 0xb2, 0xdd, 0x3e, 0xb6, 0xf0, 0x77, 0xf6, 0x71, 0x10, 0xa2, 0x1a, 0xe4,
|
||||||
0xbb, 0x87, 0xdb, 0x6e, 0x1f, 0xcd, 0x41, 0x61, 0xe0, 0x0c, 0x9d, 0x90, 0xb3, 0x67, 0x1f, 0x31,
|
0xf7, 0xf0, 0x11, 0x95, 0xa3, 0x62, 0x91, 0x9f, 0x8c, 0x90, 0xdb, 0xc7, 0xdb, 0xd8, 0x65, 0x12,
|
||||||
0xb9, 0x26, 0x13, 0x72, 0xad, 0x02, 0x04, 0x9e, 0x1f, 0x76, 0x3d, 0xbf, 0x8f, 0xfd, 0x46, 0x61,
|
0x54, 0x08, 0x21, 0xb7, 0x8f, 0xdb, 0x6e, 0x0f, 0xcd, 0xc2, 0xc4, 0xc0, 0x19, 0x3a, 0x21, 0x67,
|
||||||
0xc1, 0xb8, 0x5d, 0x5b, 0x7e, 0x73, 0x51, 0xb5, 0xd8, 0xa2, 0x2a, 0xd0, 0xe2, 0x8e, 0xe7, 0x87,
|
0xcf, 0x3e, 0x62, 0x72, 0x8d, 0x27, 0xe4, 0x5a, 0x06, 0x08, 0x3c, 0x3f, 0xdc, 0xf6, 0xfc, 0x1e,
|
||||||
0x5b, 0x04, 0xd6, 0x2a, 0x07, 0xe2, 0x27, 0xfa, 0x18, 0x2a, 0x94, 0x48, 0x68, 0xfb, 0x7b, 0x38,
|
0xf6, 0xeb, 0x13, 0xf3, 0xc6, 0xcd, 0xea, 0xe2, 0xdb, 0x0b, 0xaa, 0x7d, 0x17, 0x54, 0x81, 0x16,
|
||||||
0x6c, 0x14, 0x29, 0x95, 0x5b, 0xa7, 0x50, 0xe9, 0x50, 0x60, 0x8b, 0xb2, 0x67, 0xbf, 0x91, 0x09,
|
0xb6, 0x3c, 0x3f, 0xdc, 0x20, 0xb0, 0x56, 0x29, 0x10, 0x3f, 0xd1, 0xc7, 0x50, 0xa6, 0x44, 0x42,
|
||||||
0xd5, 0x00, 0xfb, 0x8e, 0x3d, 0x70, 0xbe, 0x6d, 0xef, 0x0e, 0x70, 0xa3, 0xb4, 0x60, 0xdc, 0x9e,
|
0xdb, 0xef, 0xe3, 0xb0, 0x5e, 0xa0, 0x54, 0x6e, 0x9c, 0x40, 0xa5, 0x43, 0x81, 0x2d, 0xca, 0x9e,
|
||||||
0xb2, 0x62, 0x63, 0x64, 0xfd, 0x07, 0xf8, 0x38, 0xe8, 0x7a, 0xee, 0xe0, 0xb8, 0x31, 0x45, 0x01,
|
0xfd, 0x46, 0x26, 0x54, 0x02, 0xec, 0x3b, 0xf6, 0xc0, 0xf9, 0xcc, 0xde, 0x19, 0xe0, 0x7a, 0x71,
|
||||||
0xa6, 0xc8, 0xc0, 0x96, 0x3b, 0x38, 0xa6, 0xd6, 0xf3, 0xc6, 0x6e, 0xc8, 0x66, 0xcb, 0x74, 0xb6,
|
0xde, 0xb8, 0x39, 0x69, 0xc5, 0xc6, 0xc8, 0xfa, 0xf7, 0xf0, 0x51, 0xb0, 0xed, 0xb9, 0x83, 0xa3,
|
||||||
0x4c, 0x47, 0xe8, 0xf4, 0x3d, 0xa8, 0x0f, 0x1d, 0xb7, 0x3b, 0xf4, 0xfa, 0xdd, 0x48, 0x21, 0x40,
|
0xfa, 0x24, 0x05, 0x98, 0x24, 0x03, 0x1b, 0xee, 0xe0, 0x88, 0x5a, 0xcf, 0xdb, 0x77, 0x43, 0x36,
|
||||||
0x14, 0xf2, 0xa8, 0xf4, 0x7b, 0xd4, 0x02, 0xf7, 0xac, 0xda, 0xd0, 0x71, 0x9f, 0x79, 0x7d, 0x4b,
|
0x5b, 0xa2, 0xb3, 0x25, 0x3a, 0x42, 0xa7, 0xef, 0x41, 0x6d, 0xe8, 0xb8, 0xdb, 0x43, 0xaf, 0xb7,
|
||||||
0xe8, 0x87, 0xa0, 0xd8, 0x47, 0x71, 0x94, 0x4a, 0x12, 0xc5, 0x3e, 0x52, 0x51, 0x3e, 0x80, 0x4b,
|
0x1d, 0x29, 0x04, 0x88, 0x42, 0x1e, 0x15, 0x7f, 0x8f, 0x5a, 0xe0, 0x9e, 0x55, 0x1d, 0x3a, 0xee,
|
||||||
0x84, 0x4b, 0xcf, 0xc7, 0x76, 0x88, 0x25, 0x56, 0x35, 0x8e, 0x35, 0x3b, 0x74, 0xdc, 0x55, 0x0a,
|
0x33, 0xaf, 0x67, 0x09, 0xfd, 0x10, 0x14, 0xfb, 0x30, 0x8e, 0x52, 0x4e, 0xa2, 0xd8, 0x87, 0x2a,
|
||||||
0x12, 0x43, 0xb4, 0x8f, 0x52, 0x88, 0xd3, 0x49, 0x44, 0xfb, 0x28, 0x8e, 0x68, 0x7e, 0x00, 0xe5,
|
0xca, 0x07, 0x70, 0x81, 0x70, 0xe9, 0xfa, 0xd8, 0x0e, 0xb1, 0xc4, 0xaa, 0xc4, 0xb1, 0x66, 0x86,
|
||||||
0xc8, 0x2e, 0x68, 0x0a, 0x26, 0x37, 0xb7, 0x36, 0xdb, 0xf5, 0x09, 0x04, 0x50, 0x6c, 0xed, 0xac,
|
0x8e, 0xbb, 0x4c, 0x41, 0x62, 0x88, 0xf6, 0x61, 0x0a, 0x71, 0x2a, 0x89, 0x68, 0x1f, 0xc6, 0x11,
|
||||||
0xb6, 0x37, 0xd7, 0xea, 0x06, 0xaa, 0x40, 0x69, 0xad, 0xcd, 0x3e, 0x72, 0xcd, 0xd2, 0x8f, 0xf9,
|
0xcd, 0x0f, 0xa0, 0x14, 0xd9, 0x05, 0x4d, 0xc2, 0xf8, 0xfa, 0xc6, 0x7a, 0xbb, 0x36, 0x86, 0x00,
|
||||||
0x7e, 0x7b, 0x0a, 0x20, 0x4d, 0x81, 0x4a, 0x90, 0x7f, 0xda, 0xfe, 0xb4, 0x3e, 0x41, 0x80, 0x5f,
|
0x0a, 0xad, 0xad, 0xe5, 0xf6, 0xfa, 0x4a, 0xcd, 0x40, 0x65, 0x28, 0xae, 0xb4, 0xd9, 0x47, 0xae,
|
||||||
0xb4, 0xad, 0x9d, 0xf5, 0xad, 0xcd, 0xba, 0x41, 0xa8, 0xac, 0x5a, 0xed, 0x56, 0xa7, 0x5d, 0xcf,
|
0x51, 0xfc, 0x9c, 0xef, 0xb7, 0xa7, 0x00, 0xd2, 0x14, 0xa8, 0x08, 0xf9, 0xa7, 0xed, 0x4f, 0x6b,
|
||||||
0x11, 0x88, 0x67, 0x5b, 0x6b, 0xf5, 0x3c, 0x2a, 0x43, 0xe1, 0x45, 0x6b, 0xe3, 0x79, 0xbb, 0x3e,
|
0x63, 0x04, 0xf8, 0x45, 0xdb, 0xda, 0x5a, 0xdd, 0x58, 0xaf, 0x19, 0x84, 0xca, 0xb2, 0xd5, 0x6e,
|
||||||
0x19, 0x11, 0x93, 0xbb, 0xf8, 0x4f, 0x0c, 0x98, 0xe6, 0xe6, 0x66, 0xbe, 0x85, 0xee, 0x43, 0x71,
|
0x75, 0xda, 0xb5, 0x1c, 0x81, 0x78, 0xb6, 0xb1, 0x52, 0xcb, 0xa3, 0x12, 0x4c, 0xbc, 0x68, 0xad,
|
||||||
0x9f, 0xfa, 0x17, 0xdd, 0xc9, 0x95, 0xe5, 0x6b, 0x89, 0xbd, 0x11, 0xf3, 0x41, 0x8b, 0xc3, 0x22,
|
0x3d, 0x6f, 0xd7, 0xc6, 0x23, 0x62, 0x72, 0x17, 0xff, 0x89, 0x01, 0x53, 0xdc, 0xdc, 0xcc, 0xb7,
|
||||||
0x13, 0xf2, 0x07, 0x87, 0x41, 0x23, 0xb7, 0x90, 0xbf, 0x5d, 0x59, 0xae, 0x2f, 0xb2, 0xc8, 0xb0,
|
0xd0, 0x7d, 0x28, 0xec, 0x52, 0xff, 0xa2, 0x3b, 0xb9, 0xbc, 0x78, 0x25, 0xb1, 0x37, 0x62, 0x3e,
|
||||||
0xf8, 0x14, 0x1f, 0xbf, 0xb0, 0x07, 0x63, 0x6c, 0x91, 0x49, 0x84, 0x60, 0x72, 0xe8, 0xf9, 0x98,
|
0x68, 0x71, 0x58, 0x64, 0x42, 0x7e, 0xef, 0x20, 0xa8, 0xe7, 0xe6, 0xf3, 0x37, 0xcb, 0x8b, 0xb5,
|
||||||
0x6e, 0xf8, 0x29, 0x8b, 0xfe, 0x26, 0x5e, 0x40, 0x6d, 0xce, 0x37, 0x3b, 0xfb, 0x90, 0xe2, 0xfd,
|
0x05, 0x16, 0x47, 0x16, 0x9e, 0xe2, 0xa3, 0x17, 0xf6, 0x60, 0x1f, 0x5b, 0x64, 0x12, 0x21, 0x18,
|
||||||
0xbb, 0x01, 0xb0, 0x3d, 0x0e, 0xb3, 0x5d, 0x6c, 0x0e, 0x0a, 0x87, 0x84, 0x03, 0x77, 0x2f, 0xf6,
|
0x1f, 0x7a, 0x3e, 0xa6, 0x1b, 0x7e, 0xd2, 0xa2, 0xbf, 0x89, 0x17, 0x50, 0x9b, 0xf3, 0xcd, 0xce,
|
||||||
0x41, 0x7d, 0x0b, 0xdb, 0x01, 0x8e, 0x7c, 0x8b, 0x7c, 0xa0, 0x05, 0x28, 0x8d, 0x7c, 0x7c, 0xd8,
|
0x3e, 0xa4, 0x78, 0xff, 0x6e, 0x00, 0x6c, 0xee, 0x87, 0xd9, 0x2e, 0x36, 0x0b, 0x13, 0x07, 0x84,
|
||||||
0x3d, 0x38, 0xa4, 0xdc, 0xa6, 0xa4, 0x9d, 0x8a, 0x64, 0xfc, 0xe9, 0x21, 0xba, 0x03, 0x55, 0x67,
|
0x03, 0x77, 0x2f, 0xf6, 0x41, 0x7d, 0x0b, 0xdb, 0x01, 0x8e, 0x7c, 0x8b, 0x7c, 0xa0, 0x79, 0x28,
|
||||||
0xcf, 0xf5, 0x7c, 0xdc, 0x65, 0x44, 0x0b, 0x2a, 0xd8, 0xb2, 0x55, 0x61, 0x93, 0x74, 0x49, 0x0a,
|
0x8e, 0x7c, 0x7c, 0xb0, 0xbd, 0x77, 0x40, 0xb9, 0x4d, 0x4a, 0x3b, 0x15, 0xc8, 0xf8, 0xd3, 0x03,
|
||||||
0x2c, 0x63, 0x55, 0xd4, 0xc2, 0x6e, 0x90, 0x39, 0xb9, 0x9e, 0xef, 0x1a, 0x50, 0xa1, 0xeb, 0x39,
|
0x74, 0x0b, 0x2a, 0x4e, 0xdf, 0xf5, 0x7c, 0xbc, 0xcd, 0x88, 0x4e, 0xa8, 0x60, 0x8b, 0x56, 0x99,
|
||||||
0x97, 0xb2, 0x97, 0xe5, 0x42, 0x72, 0x14, 0x2d, 0xa5, 0xf0, 0xd4, 0xd2, 0xa4, 0x08, 0x2e, 0xa0,
|
0x4d, 0xd2, 0x25, 0x29, 0xb0, 0x8c, 0x55, 0x41, 0x0b, 0xbb, 0x46, 0xe6, 0xe4, 0x7a, 0xbe, 0x67,
|
||||||
0x35, 0x3c, 0xc0, 0x21, 0x3e, 0x4f, 0xf0, 0x52, 0x54, 0x99, 0xd7, 0xaa, 0x52, 0xf2, 0xfb, 0x73,
|
0x40, 0x99, 0xae, 0xe7, 0x4c, 0xca, 0x5e, 0x94, 0x0b, 0xc9, 0x51, 0xb4, 0x94, 0xc2, 0x53, 0x4b,
|
||||||
0x03, 0x2e, 0xc5, 0x18, 0x9e, 0x6b, 0xe9, 0x0d, 0x28, 0xf5, 0x29, 0x31, 0x26, 0x53, 0xde, 0x12,
|
0x93, 0x22, 0xb8, 0x80, 0x56, 0xf0, 0x00, 0x87, 0xf8, 0x2c, 0xc1, 0x4b, 0x51, 0x65, 0x5e, 0xab,
|
||||||
0x9f, 0xe8, 0x3e, 0x4c, 0x71, 0x91, 0x82, 0x46, 0x5e, 0xbf, 0x0d, 0xa5, 0x94, 0x25, 0x26, 0x65,
|
0x4a, 0xc9, 0xef, 0xcf, 0x0d, 0xb8, 0x10, 0x63, 0x78, 0xa6, 0xa5, 0xd7, 0xa1, 0xd8, 0xa3, 0xc4,
|
||||||
0x20, 0xc5, 0xfc, 0x87, 0x1c, 0x94, 0xb9, 0x32, 0xb6, 0x46, 0xa8, 0x05, 0xd3, 0x3e, 0xfb, 0xe8,
|
0x98, 0x4c, 0x79, 0x4b, 0x7c, 0xa2, 0xfb, 0x30, 0xc9, 0x45, 0x0a, 0xea, 0x79, 0xfd, 0x36, 0x94,
|
||||||
0xd2, 0x35, 0x73, 0x19, 0x9b, 0xd9, 0x71, 0xf2, 0xc9, 0x84, 0x55, 0xe5, 0x28, 0x74, 0x18, 0xfd,
|
0x52, 0x16, 0x99, 0x94, 0x81, 0x14, 0xf3, 0x1f, 0x72, 0x50, 0xe2, 0xca, 0xd8, 0x18, 0xa1, 0x16,
|
||||||
0x0a, 0x54, 0x04, 0x89, 0xd1, 0x38, 0xe4, 0x86, 0x6a, 0xc4, 0x09, 0xc8, 0xad, 0xfd, 0x64, 0xc2,
|
0x4c, 0xf9, 0xec, 0x63, 0x9b, 0xae, 0x99, 0xcb, 0xd8, 0xc8, 0x8e, 0x93, 0x4f, 0xc6, 0xac, 0x0a,
|
||||||
0x02, 0x0e, 0xbe, 0x3d, 0x0e, 0x51, 0x07, 0xe6, 0x04, 0x32, 0x5b, 0x1f, 0x17, 0x23, 0x4f, 0xa9,
|
0x47, 0xa1, 0xc3, 0xe8, 0x57, 0xa0, 0x2c, 0x48, 0x8c, 0xf6, 0x43, 0x6e, 0xa8, 0x7a, 0x9c, 0x80,
|
||||||
0x2c, 0xc4, 0xa9, 0xa4, 0xcd, 0xf9, 0x64, 0xc2, 0x42, 0x1c, 0x5f, 0x99, 0x44, 0x6b, 0x52, 0xa4,
|
0xdc, 0xda, 0x4f, 0xc6, 0x2c, 0xe0, 0xe0, 0x9b, 0xfb, 0x21, 0xea, 0xc0, 0xac, 0x40, 0x66, 0xeb,
|
||||||
0xf0, 0x88, 0xe5, 0x97, 0x94, 0x48, 0x9d, 0x23, 0x97, 0x13, 0x11, 0xda, 0x5a, 0x51, 0x64, 0xeb,
|
0xe3, 0x62, 0xe4, 0x29, 0x95, 0xf9, 0x38, 0x95, 0xb4, 0x39, 0x9f, 0x8c, 0x59, 0x88, 0xe3, 0x2b,
|
||||||
0x1c, 0xb9, 0x91, 0xca, 0x1e, 0x95, 0xa1, 0xc4, 0x87, 0xcd, 0x7f, 0xcb, 0x01, 0x08, 0x8b, 0x6d,
|
0x93, 0x68, 0x45, 0x8a, 0x14, 0x1e, 0xb2, 0xfc, 0x92, 0x12, 0xa9, 0x73, 0xe8, 0x72, 0x22, 0x42,
|
||||||
0x8d, 0xd0, 0x1a, 0xd4, 0x7c, 0xfe, 0x15, 0xd3, 0xdf, 0xeb, 0x5a, 0xfd, 0x71, 0x43, 0x4f, 0x58,
|
0x5b, 0x4b, 0x8a, 0x6c, 0x9d, 0x43, 0x37, 0x52, 0xd9, 0xa3, 0x12, 0x14, 0xf9, 0xb0, 0xf9, 0x6f,
|
||||||
0xd3, 0x02, 0x89, 0x89, 0xfb, 0x11, 0x54, 0x23, 0x2a, 0x52, 0x85, 0x57, 0x35, 0x2a, 0x8c, 0x28,
|
0x39, 0x00, 0x61, 0xb1, 0x8d, 0x11, 0x5a, 0x81, 0xaa, 0xcf, 0xbf, 0x62, 0xfa, 0x7b, 0x53, 0xab,
|
||||||
0x54, 0x04, 0x02, 0x51, 0xe2, 0x27, 0x70, 0x39, 0xc2, 0xd7, 0x68, 0xf1, 0x8d, 0x13, 0xb4, 0x18,
|
0x3f, 0x6e, 0xe8, 0x31, 0x6b, 0x4a, 0x20, 0x31, 0x71, 0x3f, 0x82, 0x4a, 0x44, 0x45, 0xaa, 0xf0,
|
||||||
0x11, 0xbc, 0x24, 0x28, 0xa8, 0x7a, 0x7c, 0xac, 0x08, 0x26, 0x15, 0x79, 0x55, 0xa3, 0x48, 0x06,
|
0xb2, 0x46, 0x85, 0x11, 0x85, 0xb2, 0x40, 0x20, 0x4a, 0xfc, 0x04, 0x2e, 0x46, 0xf8, 0x1a, 0x2d,
|
||||||
0xa4, 0x6a, 0x32, 0x92, 0x30, 0xa6, 0x4a, 0x20, 0x69, 0x9f, 0x8d, 0x9b, 0x7f, 0x39, 0x09, 0xa5,
|
0xbe, 0x75, 0x8c, 0x16, 0x23, 0x82, 0x17, 0x04, 0x05, 0x55, 0x8f, 0x8f, 0x15, 0xc1, 0xa4, 0x22,
|
||||||
0x55, 0x6f, 0x38, 0xb2, 0x7d, 0xb2, 0x89, 0x8a, 0x3e, 0x0e, 0xc6, 0x83, 0x90, 0x2a, 0xb0, 0xb6,
|
0x2f, 0x6b, 0x14, 0xc9, 0x80, 0x54, 0x4d, 0x46, 0x12, 0xc6, 0x54, 0x09, 0x24, 0xed, 0xb3, 0x71,
|
||||||
0x7c, 0x33, 0xce, 0x83, 0x83, 0x89, 0x7f, 0x2d, 0x0a, 0x6a, 0x71, 0x14, 0x82, 0xcc, 0xb3, 0x7c,
|
0xf3, 0x2f, 0xc7, 0xa1, 0xb8, 0xec, 0x0d, 0x47, 0xb6, 0x4f, 0x36, 0x51, 0xc1, 0xc7, 0xc1, 0xfe,
|
||||||
0xee, 0x0c, 0xc8, 0x3c, 0xc7, 0x73, 0x14, 0x11, 0x10, 0xf2, 0x32, 0x20, 0x34, 0xa1, 0xc4, 0x0f,
|
0x20, 0xa4, 0x0a, 0xac, 0x2e, 0x5e, 0x8f, 0xf3, 0xe0, 0x60, 0xe2, 0xaf, 0x45, 0x41, 0x2d, 0x8e,
|
||||||
0x6c, 0x2c, 0x58, 0x3f, 0x99, 0xb0, 0xc4, 0x00, 0x7a, 0x07, 0x66, 0x92, 0xa9, 0xb0, 0xc0, 0x61,
|
0x42, 0x90, 0x79, 0x96, 0xcf, 0x9d, 0x02, 0x99, 0xe7, 0x78, 0x8e, 0x22, 0x02, 0x42, 0x5e, 0x06,
|
||||||
0x6a, 0xbd, 0x78, 0xe6, 0xbc, 0x09, 0xd5, 0x58, 0x86, 0x2e, 0x72, 0xb8, 0xca, 0x50, 0xc9, 0xcb,
|
0x84, 0x06, 0x14, 0xf9, 0xf1, 0x8e, 0x05, 0xeb, 0x27, 0x63, 0x96, 0x18, 0x40, 0xef, 0xc1, 0x74,
|
||||||
0x57, 0x44, 0x58, 0x27, 0xc7, 0x8a, 0xea, 0x93, 0x09, 0x11, 0xd8, 0x6f, 0x88, 0xc0, 0x3e, 0xa5,
|
0x32, 0x15, 0x4e, 0x70, 0x98, 0x6a, 0x37, 0x9e, 0x39, 0xaf, 0x43, 0x25, 0x96, 0xa1, 0x0b, 0x1c,
|
||||||
0x26, 0x5a, 0xa2, 0x57, 0x1e, 0xe3, 0xdf, 0x54, 0xa3, 0xd6, 0x57, 0x09, 0x72, 0x04, 0x24, 0xc3,
|
0xae, 0x3c, 0x54, 0xf2, 0xf2, 0x25, 0x11, 0xd6, 0xc9, 0xb1, 0xa2, 0xf2, 0x64, 0x4c, 0x04, 0xf6,
|
||||||
0x97, 0x69, 0xc1, 0x74, 0x4c, 0x65, 0x24, 0x47, 0xb6, 0xbf, 0xf6, 0xbc, 0xb5, 0xc1, 0x12, 0xea,
|
0x6b, 0x22, 0xb0, 0x4f, 0xaa, 0x89, 0x96, 0xe8, 0x95, 0xc7, 0xf8, 0xb7, 0xd5, 0xa8, 0xf5, 0x75,
|
||||||
0x63, 0x9a, 0x43, 0xad, 0xba, 0x41, 0x12, 0xf4, 0x46, 0x7b, 0x67, 0xa7, 0x9e, 0x43, 0x57, 0xa0,
|
0x82, 0x1c, 0x01, 0xc9, 0xf0, 0x65, 0x5a, 0x30, 0x15, 0x53, 0x19, 0xc9, 0x91, 0xed, 0x6f, 0x3c,
|
||||||
0xbc, 0xb9, 0xd5, 0xe9, 0x32, 0xa8, 0x7c, 0xb3, 0xf4, 0xc7, 0x2c, 0x92, 0xc8, 0xfc, 0xfc, 0x69,
|
0x6f, 0xad, 0xb1, 0x84, 0xfa, 0x98, 0xe6, 0x50, 0xab, 0x66, 0x90, 0x04, 0xbd, 0xd6, 0xde, 0xda,
|
||||||
0x44, 0x93, 0xa7, 0x68, 0x25, 0x33, 0x4f, 0x28, 0x99, 0xd9, 0x10, 0x99, 0x39, 0x27, 0x33, 0x73,
|
0xaa, 0xe5, 0xd0, 0x25, 0x28, 0xad, 0x6f, 0x74, 0xb6, 0x19, 0x54, 0xbe, 0x51, 0xfc, 0x63, 0x16,
|
||||||
0x1e, 0x21, 0x28, 0x6c, 0xb4, 0x5b, 0x3b, 0x34, 0x49, 0x33, 0xd2, 0x2b, 0xe9, 0x6c, 0xfd, 0xa8,
|
0x49, 0x64, 0x7e, 0xfe, 0x34, 0xa2, 0xc9, 0x53, 0xb4, 0x92, 0x99, 0xc7, 0x94, 0xcc, 0x6c, 0x88,
|
||||||
0x06, 0x55, 0x66, 0x9e, 0xee, 0xd8, 0x25, 0x87, 0x89, 0x9f, 0x1a, 0x00, 0xd2, 0x61, 0xd1, 0x12,
|
0xcc, 0x9c, 0x93, 0x99, 0x39, 0x8f, 0x10, 0x4c, 0xac, 0xb5, 0x5b, 0x5b, 0x34, 0x49, 0x33, 0xd2,
|
||||||
0x94, 0x7a, 0x4c, 0x84, 0x86, 0x41, 0x23, 0xe0, 0x65, 0xad, 0xc5, 0x2d, 0x01, 0x85, 0xee, 0x41,
|
0x4b, 0xe9, 0x6c, 0xfd, 0xa8, 0x0a, 0x15, 0x66, 0x9e, 0xed, 0x7d, 0x97, 0x1c, 0x26, 0x7e, 0x6a,
|
||||||
0x29, 0x18, 0xf7, 0x7a, 0x38, 0x10, 0x99, 0xfb, 0xb5, 0x64, 0x10, 0xe6, 0x01, 0xd1, 0x12, 0x70,
|
0x00, 0x48, 0x87, 0x45, 0x4d, 0x28, 0x76, 0x99, 0x08, 0x75, 0x83, 0x46, 0xc0, 0x8b, 0x5a, 0x8b,
|
||||||
0x04, 0xe5, 0xa5, 0xed, 0x0c, 0xc6, 0x34, 0x8f, 0x9f, 0x8c, 0xc2, 0xe1, 0x64, 0x8c, 0xfd, 0x33,
|
0x5b, 0x02, 0x0a, 0xdd, 0x83, 0x62, 0xb0, 0xdf, 0xed, 0xe2, 0x40, 0x64, 0xee, 0x37, 0x92, 0x41,
|
||||||
0x03, 0x2a, 0x8a, 0x5b, 0xfc, 0x9c, 0x29, 0xe0, 0x1a, 0x94, 0xa9, 0x30, 0xb8, 0xcf, 0x93, 0xc0,
|
0x98, 0x07, 0x44, 0x4b, 0xc0, 0x11, 0x94, 0x57, 0xb6, 0x33, 0xd8, 0xa7, 0x79, 0xfc, 0x78, 0x14,
|
||||||
0x94, 0x25, 0x07, 0xd0, 0x57, 0xa0, 0x2c, 0x3c, 0x49, 0xe4, 0x81, 0x86, 0x9e, 0xec, 0xd6, 0xc8,
|
0x0e, 0x27, 0x63, 0xec, 0x9f, 0x19, 0x50, 0x56, 0xdc, 0xe2, 0xe7, 0x4c, 0x01, 0x57, 0xa0, 0x44,
|
||||||
0x92, 0xa0, 0x52, 0xc8, 0x0e, 0xcc, 0x52, 0x3d, 0xf5, 0xc8, 0xed, 0x43, 0x68, 0x56, 0x3d, 0x96,
|
0x85, 0xc1, 0x3d, 0x9e, 0x04, 0x26, 0x2d, 0x39, 0x80, 0xbe, 0x06, 0x25, 0xe1, 0x49, 0x22, 0x0f,
|
||||||
0x1b, 0x89, 0x63, 0x79, 0x13, 0xa6, 0x46, 0xfb, 0xc7, 0x81, 0xd3, 0xb3, 0x07, 0x5c, 0x9c, 0xe8,
|
0xd4, 0xf5, 0x64, 0x37, 0x46, 0x96, 0x04, 0x95, 0x42, 0x76, 0x60, 0x86, 0xea, 0xa9, 0x4b, 0x6e,
|
||||||
0x5b, 0x52, 0xdd, 0x01, 0xa4, 0x52, 0x3d, 0x8f, 0x02, 0x24, 0xd1, 0x2b, 0x50, 0x79, 0x62, 0x07,
|
0x1f, 0x42, 0xb3, 0xea, 0xb1, 0xdc, 0x48, 0x1c, 0xcb, 0x1b, 0x30, 0x39, 0xda, 0x3d, 0x0a, 0x9c,
|
||||||
0xfb, 0x5c, 0x48, 0x39, 0x7e, 0x1f, 0xa6, 0xc9, 0xf8, 0xd3, 0x17, 0x67, 0x10, 0x5f, 0x60, 0xad,
|
0xae, 0x3d, 0xe0, 0xe2, 0x44, 0xdf, 0x92, 0xea, 0x16, 0x20, 0x95, 0xea, 0x59, 0x14, 0x20, 0x89,
|
||||||
0x98, 0xff, 0x68, 0x40, 0x4d, 0xa0, 0x9d, 0xcb, 0x40, 0x08, 0x26, 0xf7, 0xed, 0x60, 0x9f, 0x2a,
|
0x5e, 0x82, 0xf2, 0x13, 0x3b, 0xd8, 0xe5, 0x42, 0xca, 0xf1, 0xfb, 0x30, 0x45, 0xc6, 0x9f, 0xbe,
|
||||||
0x63, 0xda, 0xa2, 0xbf, 0xd1, 0x3b, 0x50, 0xef, 0xb1, 0xf5, 0x77, 0x13, 0xf7, 0xae, 0x19, 0x3e,
|
0x38, 0x85, 0xf8, 0x02, 0x6b, 0xc9, 0xfc, 0x47, 0x03, 0xaa, 0x02, 0xed, 0x4c, 0x06, 0x42, 0x30,
|
||||||
0x1e, 0xf9, 0xfe, 0x7b, 0x30, 0x4d, 0x50, 0xba, 0xf1, 0x7b, 0x90, 0x70, 0xe3, 0xaf, 0x58, 0xd5,
|
0xbe, 0x6b, 0x07, 0xbb, 0x54, 0x19, 0x53, 0x16, 0xfd, 0x8d, 0xde, 0x83, 0x5a, 0x97, 0xad, 0x7f,
|
||||||
0x7d, 0xba, 0xe6, 0xa4, 0xf8, 0x36, 0x54, 0x99, 0x32, 0x2e, 0x5a, 0x76, 0xa9, 0xd7, 0x26, 0xcc,
|
0x3b, 0x71, 0xef, 0x9a, 0xe6, 0xe3, 0x91, 0xef, 0xdf, 0x86, 0x29, 0x82, 0xb2, 0x1d, 0xbf, 0x07,
|
||||||
0xec, 0xb8, 0xf6, 0x28, 0xd8, 0xf7, 0xc2, 0x84, 0xce, 0x57, 0xcc, 0xbf, 0x35, 0xa0, 0x2e, 0x27,
|
0x09, 0x37, 0xfe, 0x9a, 0x55, 0xd9, 0xa5, 0x6b, 0x4e, 0x8a, 0x6f, 0x43, 0x85, 0x29, 0xe3, 0xbc,
|
||||||
0xcf, 0x25, 0xc3, 0xdb, 0x30, 0xe3, 0xe3, 0xa1, 0xed, 0xb8, 0x8e, 0xbb, 0xd7, 0xdd, 0x3d, 0x0e,
|
0x65, 0x97, 0x7a, 0x6d, 0xc0, 0xf4, 0x96, 0x6b, 0x8f, 0x82, 0x5d, 0x2f, 0x4c, 0xe8, 0x7c, 0xc9,
|
||||||
0x71, 0xc0, 0xaf, 0xaf, 0xb5, 0x68, 0xf8, 0x11, 0x19, 0x25, 0xc2, 0xee, 0x0e, 0xbc, 0x5d, 0x1e,
|
0xfc, 0x5b, 0x03, 0x6a, 0x72, 0xf2, 0x4c, 0x32, 0xbc, 0x0b, 0xd3, 0x3e, 0x1e, 0xda, 0x8e, 0xeb,
|
||||||
0xa4, 0xe9, 0x6f, 0xf4, 0x46, 0x3c, 0x4a, 0x97, 0xa5, 0xde, 0xc4, 0xb8, 0x94, 0xf9, 0x27, 0x39,
|
0xb8, 0xfd, 0xed, 0x9d, 0xa3, 0x10, 0x07, 0xfc, 0xfa, 0x5a, 0x8d, 0x86, 0x1f, 0x91, 0x51, 0x22,
|
||||||
0xa8, 0x7e, 0x62, 0x87, 0x3d, 0xb1, 0x83, 0xd0, 0x3a, 0xd4, 0xa2, 0x30, 0x4e, 0x47, 0xb8, 0xdc,
|
0xec, 0xce, 0xc0, 0xdb, 0xe1, 0x41, 0x9a, 0xfe, 0x46, 0x6f, 0xc5, 0xa3, 0x74, 0x49, 0xea, 0x4d,
|
||||||
0x89, 0x03, 0x07, 0xc5, 0x11, 0xf7, 0x1a, 0x71, 0xe0, 0x98, 0xee, 0xa9, 0x03, 0x94, 0x94, 0xed,
|
0x8c, 0x4b, 0x99, 0x7f, 0x92, 0x83, 0xca, 0x27, 0x76, 0xd8, 0x15, 0x3b, 0x08, 0xad, 0x42, 0x35,
|
||||||
0xf6, 0xf0, 0x20, 0x22, 0x95, 0xcb, 0x26, 0x45, 0x01, 0x55, 0x52, 0xea, 0x00, 0xfa, 0x3a, 0xd4,
|
0x0a, 0xe3, 0x74, 0x84, 0xcb, 0x9d, 0x38, 0x70, 0x50, 0x1c, 0x71, 0xaf, 0x11, 0x07, 0x8e, 0xa9,
|
||||||
0x47, 0xbe, 0xb7, 0xe7, 0xe3, 0x20, 0x88, 0x88, 0xb1, 0x14, 0x6e, 0x6a, 0x88, 0x6d, 0x73, 0xd0,
|
0xae, 0x3a, 0x40, 0x49, 0xd9, 0x6e, 0x17, 0x0f, 0x22, 0x52, 0xb9, 0x6c, 0x52, 0x14, 0x50, 0x25,
|
||||||
0xc4, 0x29, 0xe6, 0xfe, 0x93, 0x09, 0x6b, 0x66, 0x14, 0x9f, 0x93, 0x81, 0x75, 0x46, 0x9e, 0xf7,
|
0xa5, 0x0e, 0xa0, 0x6f, 0x42, 0x6d, 0xe4, 0x7b, 0x7d, 0x1f, 0x07, 0x41, 0x44, 0x8c, 0xa5, 0x70,
|
||||||
0x58, 0x64, 0xfd, 0x41, 0x1e, 0x50, 0x7a, 0x99, 0x5f, 0xf4, 0x98, 0x7c, 0x0b, 0x6a, 0x41, 0x68,
|
0x53, 0x43, 0x6c, 0x93, 0x83, 0x26, 0x4e, 0x31, 0xf7, 0x9f, 0x8c, 0x59, 0xd3, 0xa3, 0xf8, 0x9c,
|
||||||
0xfb, 0xa9, 0x3d, 0x3f, 0x4d, 0x47, 0xa3, 0x1d, 0xff, 0x36, 0x44, 0x92, 0x75, 0x5d, 0x2f, 0x74,
|
0x0c, 0xac, 0xd3, 0xf2, 0xbc, 0xc7, 0x22, 0xeb, 0x0f, 0xf3, 0x80, 0xd2, 0xcb, 0xfc, 0xb2, 0xc7,
|
||||||
0x5e, 0x1e, 0xb3, 0x0b, 0x8a, 0x55, 0x13, 0xc3, 0x9b, 0x74, 0x14, 0x6d, 0x42, 0xe9, 0xa5, 0x33,
|
0xe4, 0x1b, 0x50, 0x0d, 0x42, 0xdb, 0x4f, 0xed, 0xf9, 0x29, 0x3a, 0x1a, 0xed, 0xf8, 0x77, 0x21,
|
||||||
0x08, 0xb1, 0x1f, 0x34, 0x0a, 0x0b, 0xf9, 0xdb, 0xb5, 0xe5, 0x77, 0x4f, 0x33, 0xcc, 0xe2, 0xc7,
|
0x92, 0x6c, 0xdb, 0xf5, 0x42, 0xe7, 0xd5, 0x11, 0xbb, 0xa0, 0x58, 0x55, 0x31, 0xbc, 0x4e, 0x47,
|
||||||
0x14, 0xbe, 0x73, 0x3c, 0x52, 0x4f, 0xbf, 0x9c, 0x88, 0x7a, 0x8c, 0x2f, 0xea, 0x6f, 0x44, 0x26,
|
0xd1, 0x3a, 0x14, 0x5f, 0x39, 0x83, 0x10, 0xfb, 0x41, 0x7d, 0x62, 0x3e, 0x7f, 0xb3, 0xba, 0xf8,
|
||||||
0x4c, 0xbd, 0x22, 0x44, 0xbb, 0x4e, 0x9f, 0xe6, 0xe2, 0xc8, 0x0f, 0xef, 0x5b, 0x25, 0x3a, 0xb1,
|
0xfe, 0x49, 0x86, 0x59, 0xf8, 0x98, 0xc2, 0x77, 0x8e, 0x46, 0xea, 0xe9, 0x97, 0x13, 0x51, 0x8f,
|
||||||
0xde, 0x47, 0x37, 0x61, 0xea, 0xa5, 0x6f, 0xef, 0x0d, 0xb1, 0x1b, 0xb2, 0x5b, 0xbe, 0x84, 0x89,
|
0xf1, 0x05, 0xfd, 0x8d, 0xc8, 0x84, 0xc9, 0xd7, 0x84, 0xe8, 0xb6, 0xd3, 0xa3, 0xb9, 0x38, 0xf2,
|
||||||
0x26, 0xcc, 0x45, 0x00, 0x29, 0x0a, 0xc9, 0x7c, 0x9b, 0x5b, 0xdb, 0xcf, 0x3b, 0xf5, 0x09, 0x54,
|
0xc3, 0xfb, 0x56, 0x91, 0x4e, 0xac, 0xf6, 0xd0, 0x75, 0x98, 0x7c, 0xe5, 0xdb, 0xfd, 0x21, 0x76,
|
||||||
0x85, 0xa9, 0xcd, 0xad, 0xb5, 0xf6, 0x46, 0x9b, 0xe4, 0x46, 0x91, 0xf3, 0xee, 0x49, 0xa7, 0x6b,
|
0x43, 0x76, 0xcb, 0x97, 0x30, 0xd1, 0x84, 0xb9, 0x00, 0x20, 0x45, 0x21, 0x99, 0x6f, 0x7d, 0x63,
|
||||||
0x09, 0x43, 0xc4, 0xf6, 0x84, 0x2a, 0x97, 0x11, 0xbf, 0x74, 0x0b, 0xb9, 0x04, 0x89, 0x7b, 0xe6,
|
0xf3, 0x79, 0xa7, 0x36, 0x86, 0x2a, 0x30, 0xb9, 0xbe, 0xb1, 0xd2, 0x5e, 0x6b, 0x93, 0xdc, 0x28,
|
||||||
0x0d, 0x98, 0xd3, 0x6d, 0x0d, 0x01, 0x70, 0xdf, 0xfc, 0x97, 0x1c, 0x4c, 0x73, 0x47, 0x38, 0x97,
|
0x72, 0xde, 0x3d, 0xe9, 0x74, 0x2d, 0x61, 0x88, 0xd8, 0x9e, 0x50, 0xe5, 0x32, 0xe2, 0x97, 0x6e,
|
||||||
0xe7, 0x5e, 0x55, 0xa4, 0xe2, 0xd7, 0x13, 0xa1, 0xa4, 0x06, 0x94, 0x98, 0x83, 0xf4, 0xf9, 0xfd,
|
0x21, 0x97, 0x20, 0x71, 0xcf, 0xbc, 0x06, 0xb3, 0xba, 0xad, 0x21, 0x00, 0xee, 0x9b, 0xff, 0x92,
|
||||||
0x57, 0x7c, 0x92, 0xe0, 0xcc, 0xf6, 0x3b, 0xee, 0x73, 0xb3, 0x47, 0xdf, 0xda, 0xb0, 0x59, 0xc8,
|
0x83, 0x29, 0xee, 0x08, 0x67, 0xf2, 0xdc, 0xcb, 0x8a, 0x54, 0xfc, 0x7a, 0x22, 0x94, 0x54, 0x87,
|
||||||
0x0c, 0x9b, 0x91, 0xc3, 0xd9, 0x01, 0x3f, 0x58, 0x95, 0xa5, 0x29, 0xaa, 0xc2, 0xa9, 0xc8, 0x64,
|
0x22, 0x73, 0x90, 0x1e, 0xbf, 0xff, 0x8a, 0x4f, 0x12, 0x9c, 0xd9, 0x7e, 0xc7, 0x3d, 0x6e, 0xf6,
|
||||||
0xcc, 0x66, 0xa5, 0x0c, 0x9b, 0xa1, 0x5b, 0x50, 0xc4, 0x87, 0xd8, 0x0d, 0x83, 0x46, 0x85, 0x26,
|
0xe8, 0x5b, 0x1b, 0x36, 0x27, 0x32, 0xc3, 0x66, 0xe4, 0x70, 0x76, 0xc0, 0x0f, 0x56, 0x25, 0x69,
|
||||||
0xd2, 0x69, 0x71, 0xa1, 0x6a, 0x93, 0x51, 0x8b, 0x4f, 0x4a, 0x53, 0x7d, 0x04, 0xb3, 0xf4, 0xbe,
|
0x8a, 0x8a, 0x70, 0x2a, 0x32, 0x19, 0xb3, 0x59, 0x31, 0xc3, 0x66, 0xe8, 0x06, 0x14, 0xf0, 0x01,
|
||||||
0xfb, 0xd8, 0xb7, 0x5d, 0xf5, 0xce, 0xde, 0xe9, 0x6c, 0xf0, 0xb4, 0x43, 0x7e, 0xa2, 0x1a, 0xe4,
|
0x76, 0xc3, 0xa0, 0x5e, 0xa6, 0x89, 0x74, 0x4a, 0x5c, 0xa8, 0xda, 0x64, 0xd4, 0xe2, 0x93, 0xd2,
|
||||||
0xd6, 0xd7, 0xb8, 0x7e, 0x72, 0xeb, 0x6b, 0x12, 0xff, 0xf7, 0x0d, 0x40, 0x2a, 0x81, 0x73, 0xd9,
|
0x54, 0x1f, 0xc1, 0x0c, 0xbd, 0xef, 0x3e, 0xf6, 0x6d, 0x57, 0xbd, 0xb3, 0x77, 0x3a, 0x6b, 0x3c,
|
||||||
0x22, 0xc1, 0x45, 0xc8, 0x91, 0x97, 0x72, 0xcc, 0x41, 0x01, 0xfb, 0xbe, 0xe7, 0xb3, 0x40, 0x69,
|
0xed, 0x90, 0x9f, 0xa8, 0x0a, 0xb9, 0xd5, 0x15, 0xae, 0x9f, 0xdc, 0xea, 0x8a, 0xc4, 0xff, 0x7d,
|
||||||
0xb1, 0x0f, 0x29, 0xcd, 0xfb, 0x5c, 0x18, 0x0b, 0x1f, 0x7a, 0x07, 0x51, 0x04, 0x60, 0x64, 0x8d,
|
0x03, 0x90, 0x4a, 0xe0, 0x4c, 0xb6, 0x48, 0x70, 0x11, 0x72, 0xe4, 0xa5, 0x1c, 0xb3, 0x30, 0x81,
|
||||||
0xb4, 0xf0, 0x1d, 0xb8, 0x14, 0x03, 0xbf, 0x98, 0x14, 0xbf, 0x05, 0x33, 0x94, 0xea, 0xea, 0x3e,
|
0x7d, 0xdf, 0xf3, 0x59, 0xa0, 0xb4, 0xd8, 0x87, 0x94, 0xe6, 0x0e, 0x17, 0xc6, 0xc2, 0x07, 0xde,
|
||||||
0xee, 0x1d, 0x8c, 0x3c, 0xc7, 0x4d, 0x49, 0x80, 0x6e, 0x92, 0xd8, 0x25, 0xd2, 0x05, 0x59, 0x22,
|
0x5e, 0x14, 0x01, 0x18, 0x59, 0x23, 0x2d, 0x7c, 0x07, 0x2e, 0xc4, 0xc0, 0xcf, 0x27, 0xc5, 0x6f,
|
||||||
0x5b, 0x73, 0x35, 0x1a, 0xec, 0x74, 0x36, 0xe4, 0x56, 0xdf, 0x85, 0x2b, 0x09, 0x82, 0x62, 0x65,
|
0xc0, 0x34, 0xa5, 0xba, 0xbc, 0x8b, 0xbb, 0x7b, 0x23, 0xcf, 0x71, 0x53, 0x12, 0xa0, 0xeb, 0x24,
|
||||||
0xbf, 0x0a, 0x95, 0x5e, 0x34, 0x18, 0xf0, 0x13, 0xe4, 0xf5, 0xb8, 0xb8, 0x49, 0x54, 0x15, 0x43,
|
0x76, 0x89, 0x74, 0x41, 0x96, 0xc8, 0xd6, 0x5c, 0x89, 0x06, 0x3b, 0x9d, 0x35, 0xb9, 0xd5, 0x77,
|
||||||
0xf2, 0xf8, 0x3a, 0xbc, 0x96, 0xe2, 0x71, 0x11, 0xea, 0xb8, 0x6f, 0xde, 0x85, 0xcb, 0x94, 0xf2,
|
0xe0, 0x52, 0x82, 0xa0, 0x58, 0xd9, 0xaf, 0x42, 0xb9, 0x1b, 0x0d, 0x06, 0xfc, 0x04, 0x79, 0x35,
|
||||||
0x53, 0x8c, 0x47, 0xad, 0x81, 0x73, 0x78, 0xba, 0x59, 0x8e, 0xf9, 0x7a, 0x15, 0x8c, 0x2f, 0x77,
|
0x2e, 0x6e, 0x12, 0x55, 0xc5, 0x90, 0x3c, 0xbe, 0x09, 0x6f, 0xa4, 0x78, 0x9c, 0x87, 0x3a, 0xee,
|
||||||
0x5b, 0x49, 0xd6, 0x6d, 0xce, 0xba, 0xe3, 0x0c, 0x71, 0xc7, 0xdb, 0xc8, 0x96, 0x96, 0x24, 0xf2,
|
0x9b, 0x77, 0xe1, 0x22, 0xa5, 0xfc, 0x14, 0xe3, 0x51, 0x6b, 0xe0, 0x1c, 0x9c, 0x6c, 0x96, 0x23,
|
||||||
0x03, 0x7c, 0x1c, 0xf0, 0xe3, 0x23, 0xfd, 0x2d, 0xa3, 0xd7, 0x5f, 0x1b, 0x5c, 0x9d, 0x2a, 0x9d,
|
0xbe, 0x5e, 0x05, 0xe3, 0xab, 0xdd, 0x56, 0x92, 0x75, 0x9b, 0xb3, 0xee, 0x38, 0x43, 0xdc, 0xf1,
|
||||||
0x2f, 0xd9, 0x35, 0xe6, 0x01, 0xf6, 0x88, 0x0f, 0xe2, 0x3e, 0x99, 0x60, 0xb5, 0x39, 0x65, 0x24,
|
0xd6, 0xb2, 0xa5, 0x25, 0x89, 0x7c, 0x0f, 0x1f, 0x05, 0xfc, 0xf8, 0x48, 0x7f, 0xcb, 0xe8, 0xf5,
|
||||||
0x12, 0x98, 0x64, 0xa1, 0x6a, 0x52, 0xe0, 0xeb, 0xdc, 0x71, 0xe8, 0x7f, 0x82, 0xd4, 0x49, 0xe9,
|
0xd7, 0x06, 0x57, 0xa7, 0x4a, 0xe7, 0x2b, 0x76, 0x8d, 0x39, 0x80, 0x3e, 0xf1, 0x41, 0xdc, 0x23,
|
||||||
0x2d, 0xa8, 0xd0, 0x99, 0x9d, 0xd0, 0x0e, 0xc7, 0x41, 0x96, 0xe5, 0x56, 0xcc, 0x1f, 0x18, 0xdc,
|
0x13, 0xac, 0x36, 0xa7, 0x8c, 0x44, 0x02, 0x93, 0x2c, 0x54, 0x49, 0x0a, 0x7c, 0x95, 0x3b, 0x0e,
|
||||||
0xa3, 0x04, 0x9d, 0x73, 0xad, 0xf9, 0x1e, 0x14, 0xe9, 0x0d, 0x51, 0xdc, 0x74, 0xae, 0x6a, 0x36,
|
0xfd, 0x4f, 0x90, 0x3a, 0x29, 0xbd, 0x03, 0x65, 0x3a, 0xb3, 0x15, 0xda, 0xe1, 0x7e, 0x90, 0x65,
|
||||||
0x36, 0x93, 0xc8, 0xe2, 0x80, 0xca, 0x39, 0xc9, 0x80, 0xe2, 0x33, 0xda, 0x39, 0x50, 0xa4, 0x9d,
|
0xb9, 0x25, 0xf3, 0x87, 0x06, 0xf7, 0x28, 0x41, 0xe7, 0x4c, 0x6b, 0xbe, 0x07, 0x05, 0x7a, 0x43,
|
||||||
0x14, 0x96, 0x73, 0xed, 0x21, 0x2b, 0x3f, 0x96, 0x2d, 0xfa, 0x9b, 0x5e, 0x08, 0x30, 0xf6, 0x9f,
|
0x14, 0x37, 0x9d, 0xcb, 0x9a, 0x8d, 0xcd, 0x24, 0xb2, 0x38, 0xa0, 0x72, 0x4e, 0x32, 0xa0, 0xf0,
|
||||||
0x5b, 0x1b, 0xec, 0x06, 0x52, 0xb6, 0xa2, 0x6f, 0xa2, 0xd8, 0xde, 0xc0, 0xc1, 0x6e, 0x48, 0x67,
|
0x8c, 0x76, 0x0e, 0x14, 0x69, 0xc7, 0x85, 0xe5, 0x5c, 0x7b, 0xc8, 0xca, 0x8f, 0x25, 0x8b, 0xfe,
|
||||||
0x27, 0xe9, 0xac, 0x32, 0x82, 0x6e, 0x41, 0xd9, 0x09, 0x36, 0xb0, 0xed, 0xbb, 0xbc, 0xc4, 0xaf,
|
0xa6, 0x17, 0x02, 0x8c, 0xfd, 0xe7, 0xd6, 0x1a, 0xbb, 0x81, 0x94, 0xac, 0xe8, 0x9b, 0x28, 0xb6,
|
||||||
0x04, 0x66, 0x39, 0x23, 0xf7, 0xd8, 0x37, 0xa0, 0xce, 0x24, 0x6b, 0xf5, 0xfb, 0xca, 0x69, 0x3f,
|
0x3b, 0x70, 0xb0, 0x1b, 0xd2, 0xd9, 0x71, 0x3a, 0xab, 0x8c, 0xa0, 0x1b, 0x50, 0x72, 0x82, 0x35,
|
||||||
0xe2, 0x6f, 0x24, 0xf8, 0xc7, 0xe8, 0xe7, 0x4e, 0xa7, 0xff, 0x37, 0x06, 0xcc, 0x2a, 0x0c, 0xce,
|
0x6c, 0xfb, 0x2e, 0x2f, 0xf1, 0x2b, 0x81, 0x59, 0xce, 0xc8, 0x3d, 0xf6, 0x2d, 0xa8, 0x31, 0xc9,
|
||||||
0x65, 0x82, 0xf7, 0xa0, 0xc8, 0xfa, 0x2f, 0xfc, 0x28, 0x38, 0x17, 0xc7, 0x62, 0x6c, 0x2c, 0x0e,
|
0x5a, 0xbd, 0x9e, 0x72, 0xda, 0x8f, 0xf8, 0x1b, 0x09, 0xfe, 0x31, 0xfa, 0xb9, 0x93, 0xe9, 0xff,
|
||||||
0x83, 0x16, 0xa1, 0xc4, 0x7e, 0x89, 0x6b, 0x9c, 0x1e, 0x5c, 0x00, 0x49, 0x91, 0x17, 0xe1, 0x12,
|
0x8d, 0x01, 0x33, 0x0a, 0x83, 0x33, 0x99, 0xe0, 0x36, 0x14, 0x58, 0xff, 0x85, 0x1f, 0x05, 0x67,
|
||||||
0x9f, 0xc3, 0x43, 0x4f, 0xe7, 0x73, 0x93, 0xf1, 0x08, 0xf1, 0x7d, 0x03, 0xe6, 0xe2, 0x08, 0xe7,
|
0xe3, 0x58, 0x8c, 0x8d, 0xc5, 0x61, 0xd0, 0x02, 0x14, 0xd9, 0x2f, 0x71, 0x8d, 0xd3, 0x83, 0x0b,
|
||||||
0x5a, 0xa5, 0x22, 0x77, 0xee, 0x0b, 0xc9, 0xfd, 0x6b, 0x42, 0xee, 0xe7, 0xa3, 0xbe, 0x72, 0xe4,
|
0x20, 0x29, 0xf2, 0x02, 0x5c, 0xe0, 0x73, 0x78, 0xe8, 0xe9, 0x7c, 0x6e, 0x3c, 0x1e, 0x21, 0x7e,
|
||||||
0x4c, 0xee, 0x38, 0xd5, 0xba, 0xb9, 0xb8, 0x75, 0x25, 0xad, 0x1f, 0x45, 0x6b, 0x12, 0xc4, 0xce,
|
0x60, 0xc0, 0x6c, 0x1c, 0xe1, 0x4c, 0xab, 0x54, 0xe4, 0xce, 0x7d, 0x29, 0xb9, 0x7f, 0x4d, 0xc8,
|
||||||
0xb5, 0xa6, 0x0f, 0xce, 0xb4, 0x26, 0xe5, 0x08, 0x96, 0x5a, 0xdc, 0xba, 0xd8, 0x46, 0x1b, 0x4e,
|
0xfd, 0x7c, 0xd4, 0x53, 0x8e, 0x9c, 0xc9, 0x1d, 0xa7, 0x5a, 0x37, 0x17, 0xb7, 0xae, 0xa4, 0xf5,
|
||||||
0x10, 0x65, 0x9c, 0x77, 0xa1, 0x3a, 0x70, 0x5c, 0x6c, 0xfb, 0xbc, 0x87, 0x64, 0xa8, 0xfb, 0xf1,
|
0xe3, 0x68, 0x4d, 0x82, 0xd8, 0x99, 0xd6, 0xf4, 0xc1, 0xa9, 0xd6, 0xa4, 0x1c, 0xc1, 0x52, 0x8b,
|
||||||
0x81, 0x15, 0x9b, 0x94, 0xa4, 0x7e, 0xdb, 0x00, 0xa4, 0xd2, 0xfa, 0xc5, 0x58, 0x6b, 0x49, 0x28,
|
0x5b, 0x15, 0xdb, 0x68, 0xcd, 0x09, 0xa2, 0x8c, 0xf3, 0x3e, 0x54, 0x06, 0x8e, 0x8b, 0x6d, 0x9f,
|
||||||
0x78, 0xdb, 0xf7, 0x86, 0x5e, 0x78, 0xda, 0x36, 0xbb, 0x6f, 0xfe, 0xae, 0x01, 0x97, 0x13, 0x18,
|
0xf7, 0x90, 0x0c, 0x75, 0x3f, 0x3e, 0xb0, 0x62, 0x93, 0x92, 0xd4, 0x6f, 0x1b, 0x80, 0x54, 0x5a,
|
||||||
0xbf, 0x08, 0xc9, 0xef, 0x9b, 0xd7, 0x60, 0x76, 0x0d, 0x8b, 0x33, 0x5e, 0xaa, 0x76, 0xb0, 0x03,
|
0xbf, 0x18, 0x6b, 0x35, 0x85, 0x82, 0x37, 0x7d, 0x6f, 0xe8, 0x85, 0x27, 0x6d, 0xb3, 0xfb, 0xe6,
|
||||||
0x48, 0x9d, 0xbd, 0x98, 0x53, 0xcc, 0x2f, 0xc1, 0xec, 0x33, 0xef, 0x90, 0x04, 0x72, 0x32, 0x2d,
|
0xef, 0x1a, 0x70, 0x31, 0x81, 0xf1, 0x8b, 0x90, 0xfc, 0xbe, 0x79, 0x05, 0x66, 0x56, 0xb0, 0x38,
|
||||||
0xc3, 0x14, 0x2b, 0x66, 0x45, 0xfa, 0x8a, 0xbe, 0x65, 0xe8, 0xdd, 0x01, 0xa4, 0x62, 0x5e, 0x84,
|
0xe3, 0xa5, 0x6a, 0x07, 0x5b, 0x80, 0xd4, 0xd9, 0xf3, 0x39, 0xc5, 0xfc, 0x12, 0xcc, 0x3c, 0xf3,
|
||||||
0x38, 0x2b, 0xe6, 0x7f, 0x1b, 0x50, 0x6d, 0x0d, 0x6c, 0x7f, 0x28, 0x44, 0xf9, 0x08, 0x8a, 0xac,
|
0x0e, 0x48, 0x20, 0x27, 0xd3, 0x32, 0x4c, 0xb1, 0x62, 0x56, 0xa4, 0xaf, 0xe8, 0x5b, 0x86, 0xde,
|
||||||
0x32, 0xc3, 0xcb, 0xac, 0x6f, 0xc5, 0xe9, 0xa9, 0xb0, 0xec, 0xa3, 0xc5, 0xea, 0x38, 0x1c, 0x8b,
|
0x2d, 0x40, 0x2a, 0xe6, 0x79, 0x88, 0xb3, 0x64, 0xfe, 0xb7, 0x01, 0x95, 0xd6, 0xc0, 0xf6, 0x87,
|
||||||
0x2c, 0x85, 0x77, 0x96, 0xd7, 0x12, 0x9d, 0xe6, 0x35, 0xf4, 0x3e, 0x14, 0x6c, 0x82, 0x42, 0xd3,
|
0x42, 0x94, 0x8f, 0xa0, 0xc0, 0x2a, 0x33, 0xbc, 0xcc, 0xfa, 0x4e, 0x9c, 0x9e, 0x0a, 0xcb, 0x3e,
|
||||||
0x6b, 0x2d, 0x59, 0x2e, 0xa3, 0xd4, 0xc8, 0x95, 0xc8, 0x62, 0x50, 0xe6, 0x87, 0x50, 0x51, 0x38,
|
0x5a, 0xac, 0x8e, 0xc3, 0xb1, 0xc8, 0x52, 0x78, 0x67, 0x79, 0x25, 0xd1, 0x69, 0x5e, 0x41, 0x77,
|
||||||
0xa0, 0x12, 0xe4, 0x1f, 0xb7, 0xf9, 0x35, 0xa9, 0xb5, 0xda, 0x59, 0x7f, 0xc1, 0x4a, 0x88, 0x35,
|
0x60, 0xc2, 0x26, 0x28, 0x34, 0xbd, 0x56, 0x93, 0xe5, 0x32, 0x4a, 0x8d, 0x5c, 0x89, 0x2c, 0x06,
|
||||||
0x80, 0xb5, 0x76, 0xf4, 0x9d, 0xd3, 0x34, 0xf6, 0x6c, 0x4e, 0x87, 0xe7, 0x2d, 0x55, 0x42, 0x23,
|
0x65, 0x7e, 0x08, 0x65, 0x85, 0x03, 0x2a, 0x42, 0xfe, 0x71, 0x9b, 0x5f, 0x93, 0x5a, 0xcb, 0x9d,
|
||||||
0x4b, 0xc2, 0xdc, 0x59, 0x24, 0x94, 0x2c, 0x7e, 0xcb, 0x80, 0x69, 0xae, 0x9a, 0xf3, 0xa6, 0x66,
|
0xd5, 0x17, 0xac, 0x84, 0x58, 0x05, 0x58, 0x69, 0x47, 0xdf, 0x39, 0x4d, 0x63, 0xcf, 0xe6, 0x74,
|
||||||
0x4a, 0x39, 0x23, 0x35, 0x2b, 0xcb, 0xb0, 0x38, 0xa0, 0x94, 0xe1, 0x9f, 0x0c, 0xa8, 0xaf, 0x79,
|
0x78, 0xde, 0x52, 0x25, 0x34, 0xb2, 0x24, 0xcc, 0x9d, 0x46, 0x42, 0xc9, 0xe2, 0xb7, 0x0c, 0x98,
|
||||||
0xaf, 0xdc, 0x3d, 0xdf, 0xee, 0x47, 0x3e, 0xf8, 0x71, 0xc2, 0x9c, 0x8b, 0x89, 0x4a, 0x7f, 0x02,
|
0xe2, 0xaa, 0x39, 0x6b, 0x6a, 0xa6, 0x94, 0x33, 0x52, 0xb3, 0xb2, 0x0c, 0x8b, 0x03, 0x4a, 0x19,
|
||||||
0x5e, 0x0e, 0x24, 0xcc, 0xda, 0x90, 0xb5, 0x14, 0x96, 0xdf, 0xc5, 0xa7, 0xf9, 0x55, 0x98, 0x49,
|
0xfe, 0xc9, 0x80, 0xda, 0x8a, 0xf7, 0xda, 0xed, 0xfb, 0x76, 0x2f, 0xf2, 0xc1, 0x8f, 0x13, 0xe6,
|
||||||
0x20, 0x11, 0x03, 0xbd, 0x68, 0x6d, 0xac, 0xaf, 0x11, 0x83, 0xd0, 0x7a, 0x6f, 0x7b, 0xb3, 0xf5,
|
0x5c, 0x48, 0x54, 0xfa, 0x13, 0xf0, 0x72, 0x20, 0x61, 0xd6, 0xba, 0xac, 0xa5, 0xb0, 0xfc, 0x2e,
|
||||||
0x68, 0xa3, 0xcd, 0xbb, 0xb2, 0xad, 0xcd, 0xd5, 0xf6, 0x86, 0x34, 0xd4, 0x03, 0xb1, 0x82, 0x07,
|
0x3e, 0xcd, 0xaf, 0xc3, 0x74, 0x02, 0x89, 0x18, 0xe8, 0x45, 0x6b, 0x6d, 0x75, 0x85, 0x18, 0x84,
|
||||||
0xe6, 0x00, 0x66, 0x15, 0x81, 0xce, 0xdb, 0x1c, 0xd3, 0xcb, 0x2b, 0xb9, 0x35, 0x60, 0x9a, 0x9f,
|
0xd6, 0x7b, 0xdb, 0xeb, 0xad, 0x47, 0x6b, 0x6d, 0xde, 0x95, 0x6d, 0xad, 0x2f, 0xb7, 0xd7, 0xa4,
|
||||||
0x72, 0x92, 0x8e, 0xff, 0xd3, 0x3c, 0xd4, 0xc4, 0xd4, 0x97, 0x23, 0x05, 0xba, 0x02, 0xc5, 0xfe,
|
0xa1, 0x1e, 0x88, 0x15, 0x3c, 0x30, 0x07, 0x30, 0xa3, 0x08, 0x74, 0xd6, 0xe6, 0x98, 0x5e, 0x5e,
|
||||||
0xee, 0x8e, 0xf3, 0x6d, 0xd1, 0x97, 0xe5, 0x5f, 0x64, 0x7c, 0xc0, 0xf8, 0xb0, 0xd7, 0x16, 0xfc,
|
0xc9, 0xad, 0x0e, 0x53, 0xfc, 0x94, 0x93, 0x74, 0xfc, 0x9f, 0xe6, 0xa1, 0x2a, 0xa6, 0xbe, 0x1a,
|
||||||
0x0b, 0x5d, 0x63, 0x0f, 0x31, 0xd6, 0xdd, 0x3e, 0x3e, 0xa2, 0x87, 0xa1, 0x49, 0x4b, 0x0e, 0xd0,
|
0x29, 0xd0, 0x25, 0x28, 0xf4, 0x76, 0xb6, 0x9c, 0xcf, 0x44, 0x5f, 0x96, 0x7f, 0x91, 0xf1, 0x01,
|
||||||
0xa2, 0x26, 0x7f, 0x95, 0x41, 0xef, 0xba, 0xca, 0x2b, 0x0d, 0xb4, 0x02, 0x75, 0xf2, 0xbb, 0x35,
|
0xe3, 0xc3, 0x5e, 0x5b, 0xf0, 0x2f, 0x74, 0x85, 0x3d, 0xc4, 0x58, 0x75, 0x7b, 0xf8, 0x90, 0x1e,
|
||||||
0x1a, 0x0d, 0x1c, 0xdc, 0x67, 0x04, 0xc8, 0x35, 0x77, 0x52, 0x9e, 0x76, 0x52, 0x00, 0xe8, 0x06,
|
0x86, 0xc6, 0x2d, 0x39, 0x40, 0x8b, 0x9a, 0xfc, 0x55, 0x06, 0xbd, 0xeb, 0x2a, 0xaf, 0x34, 0xd0,
|
||||||
0x14, 0xe9, 0x15, 0x30, 0x68, 0x4c, 0x91, 0xbc, 0x2a, 0x41, 0xf9, 0x30, 0x7a, 0x07, 0x2a, 0x4c,
|
0x12, 0xd4, 0xc8, 0xef, 0xd6, 0x68, 0x34, 0x70, 0x70, 0x8f, 0x11, 0x20, 0xd7, 0xdc, 0x71, 0x79,
|
||||||
0xe2, 0x75, 0xf7, 0x79, 0x80, 0xe9, 0x9b, 0x05, 0xa5, 0x1e, 0xa2, 0xce, 0xc5, 0xcf, 0x59, 0x90,
|
0xda, 0x49, 0x01, 0xa0, 0x6b, 0x50, 0xa0, 0x57, 0xc0, 0xa0, 0x3e, 0x49, 0xf2, 0xaa, 0x04, 0xe5,
|
||||||
0x75, 0xce, 0x42, 0x4b, 0x50, 0x0b, 0x42, 0xcf, 0xb7, 0xf7, 0xf0, 0x0b, 0xae, 0xb2, 0x4a, 0xbc,
|
0xc3, 0xe8, 0x3d, 0x28, 0x33, 0x89, 0x57, 0xdd, 0xe7, 0x01, 0xa6, 0x6f, 0x16, 0x94, 0x7a, 0x88,
|
||||||
0x68, 0x97, 0x98, 0x96, 0xe6, 0xba, 0x06, 0xb3, 0xad, 0x71, 0xb8, 0xdf, 0x76, 0x49, 0x72, 0x4c,
|
0x3a, 0x17, 0x3f, 0x67, 0x41, 0xd6, 0x39, 0x0b, 0x35, 0xa1, 0x1a, 0x84, 0x9e, 0x6f, 0xf7, 0xf1,
|
||||||
0x19, 0xf3, 0x3a, 0x20, 0x32, 0xbb, 0xe6, 0x04, 0xda, 0x69, 0x8e, 0xac, 0xdd, 0x09, 0x0f, 0xcc,
|
0x0b, 0xae, 0xb2, 0x72, 0xbc, 0x68, 0x97, 0x98, 0x96, 0xe6, 0xba, 0x02, 0x33, 0xad, 0xfd, 0x70,
|
||||||
0x4d, 0xb8, 0x44, 0x66, 0xb1, 0x1b, 0x3a, 0x3d, 0xe5, 0x20, 0x22, 0x8e, 0xba, 0x46, 0xe2, 0xa8,
|
0xb7, 0xed, 0x92, 0xe4, 0x98, 0x32, 0xe6, 0x55, 0x40, 0x64, 0x76, 0xc5, 0x09, 0xb4, 0xd3, 0x1c,
|
||||||
0x6b, 0x07, 0xc1, 0x2b, 0xcf, 0xef, 0x73, 0x63, 0x47, 0xdf, 0x92, 0xdb, 0xdf, 0x1b, 0x4c, 0x9a,
|
0x59, 0xbb, 0x13, 0x1e, 0x98, 0xeb, 0x70, 0x81, 0xcc, 0x62, 0x37, 0x74, 0xba, 0xca, 0x41, 0x44,
|
||||||
0xe7, 0x41, 0xec, 0x98, 0xfa, 0x05, 0xe9, 0xa1, 0x5f, 0x86, 0x92, 0x37, 0xa2, 0x4f, 0x82, 0x78,
|
0x1c, 0x75, 0x8d, 0xc4, 0x51, 0xd7, 0x0e, 0x82, 0xd7, 0x9e, 0xdf, 0xe3, 0xc6, 0x8e, 0xbe, 0x25,
|
||||||
0xf5, 0xef, 0xca, 0x22, 0x7b, 0x66, 0xb4, 0xc8, 0x09, 0x6f, 0xb1, 0x59, 0xa5, 0x42, 0xc5, 0xe1,
|
0xb7, 0xbf, 0x37, 0x98, 0x34, 0xcf, 0x83, 0xd8, 0x31, 0xf5, 0x4b, 0xd2, 0x43, 0xbf, 0x0c, 0x45,
|
||||||
0x89, 0x9a, 0xf7, 0xed, 0x60, 0x1f, 0xf7, 0xb7, 0x05, 0xf1, 0x58, 0x6d, 0xf4, 0x81, 0x95, 0x98,
|
0xfe, 0x3c, 0x88, 0x57, 0xff, 0x2e, 0x2d, 0xb0, 0x47, 0x49, 0x0b, 0x9c, 0xf0, 0x06, 0x9b, 0x55,
|
||||||
0x96, 0xb2, 0xdf, 0x93, 0xa2, 0x3f, 0xc6, 0xe1, 0x09, 0xa2, 0xab, 0xd5, 0xf7, 0xcb, 0x02, 0x85,
|
0x2a, 0x54, 0x1c, 0x9e, 0xa8, 0x79, 0xd7, 0x0e, 0x76, 0x71, 0x6f, 0x53, 0x10, 0x8f, 0xd5, 0x46,
|
||||||
0x37, 0x0d, 0xcf, 0x82, 0xf5, 0x43, 0x03, 0xae, 0x0b, 0xb4, 0xd5, 0x7d, 0xdb, 0xdd, 0xc3, 0x42,
|
0x1f, 0x58, 0x89, 0x69, 0x29, 0xfb, 0x3d, 0x29, 0xfa, 0x63, 0x1c, 0x1e, 0x23, 0xba, 0x5a, 0x7d,
|
||||||
0x98, 0x9f, 0x57, 0x5f, 0xe9, 0x45, 0xe7, 0xcf, 0xb8, 0xe8, 0xa7, 0xd0, 0x88, 0x16, 0x4d, 0x2b,
|
0xbf, 0x28, 0x50, 0x78, 0xd3, 0xf0, 0x34, 0x58, 0x3f, 0x32, 0xe0, 0xaa, 0x40, 0x5b, 0xde, 0xb5,
|
||||||
0x31, 0xde, 0x40, 0x5d, 0xc4, 0x38, 0xe0, 0x11, 0xa1, 0x6c, 0xd1, 0xdf, 0x64, 0xcc, 0xf7, 0x06,
|
0xdd, 0x3e, 0x16, 0xc2, 0xfc, 0xbc, 0xfa, 0x4a, 0x2f, 0x3a, 0x7f, 0xca, 0x45, 0x3f, 0x85, 0x7a,
|
||||||
0xd1, 0x25, 0x88, 0xfc, 0x96, 0xc4, 0x36, 0xe0, 0xaa, 0x20, 0xc6, 0x4b, 0x23, 0x71, 0x6a, 0xa9,
|
0xb4, 0x68, 0x5a, 0x89, 0xf1, 0x06, 0xea, 0x22, 0xf6, 0x03, 0x1e, 0x11, 0x4a, 0x16, 0xfd, 0x4d,
|
||||||
0x35, 0x9d, 0x48, 0x8d, 0xdb, 0x83, 0xd0, 0x38, 0x79, 0x2b, 0x69, 0x51, 0xe2, 0x26, 0xa4, 0x5c,
|
0xc6, 0x7c, 0x6f, 0x10, 0x5d, 0x82, 0xc8, 0x6f, 0x49, 0x6c, 0x0d, 0x2e, 0x0b, 0x62, 0xbc, 0x34,
|
||||||
0x0c, 0x1d, 0x97, 0x79, 0xe6, 0x01, 0x44, 0x66, 0xe5, 0xbc, 0x9a, 0x9a, 0x27, 0x24, 0xb5, 0xf3,
|
0x12, 0xa7, 0x96, 0x5a, 0xd3, 0xb1, 0xd4, 0xb8, 0x3d, 0x08, 0x8d, 0xe3, 0xb7, 0x92, 0x16, 0x25,
|
||||||
0x7c, 0x0b, 0x90, 0xf9, 0xd4, 0x16, 0xc8, 0xe6, 0x8a, 0x61, 0x3e, 0x12, 0x94, 0xa8, 0x7d, 0x1b,
|
0x6e, 0x42, 0xca, 0xc5, 0xd0, 0x71, 0x99, 0x63, 0x1e, 0x40, 0x64, 0x56, 0xce, 0xab, 0xa9, 0x79,
|
||||||
0xfb, 0x43, 0x27, 0x08, 0x94, 0x36, 0x94, 0x4e, 0x5d, 0x6f, 0xc1, 0xe4, 0x08, 0xf3, 0xe4, 0x5d,
|
0x42, 0x52, 0x3b, 0xcf, 0xb7, 0x00, 0x99, 0x4f, 0x6d, 0x81, 0x6c, 0xae, 0x18, 0xe6, 0x22, 0x41,
|
||||||
0x59, 0x46, 0xc2, 0x27, 0x14, 0x64, 0x3a, 0x2f, 0xd9, 0x0c, 0xe1, 0x86, 0x60, 0xc3, 0x0c, 0xa2,
|
0x89, 0xda, 0x37, 0xb1, 0x3f, 0x74, 0x82, 0x40, 0x69, 0x43, 0xe9, 0xd4, 0xf5, 0x0e, 0x8c, 0x8f,
|
||||||
0xe5, 0x93, 0x14, 0x53, 0x94, 0xbe, 0x73, 0x19, 0xa5, 0xef, 0x7c, 0xbc, 0xf4, 0x1d, 0x3b, 0x50,
|
0x30, 0x4f, 0xde, 0xe5, 0x45, 0x24, 0x7c, 0x42, 0x41, 0xa6, 0xf3, 0x92, 0xcd, 0x10, 0xae, 0x09,
|
||||||
0xaa, 0x81, 0xea, 0x62, 0x0e, 0x94, 0x1d, 0x66, 0x80, 0x28, 0xbe, 0x5d, 0x0c, 0xd5, 0x3f, 0xe0,
|
0x36, 0xcc, 0x20, 0x5a, 0x3e, 0x49, 0x31, 0x45, 0xe9, 0x3b, 0x97, 0x51, 0xfa, 0xce, 0xc7, 0x4b,
|
||||||
0x81, 0xea, 0xa2, 0xd2, 0x20, 0xa6, 0x6b, 0x16, 0x4d, 0x4a, 0xf1, 0x89, 0x4c, 0xa8, 0x12, 0x23,
|
0xdf, 0xb1, 0x03, 0xa5, 0x1a, 0xa8, 0xce, 0xe7, 0x40, 0xd9, 0x61, 0x06, 0x88, 0xe2, 0xdb, 0xf9,
|
||||||
0x59, 0x6a, 0x4f, 0x60, 0xd2, 0x8a, 0x8d, 0xc9, 0x60, 0x7c, 0x00, 0x73, 0xf1, 0x60, 0x7c, 0x2e,
|
0x50, 0xfd, 0x03, 0x1e, 0xa8, 0xce, 0x2b, 0x0d, 0x62, 0xba, 0x66, 0xd1, 0xa4, 0x14, 0x9f, 0xc8,
|
||||||
0xa1, 0xe6, 0xa0, 0x10, 0x7a, 0x07, 0x58, 0x64, 0x66, 0xf6, 0x91, 0x52, 0x6b, 0x14, 0xa8, 0x2f,
|
0x84, 0x0a, 0x31, 0x92, 0xa5, 0xf6, 0x04, 0xc6, 0xad, 0xd8, 0x98, 0x0c, 0xc6, 0x7b, 0x30, 0x1b,
|
||||||
0x46, 0xad, 0xdf, 0x94, 0x54, 0xa9, 0x03, 0x9e, 0x77, 0x05, 0x64, 0x3b, 0x8a, 0xbb, 0x2f, 0xfb,
|
0x0f, 0xc6, 0x67, 0x12, 0x6a, 0x16, 0x26, 0x42, 0x6f, 0x0f, 0x8b, 0xcc, 0xcc, 0x3e, 0x52, 0x6a,
|
||||||
0x90, 0xbc, 0x3e, 0x81, 0x2b, 0xc9, 0xe0, 0x7b, 0x31, 0x8b, 0xe8, 0x32, 0xe7, 0xd4, 0x85, 0xe7,
|
0x8d, 0x02, 0xf5, 0xf9, 0xa8, 0xf5, 0xdb, 0x92, 0x2a, 0x75, 0xc0, 0xb3, 0xae, 0x80, 0x6c, 0x47,
|
||||||
0x8b, 0x61, 0xf0, 0x99, 0x8c, 0x93, 0x4a, 0xd0, 0xbd, 0x18, 0xda, 0xbf, 0x0e, 0x4d, 0x5d, 0x0c,
|
0x71, 0xf7, 0x65, 0x1f, 0x92, 0xd7, 0x27, 0x70, 0x29, 0x19, 0x7c, 0xcf, 0x67, 0x11, 0xdb, 0xcc,
|
||||||
0xbe, 0x50, 0x5f, 0x8c, 0x42, 0xf2, 0xc5, 0x50, 0xfd, 0xbe, 0x21, 0xc9, 0xaa, 0xbb, 0xe6, 0xc3,
|
0x39, 0x75, 0xe1, 0xf9, 0x7c, 0x18, 0xbc, 0x94, 0x71, 0x52, 0x09, 0xba, 0xe7, 0x43, 0xfb, 0xd7,
|
||||||
0x2f, 0x42, 0x56, 0xe4, 0xba, 0xbb, 0xd1, 0xf6, 0x59, 0x8a, 0xa2, 0x65, 0x5e, 0x1f, 0x2d, 0x25,
|
0xa1, 0xa1, 0x8b, 0xc1, 0xe7, 0xea, 0x8b, 0x51, 0x48, 0x3e, 0x1f, 0xaa, 0x3f, 0x30, 0x24, 0x59,
|
||||||
0x0a, 0x05, 0x14, 0xfe, 0x27, 0x43, 0xfd, 0x97, 0xb9, 0x7b, 0x39, 0x33, 0x99, 0x77, 0xce, 0xcb,
|
0x75, 0xd7, 0x7c, 0xf8, 0x65, 0xc8, 0x8a, 0x5c, 0x77, 0x37, 0xda, 0x3e, 0xcd, 0x28, 0x5a, 0xe6,
|
||||||
0x8c, 0xa4, 0xe7, 0x88, 0x19, 0xfd, 0x48, 0xb9, 0x8a, 0x9a, 0xa4, 0x2e, 0xc6, 0x74, 0xbf, 0x21,
|
0xf5, 0xd1, 0x52, 0xa2, 0x50, 0x40, 0xe1, 0x7f, 0x32, 0xd4, 0x7f, 0x95, 0xbb, 0x97, 0x33, 0x93,
|
||||||
0x13, 0x4c, 0x2a, 0x8f, 0x5d, 0x0c, 0x07, 0x1b, 0x16, 0xb2, 0x53, 0xd8, 0x85, 0xb0, 0xb8, 0xd3,
|
0x79, 0xe7, 0xac, 0xcc, 0x48, 0x7a, 0x8e, 0x98, 0xd1, 0x8f, 0x94, 0xab, 0xa8, 0x49, 0xea, 0x7c,
|
||||||
0x82, 0x72, 0x74, 0xf3, 0x55, 0xde, 0xe9, 0x56, 0xa0, 0xb4, 0xb9, 0xb5, 0xb3, 0xdd, 0x5a, 0x25,
|
0x4c, 0xf7, 0x1b, 0x32, 0xc1, 0xa4, 0xf2, 0xd8, 0xf9, 0x70, 0xb0, 0x61, 0x3e, 0x3b, 0x85, 0x9d,
|
||||||
0x17, 0xbb, 0x39, 0x28, 0xad, 0x6e, 0x59, 0xd6, 0xf3, 0xed, 0x0e, 0xb9, 0xd9, 0x25, 0x9f, 0xed,
|
0x0b, 0x8b, 0x5b, 0x2d, 0x28, 0x45, 0x37, 0x5f, 0xe5, 0x9d, 0x6e, 0x19, 0x8a, 0xeb, 0x1b, 0x5b,
|
||||||
0x2c, 0xff, 0x2c, 0x0f, 0xb9, 0xa7, 0x2f, 0xd0, 0xa7, 0x50, 0x60, 0xcf, 0xc6, 0x4e, 0x78, 0x3d,
|
0x9b, 0xad, 0x65, 0x72, 0xb1, 0x9b, 0x85, 0xe2, 0xf2, 0x86, 0x65, 0x3d, 0xdf, 0xec, 0x90, 0x9b,
|
||||||
0xd8, 0x3c, 0xe9, 0x65, 0x9c, 0xf9, 0xda, 0xf7, 0xfe, 0xf3, 0x67, 0x7f, 0x98, 0x9b, 0x35, 0xab,
|
0x5d, 0xf2, 0xd9, 0xce, 0xe2, 0xcf, 0xf2, 0x90, 0x7b, 0xfa, 0x02, 0x7d, 0x0a, 0x13, 0xec, 0xd9,
|
||||||
0x4b, 0x87, 0x2b, 0x4b, 0x07, 0x87, 0x4b, 0x34, 0xc9, 0x3e, 0x34, 0xee, 0xa0, 0xaf, 0x41, 0x7e,
|
0xd8, 0x31, 0xaf, 0x07, 0x1b, 0xc7, 0xbd, 0x8c, 0x33, 0xdf, 0xf8, 0xfe, 0x7f, 0xfe, 0xec, 0x0f,
|
||||||
0x7b, 0x1c, 0xa2, 0xcc, 0x57, 0x85, 0xcd, 0xec, 0xc7, 0x72, 0xe6, 0x65, 0x4a, 0x74, 0xc6, 0x04,
|
0x73, 0x33, 0x66, 0xa5, 0x79, 0xb0, 0xd4, 0xdc, 0x3b, 0x68, 0xd2, 0x24, 0xfb, 0xd0, 0xb8, 0x85,
|
||||||
0x4e, 0x74, 0x34, 0x0e, 0x09, 0xc9, 0x6f, 0x41, 0x45, 0x7d, 0xea, 0x76, 0xea, 0x53, 0xc3, 0xe6,
|
0xbe, 0x01, 0xf9, 0xcd, 0xfd, 0x10, 0x65, 0xbe, 0x2a, 0x6c, 0x64, 0x3f, 0x96, 0x33, 0x2f, 0x52,
|
||||||
0xe9, 0xcf, 0xe8, 0xcc, 0xeb, 0x94, 0xd5, 0x6b, 0x26, 0xe2, 0xac, 0xd8, 0x63, 0x3c, 0x75, 0x15,
|
0xa2, 0xd3, 0x26, 0x70, 0xa2, 0xa3, 0xfd, 0x90, 0x90, 0xfc, 0x0e, 0x94, 0xd5, 0xa7, 0x6e, 0x27,
|
||||||
0x9d, 0x23, 0x17, 0x65, 0x3e, 0x44, 0x6c, 0x66, 0xbf, 0xac, 0x4b, 0xad, 0x22, 0x3c, 0x72, 0x09,
|
0x3e, 0x35, 0x6c, 0x9c, 0xfc, 0x8c, 0xce, 0xbc, 0x4a, 0x59, 0xbd, 0x61, 0x22, 0xce, 0x8a, 0x3d,
|
||||||
0xc9, 0x6f, 0xf2, 0x27, 0x74, 0xbd, 0x10, 0xdd, 0xd0, 0xbc, 0x81, 0x52, 0xdf, 0xf6, 0x34, 0x17,
|
0xc6, 0x53, 0x57, 0xd1, 0x39, 0x74, 0x51, 0xe6, 0x43, 0xc4, 0x46, 0xf6, 0xcb, 0xba, 0xd4, 0x2a,
|
||||||
0xb2, 0x01, 0x38, 0x93, 0x6b, 0x94, 0xc9, 0x15, 0x73, 0x96, 0x33, 0xe9, 0x45, 0x20, 0x0f, 0x8d,
|
0xc2, 0x43, 0x97, 0x90, 0xfc, 0x36, 0x7f, 0x42, 0xd7, 0x0d, 0xd1, 0x35, 0xcd, 0x1b, 0x28, 0xf5,
|
||||||
0x3b, 0xcb, 0x3d, 0x28, 0xd0, 0xde, 0x31, 0xfa, 0x4c, 0xfc, 0x68, 0x6a, 0xba, 0xf2, 0x19, 0x86,
|
0x6d, 0x4f, 0x63, 0x3e, 0x1b, 0x80, 0x33, 0xb9, 0x42, 0x99, 0x5c, 0x32, 0x67, 0x38, 0x93, 0x6e,
|
||||||
0x8e, 0x75, 0x9d, 0xcd, 0x39, 0xca, 0xa8, 0x66, 0x96, 0x09, 0x23, 0xda, 0x39, 0x7e, 0x68, 0xdc,
|
0x04, 0xf2, 0xd0, 0xb8, 0xb5, 0xd8, 0x85, 0x09, 0xda, 0x3b, 0x46, 0x2f, 0xc5, 0x8f, 0x86, 0xa6,
|
||||||
0xb9, 0x6d, 0xdc, 0x35, 0x96, 0xff, 0xaa, 0x00, 0x05, 0xda, 0xa3, 0x40, 0x07, 0x00, 0xb2, 0x47,
|
0x2b, 0x9f, 0x61, 0xe8, 0x58, 0xd7, 0xd9, 0x9c, 0xa5, 0x8c, 0xaa, 0x66, 0x89, 0x30, 0xa2, 0x9d,
|
||||||
0x9a, 0x5c, 0x5d, 0xaa, 0xfd, 0x9a, 0x5c, 0x5d, 0xba, 0xbd, 0x6a, 0x36, 0x29, 0xd3, 0x39, 0x73,
|
0xe3, 0x87, 0xc6, 0xad, 0x9b, 0xc6, 0x5d, 0x63, 0xf1, 0xaf, 0x26, 0x60, 0x82, 0xf6, 0x28, 0xd0,
|
||||||
0x86, 0x30, 0xa5, 0xad, 0x8f, 0x25, 0xda, 0xe9, 0x21, 0x7a, 0xfc, 0xa1, 0xc1, 0x9b, 0x35, 0xcc,
|
0x1e, 0x80, 0xec, 0x91, 0x26, 0x57, 0x97, 0x6a, 0xbf, 0x26, 0x57, 0x97, 0x6e, 0xaf, 0x9a, 0x0d,
|
||||||
0xcd, 0x90, 0x8e, 0x5a, 0xac, 0x3f, 0x9a, 0xdc, 0x0e, 0x9a, 0x96, 0xa8, 0xf9, 0x80, 0x32, 0x5c,
|
0xca, 0x74, 0xd6, 0x9c, 0x26, 0x4c, 0x69, 0xeb, 0xa3, 0x49, 0x3b, 0x3d, 0x44, 0x8f, 0x3f, 0x32,
|
||||||
0x32, 0xeb, 0x92, 0xa1, 0x4f, 0x21, 0x1e, 0x1a, 0x77, 0x3e, 0x6b, 0x98, 0x97, 0xb8, 0x96, 0x13,
|
0x78, 0xb3, 0x86, 0xb9, 0x19, 0xd2, 0x51, 0x8b, 0xf5, 0x47, 0x93, 0xdb, 0x41, 0xd3, 0x12, 0x35,
|
||||||
0x33, 0xe8, 0x3b, 0x50, 0x8b, 0x77, 0xf2, 0xd0, 0x4d, 0x0d, 0xaf, 0x64, 0x67, 0xb0, 0xf9, 0xe6,
|
0x1f, 0x50, 0x86, 0x4d, 0xb3, 0x26, 0x19, 0xfa, 0x14, 0xe2, 0xa1, 0x71, 0xeb, 0x65, 0xdd, 0xbc,
|
||||||
0xc9, 0x40, 0x5c, 0xa6, 0x79, 0x2a, 0x13, 0x67, 0xce, 0x38, 0x1f, 0x60, 0x3c, 0xb2, 0x09, 0x10,
|
0xc0, 0xb5, 0x9c, 0x98, 0x41, 0xdf, 0x85, 0x6a, 0xbc, 0x93, 0x87, 0xae, 0x6b, 0x78, 0x25, 0x3b,
|
||||||
0xb7, 0x01, 0xfa, 0x53, 0x83, 0x37, 0x63, 0x65, 0x23, 0x0e, 0xe9, 0xa8, 0xa7, 0xfa, 0x7d, 0xcd,
|
0x83, 0x8d, 0xb7, 0x8f, 0x07, 0xe2, 0x32, 0xcd, 0x51, 0x99, 0x38, 0x73, 0xc6, 0x79, 0x0f, 0xe3,
|
||||||
0x5b, 0xa7, 0x40, 0x71, 0x21, 0x3e, 0xa4, 0x42, 0x7c, 0x60, 0xce, 0x49, 0x21, 0x42, 0x67, 0x88,
|
0x91, 0x4d, 0x80, 0xb8, 0x0d, 0xd0, 0x9f, 0x1a, 0xbc, 0x19, 0x2b, 0x1b, 0x71, 0x48, 0x47, 0x3d,
|
||||||
0x43, 0x8f, 0x4b, 0xf1, 0xd9, 0x35, 0xf3, 0xb5, 0x98, 0x72, 0x62, 0xb3, 0xd2, 0x58, 0xac, 0x61,
|
0xd5, 0xef, 0x6b, 0xdc, 0x38, 0x01, 0x8a, 0x0b, 0xf1, 0x21, 0x15, 0xe2, 0x03, 0x73, 0x56, 0x0a,
|
||||||
0xa6, 0x35, 0x56, 0xac, 0x27, 0xa7, 0x35, 0x56, 0xbc, 0xdb, 0xa6, 0x33, 0x16, 0x6f, 0x8f, 0x69,
|
0x11, 0x3a, 0x43, 0x1c, 0x7a, 0x5c, 0x8a, 0x97, 0x57, 0xcc, 0x37, 0x62, 0xca, 0x89, 0xcd, 0x4a,
|
||||||
0x8c, 0x15, 0xcd, 0x2c, 0xff, 0xef, 0x24, 0x94, 0x56, 0xd9, 0x9f, 0xe2, 0x20, 0x0f, 0xca, 0x51,
|
0x63, 0xb1, 0x86, 0x99, 0xd6, 0x58, 0xb1, 0x9e, 0x9c, 0xd6, 0x58, 0xf1, 0x6e, 0x9b, 0xce, 0x58,
|
||||||
0x0b, 0x09, 0xcd, 0xeb, 0xaa, 0xd4, 0xf2, 0x2a, 0xd7, 0xbc, 0x91, 0x39, 0xcf, 0x05, 0x7a, 0x83,
|
0xbc, 0x3d, 0xa6, 0x31, 0x56, 0x34, 0xb3, 0xf8, 0xbf, 0xe3, 0x50, 0x5c, 0x66, 0xff, 0x2b, 0x0e,
|
||||||
0x0a, 0xf4, 0xba, 0x79, 0x85, 0x70, 0xe6, 0x7f, 0xed, 0xb3, 0xc4, 0x6a, 0x99, 0x4b, 0x76, 0xbf,
|
0xf2, 0xa0, 0x14, 0xb5, 0x90, 0xd0, 0x9c, 0xae, 0x4a, 0x2d, 0xaf, 0x72, 0x8d, 0x6b, 0x99, 0xf3,
|
||||||
0x4f, 0x14, 0xf1, 0x9b, 0x50, 0x55, 0x1b, 0x3a, 0xe8, 0x0d, 0x6d, 0x65, 0x5c, 0xed, 0x0e, 0x35,
|
0x5c, 0xa0, 0xb7, 0xa8, 0x40, 0x6f, 0x9a, 0x97, 0x08, 0x67, 0xfe, 0x7f, 0xfb, 0x34, 0x59, 0x2d,
|
||||||
0xcd, 0x93, 0x40, 0x38, 0xe7, 0x37, 0x29, 0xe7, 0x79, 0xf3, 0xaa, 0x86, 0xb3, 0x4f, 0x41, 0x63,
|
0xb3, 0x69, 0xf7, 0x7a, 0x44, 0x11, 0xbf, 0x09, 0x15, 0xb5, 0xa1, 0x83, 0xde, 0xd2, 0x56, 0xc6,
|
||||||
0xcc, 0x59, 0xe7, 0x45, 0xcf, 0x3c, 0xd6, 0xe2, 0xd1, 0x33, 0x8f, 0x37, 0x6e, 0x4e, 0x64, 0x3e,
|
0xd5, 0xee, 0x50, 0xc3, 0x3c, 0x0e, 0x84, 0x73, 0x7e, 0x9b, 0x72, 0x9e, 0x33, 0x2f, 0x6b, 0x38,
|
||||||
0xa6, 0xa0, 0x84, 0x79, 0x00, 0x20, 0x5b, 0x23, 0x48, 0xab, 0x4b, 0xe5, 0xc2, 0x9a, 0x0c, 0x0e,
|
0xfb, 0x14, 0x34, 0xc6, 0x9c, 0x75, 0x5e, 0xf4, 0xcc, 0x63, 0x2d, 0x1e, 0x3d, 0xf3, 0x78, 0xe3,
|
||||||
0xe9, 0xae, 0x8a, 0x69, 0x52, 0xb6, 0x7c, 0xdf, 0x25, 0xd8, 0x0e, 0x9c, 0x20, 0x64, 0x8e, 0x39,
|
0xe6, 0x58, 0xe6, 0xfb, 0x14, 0x94, 0x30, 0x0f, 0x00, 0x64, 0x6b, 0x04, 0x69, 0x75, 0xa9, 0x5c,
|
||||||
0x1d, 0x6b, 0x6c, 0x20, 0xed, 0x7a, 0xe2, 0x7d, 0x92, 0xe6, 0xcd, 0x13, 0x61, 0x38, 0xf7, 0x5b,
|
0x58, 0x93, 0xc1, 0x21, 0xdd, 0x55, 0x31, 0x4d, 0xca, 0x96, 0xef, 0xbb, 0x04, 0xdb, 0x81, 0x13,
|
||||||
0x94, 0xfb, 0x0d, 0xb3, 0xa9, 0xe1, 0x3e, 0x62, 0xb0, 0x64, 0xb3, 0xfd, 0x5f, 0x11, 0x2a, 0xcf,
|
0x84, 0xcc, 0x31, 0xa7, 0x62, 0x8d, 0x0d, 0xa4, 0x5d, 0x4f, 0xbc, 0x4f, 0xd2, 0xb8, 0x7e, 0x2c,
|
||||||
0x6c, 0xc7, 0x0d, 0xb1, 0x6b, 0xbb, 0x3d, 0x8c, 0x76, 0xa1, 0x40, 0x73, 0x77, 0x32, 0x10, 0xab,
|
0x0c, 0xe7, 0x7e, 0x83, 0x72, 0xbf, 0x66, 0x36, 0x34, 0xdc, 0x47, 0x0c, 0x96, 0x6c, 0xb6, 0xff,
|
||||||
0x75, 0xfc, 0x64, 0x20, 0x8e, 0x15, 0xb2, 0xcd, 0x05, 0xca, 0xb8, 0x69, 0x5e, 0x26, 0x8c, 0x87,
|
0x2b, 0x40, 0xf9, 0x99, 0xed, 0xb8, 0x21, 0x76, 0x6d, 0xb7, 0x8b, 0xd1, 0x0e, 0x4c, 0xd0, 0xdc,
|
||||||
0x92, 0xf4, 0x12, 0x2b, 0x81, 0x1b, 0x77, 0xd0, 0x4b, 0x28, 0xf2, 0x06, 0x76, 0x82, 0x50, 0xac,
|
0x9d, 0x0c, 0xc4, 0x6a, 0x1d, 0x3f, 0x19, 0x88, 0x63, 0x85, 0x6c, 0x73, 0x9e, 0x32, 0x6e, 0x98,
|
||||||
0xa8, 0xd6, 0xbc, 0xa6, 0x9f, 0xd4, 0xed, 0x65, 0x95, 0x4d, 0x40, 0xe1, 0x08, 0x9f, 0x43, 0x00,
|
0x17, 0x09, 0xe3, 0xa1, 0x24, 0xdd, 0x64, 0x25, 0x70, 0xe3, 0x16, 0x7a, 0x05, 0x05, 0xde, 0xc0,
|
||||||
0xd9, 0x8f, 0x49, 0x5a, 0x34, 0xd5, 0xc7, 0x69, 0x2e, 0x64, 0x03, 0xe8, 0x74, 0xaa, 0xf2, 0xec,
|
0x4e, 0x10, 0x8a, 0x15, 0xd5, 0x1a, 0x57, 0xf4, 0x93, 0xba, 0xbd, 0xac, 0xb2, 0x09, 0x28, 0x1c,
|
||||||
0x47, 0xb0, 0x84, 0xef, 0x37, 0x60, 0xf2, 0x89, 0x1d, 0xec, 0xa3, 0x44, 0xee, 0x55, 0xde, 0x9b,
|
0xe1, 0x73, 0x00, 0x20, 0xfb, 0x31, 0x49, 0x8b, 0xa6, 0xfa, 0x38, 0x8d, 0xf9, 0x6c, 0x00, 0x9d,
|
||||||
0x36, 0x9b, 0xba, 0x29, 0xce, 0xe5, 0x06, 0xe5, 0x72, 0x95, 0x85, 0x32, 0x95, 0x0b, 0x7d, 0x51,
|
0x4e, 0x55, 0x9e, 0xbd, 0x08, 0x96, 0xf0, 0xfd, 0x16, 0x8c, 0x3f, 0xb1, 0x83, 0x5d, 0x94, 0xc8,
|
||||||
0x69, 0xdc, 0x41, 0x7d, 0x28, 0xb2, 0xc7, 0xa6, 0x49, 0xfd, 0xc5, 0x5e, 0xae, 0x26, 0xf5, 0x17,
|
0xbd, 0xca, 0x7b, 0xd3, 0x46, 0x43, 0x37, 0xc5, 0xb9, 0x5c, 0xa3, 0x5c, 0x2e, 0xb3, 0x50, 0xa6,
|
||||||
0x7f, 0x9f, 0x7a, 0x3a, 0x97, 0x11, 0x4c, 0x89, 0x47, 0x99, 0x28, 0xf1, 0x94, 0x25, 0xf1, 0x92,
|
0x72, 0xa1, 0x2f, 0x2a, 0x8d, 0x5b, 0xa8, 0x07, 0x05, 0xf6, 0xd8, 0x34, 0xa9, 0xbf, 0xd8, 0xcb,
|
||||||
0xb3, 0x39, 0x9f, 0x35, 0xcd, 0x79, 0xdd, 0xa4, 0xbc, 0xae, 0x9b, 0x8d, 0x94, 0xad, 0x38, 0xe4,
|
0xd5, 0xa4, 0xfe, 0xe2, 0xef, 0x53, 0x4f, 0xe6, 0x32, 0x82, 0x49, 0xf1, 0x28, 0x13, 0x25, 0x9e,
|
||||||
0x43, 0xe3, 0xce, 0x5d, 0x03, 0x7d, 0x07, 0x40, 0x36, 0xac, 0x52, 0x1e, 0x98, 0x6c, 0x82, 0xa5,
|
0xb2, 0x24, 0x5e, 0x72, 0x36, 0xe6, 0xb2, 0xa6, 0x39, 0xaf, 0xeb, 0x94, 0xd7, 0x55, 0xb3, 0x9e,
|
||||||
0x3c, 0x30, 0xd5, 0xeb, 0x32, 0x17, 0x29, 0xdf, 0xdb, 0xe6, 0xcd, 0x24, 0xdf, 0xd0, 0xb7, 0xdd,
|
0xb2, 0x15, 0x87, 0x7c, 0x68, 0xdc, 0xba, 0x6b, 0xa0, 0xef, 0x02, 0xc8, 0x86, 0x55, 0xca, 0x03,
|
||||||
0xe0, 0x25, 0xf6, 0xdf, 0x67, 0xd5, 0xf2, 0x60, 0xdf, 0x19, 0x91, 0x25, 0xfb, 0x50, 0x8e, 0xfa,
|
0x93, 0x4d, 0xb0, 0x94, 0x07, 0xa6, 0x7a, 0x5d, 0xe6, 0x02, 0xe5, 0x7b, 0xd3, 0xbc, 0x9e, 0xe4,
|
||||||
0x09, 0xc9, 0x68, 0x9b, 0xec, 0x7c, 0x24, 0xa3, 0x6d, 0xaa, 0x11, 0x11, 0x0f, 0x3b, 0xb1, 0xdd,
|
0x1b, 0xfa, 0xb6, 0x1b, 0xbc, 0xc2, 0xfe, 0x1d, 0x56, 0x2d, 0x0f, 0x76, 0x9d, 0x11, 0x59, 0xb2,
|
||||||
0x22, 0x40, 0x89, 0x03, 0xfe, 0x45, 0x1d, 0x26, 0xc9, 0x81, 0x9c, 0x1c, 0x4e, 0x64, 0xb1, 0x27,
|
0x0f, 0xa5, 0xa8, 0x9f, 0x90, 0x8c, 0xb6, 0xc9, 0xce, 0x47, 0x32, 0xda, 0xa6, 0x1a, 0x11, 0xf1,
|
||||||
0xb9, 0xfa, 0x54, 0xbd, 0x3a, 0xb9, 0xfa, 0x74, 0x9d, 0x28, 0x7e, 0x38, 0x21, 0x97, 0xb5, 0x25,
|
0xb0, 0x13, 0xdb, 0x2d, 0x02, 0x94, 0x38, 0xe0, 0x5f, 0xd4, 0x60, 0x9c, 0x1c, 0xc8, 0xc9, 0xe1,
|
||||||
0x56, 0x45, 0x21, 0x2b, 0xf5, 0xa0, 0xa2, 0x14, 0x81, 0x90, 0x86, 0x58, 0xbc, 0xfe, 0x9d, 0x4c,
|
0x44, 0x16, 0x7b, 0x92, 0xab, 0x4f, 0xd5, 0xab, 0x93, 0xab, 0x4f, 0xd7, 0x89, 0xe2, 0x87, 0x13,
|
||||||
0x77, 0x9a, 0x0a, 0x92, 0xf9, 0x3a, 0xe5, 0x77, 0x99, 0xa5, 0x3b, 0xca, 0xaf, 0xcf, 0x20, 0x08,
|
0x72, 0x59, 0x6b, 0xb2, 0x2a, 0x0a, 0x59, 0xa9, 0x07, 0x65, 0xa5, 0x08, 0x84, 0x34, 0xc4, 0xe2,
|
||||||
0x43, 0xbe, 0x3a, 0xee, 0xf7, 0x9a, 0xd5, 0xc5, 0x7d, 0x7f, 0x21, 0x1b, 0x20, 0x73, 0x75, 0xd2,
|
0xf5, 0xef, 0x64, 0xba, 0xd3, 0x54, 0x90, 0xcc, 0x37, 0x29, 0xbf, 0x8b, 0x2c, 0xdd, 0x51, 0x7e,
|
||||||
0xf1, 0x5f, 0x41, 0x55, 0x2d, 0xfc, 0x20, 0x8d, 0xf0, 0x89, 0x0a, 0x7d, 0x32, 0x8f, 0xe8, 0xea,
|
0x3d, 0x06, 0x41, 0x18, 0xf2, 0xd5, 0x71, 0xbf, 0xd7, 0xac, 0x2e, 0xee, 0xfb, 0xf3, 0xd9, 0x00,
|
||||||
0x46, 0xf1, 0xc8, 0x46, 0x59, 0xda, 0x0a, 0x18, 0x61, 0x3c, 0x80, 0x12, 0x2f, 0x00, 0xe9, 0x54,
|
0x99, 0xab, 0x93, 0x8e, 0xff, 0x1a, 0x2a, 0x6a, 0xe1, 0x07, 0x69, 0x84, 0x4f, 0x54, 0xe8, 0x93,
|
||||||
0x1a, 0x2f, 0xe2, 0xeb, 0x54, 0x9a, 0xa8, 0x1e, 0xc5, 0x4f, 0xcf, 0x94, 0x23, 0xb9, 0x88, 0x8a,
|
0x79, 0x44, 0x57, 0x37, 0x8a, 0x47, 0x36, 0xca, 0xd2, 0x56, 0xc0, 0x08, 0xe3, 0x01, 0x14, 0x79,
|
||||||
0x5c, 0xcd, 0xb9, 0x3d, 0xc6, 0x61, 0x16, 0x37, 0x59, 0xb4, 0xcd, 0xe2, 0xa6, 0xd4, 0x07, 0xb2,
|
0x01, 0x48, 0xa7, 0xd2, 0x78, 0x11, 0x5f, 0xa7, 0xd2, 0x44, 0xf5, 0x28, 0x7e, 0x7a, 0xa6, 0x1c,
|
||||||
0xb8, 0xed, 0xe1, 0x90, 0xc7, 0x03, 0x71, 0xb9, 0x46, 0x19, 0xc4, 0xd4, 0xfc, 0x68, 0x9e, 0x04,
|
0xc9, 0x45, 0x54, 0xe4, 0x6a, 0xce, 0xed, 0x31, 0x0e, 0xb3, 0xb8, 0xc9, 0xa2, 0x6d, 0x16, 0x37,
|
||||||
0xa2, 0xbb, 0xdc, 0x48, 0x86, 0x22, 0x39, 0x1e, 0x01, 0xc8, 0x62, 0x54, 0xf2, 0xc4, 0xaa, 0xed,
|
0xa5, 0x3e, 0x90, 0xc5, 0xad, 0x8f, 0x43, 0x1e, 0x0f, 0xc4, 0xe5, 0x1a, 0x65, 0x10, 0x53, 0xf3,
|
||||||
0x13, 0x24, 0x4f, 0xac, 0xfa, 0x7a, 0x56, 0x3c, 0xf6, 0x49, 0xbe, 0xec, 0x6e, 0x45, 0x38, 0xff,
|
0xa3, 0x79, 0x1c, 0x88, 0xee, 0x72, 0x23, 0x19, 0x8a, 0xe4, 0x78, 0x08, 0x20, 0x8b, 0x51, 0xc9,
|
||||||
0xd8, 0x00, 0x94, 0x2e, 0x57, 0xa1, 0x77, 0xf5, 0xd4, 0xb5, 0x3d, 0x87, 0xe6, 0x7b, 0x67, 0x03,
|
0x13, 0xab, 0xb6, 0x4f, 0x90, 0x3c, 0xb1, 0xea, 0xeb, 0x59, 0xf1, 0xd8, 0x27, 0xf9, 0xb2, 0xbb,
|
||||||
0xd6, 0xa5, 0x33, 0x29, 0x52, 0x8f, 0x42, 0x8f, 0x5e, 0x11, 0xa1, 0xbe, 0x6b, 0xc0, 0x74, 0xac,
|
0x15, 0xe1, 0xfc, 0xb9, 0x01, 0x28, 0x5d, 0xae, 0x42, 0xef, 0xeb, 0xa9, 0x6b, 0x7b, 0x0e, 0x8d,
|
||||||
0xc4, 0x85, 0xde, 0xca, 0xb0, 0x69, 0xa2, 0xf1, 0xd0, 0x7c, 0xfb, 0x54, 0x38, 0xdd, 0x51, 0x5e,
|
0xdb, 0xa7, 0x03, 0xd6, 0xa5, 0x33, 0x29, 0x52, 0x97, 0x42, 0x8f, 0x5e, 0x13, 0xa1, 0xbe, 0x67,
|
||||||
0xd9, 0x01, 0xe2, 0x4e, 0xf3, 0x3b, 0x06, 0xd4, 0xe2, 0x95, 0x30, 0x94, 0x41, 0x3b, 0xd5, 0xaf,
|
0xc0, 0x54, 0xac, 0xc4, 0x85, 0xde, 0xc9, 0xb0, 0x69, 0xa2, 0xf1, 0xd0, 0x78, 0xf7, 0x44, 0x38,
|
||||||
0x68, 0xde, 0x3e, 0x1d, 0xf0, 0x64, 0xf3, 0xc8, 0xeb, 0xcc, 0x00, 0x4a, 0xbc, 0x64, 0xa6, 0xdb,
|
0xdd, 0x51, 0x5e, 0xd9, 0x01, 0xe2, 0x4e, 0xf3, 0x3b, 0x06, 0x54, 0xe3, 0x95, 0x30, 0x94, 0x41,
|
||||||
0xf8, 0xf1, 0x06, 0x87, 0x6e, 0xe3, 0x27, 0xea, 0x6d, 0x9a, 0x8d, 0xef, 0x7b, 0x03, 0xac, 0xb8,
|
0x3b, 0xd5, 0xaf, 0x68, 0xdc, 0x3c, 0x19, 0xf0, 0x78, 0xf3, 0xc8, 0xeb, 0xcc, 0x00, 0x8a, 0xbc,
|
||||||
0x19, 0xaf, 0xa4, 0x65, 0x71, 0x3b, 0xd9, 0xcd, 0x12, 0x65, 0xb8, 0x2c, 0x6e, 0xd2, 0xcd, 0x44,
|
0x64, 0xa6, 0xdb, 0xf8, 0xf1, 0x06, 0x87, 0x6e, 0xe3, 0x27, 0xea, 0x6d, 0x9a, 0x8d, 0xef, 0x7b,
|
||||||
0xc1, 0x0c, 0x65, 0x10, 0x3b, 0xc5, 0xcd, 0x92, 0xf5, 0x36, 0x8d, 0x9b, 0x51, 0x86, 0x8a, 0x9b,
|
0x03, 0xac, 0xb8, 0x19, 0xaf, 0xa4, 0x65, 0x71, 0x3b, 0xde, 0xcd, 0x12, 0x65, 0xb8, 0x2c, 0x6e,
|
||||||
0xc9, 0x42, 0x96, 0xce, 0xcd, 0x52, 0xbd, 0x18, 0x9d, 0x9b, 0xa5, 0x6b, 0x61, 0x1a, 0x3b, 0x52,
|
0xd2, 0xcd, 0x44, 0xc1, 0x0c, 0x65, 0x10, 0x3b, 0xc1, 0xcd, 0x92, 0xf5, 0x36, 0x8d, 0x9b, 0x51,
|
||||||
0xbe, 0x31, 0x37, 0xbb, 0xa4, 0x29, 0x75, 0xa1, 0xf7, 0x32, 0x94, 0xa8, 0xed, 0xec, 0x34, 0xdf,
|
0x86, 0x8a, 0x9b, 0xc9, 0x42, 0x96, 0xce, 0xcd, 0x52, 0xbd, 0x18, 0x9d, 0x9b, 0xa5, 0x6b, 0x61,
|
||||||
0x3f, 0x23, 0x74, 0xe6, 0x1e, 0x67, 0xea, 0x17, 0x7b, 0xfc, 0x8f, 0x0c, 0x98, 0xd3, 0x55, 0xc7,
|
0x1a, 0x3b, 0x52, 0xbe, 0x31, 0x37, 0xbb, 0xa0, 0x29, 0x75, 0xa1, 0xdb, 0x19, 0x4a, 0xd4, 0x76,
|
||||||
0x50, 0x06, 0x9f, 0x8c, 0x46, 0x50, 0x73, 0xf1, 0xac, 0xe0, 0x27, 0x6b, 0x2b, 0xda, 0xf5, 0x8f,
|
0x76, 0x1a, 0x77, 0x4e, 0x09, 0x9d, 0xb9, 0xc7, 0x99, 0xfa, 0xc5, 0x1e, 0xff, 0x23, 0x03, 0x66,
|
||||||
0xea, 0xff, 0xfa, 0xf9, 0xbc, 0xf1, 0x1f, 0x9f, 0xcf, 0x1b, 0xff, 0xf5, 0xf9, 0xbc, 0xf1, 0x93,
|
0x75, 0xd5, 0x31, 0x94, 0xc1, 0x27, 0xa3, 0x11, 0xd4, 0x58, 0x38, 0x2d, 0xf8, 0xf1, 0xda, 0x8a,
|
||||||
0xff, 0x99, 0x9f, 0xd8, 0x2d, 0xd2, 0xff, 0xbf, 0xc3, 0xca, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff,
|
0x76, 0xfd, 0xa3, 0x47, 0x9f, 0xb7, 0x9a, 0x2f, 0xaf, 0xc1, 0x55, 0x28, 0xb4, 0x46, 0xce, 0x53,
|
||||||
0x48, 0x49, 0x02, 0x7c, 0x86, 0x42, 0x00, 0x00,
|
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reference imports to suppress errors if they are not otherwise used.
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
|
|
@ -8,10 +8,30 @@ import "etcd/api/versionpb/version.proto";
|
||||||
|
|
||||||
// for grpc-gateway
|
// for grpc-gateway
|
||||||
import "google/api/annotations.proto";
|
import "google/api/annotations.proto";
|
||||||
|
import "protoc-gen-swagger/options/annotations.proto";
|
||||||
|
|
||||||
option (gogoproto.marshaler_all) = true;
|
option (gogoproto.marshaler_all) = true;
|
||||||
option (gogoproto.unmarshaler_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 {
|
service KV {
|
||||||
// Range gets the keys in the range from the key-value store.
|
// Range gets the keys in the range from the key-value store.
|
||||||
rpc Range(RangeRequest) returns (RangeResponse) {
|
rpc Range(RangeRequest) returns (RangeResponse) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ require (
|
||||||
github.com/gogo/protobuf v1.3.2
|
github.com/gogo/protobuf v1.3.2
|
||||||
github.com/golang/protobuf v1.5.3
|
github.com/golang/protobuf v1.5.3
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1
|
||||||
google.golang.org/grpc v1.51.0
|
google.golang.org/grpc v1.51.0
|
||||||
)
|
)
|
||||||
|
@ -15,9 +15,9 @@ require (
|
||||||
require (
|
require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
21
api/go.sum
21
api/go.sum
|
@ -58,13 +58,9 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
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/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/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
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.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
|
@ -88,8 +84,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
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=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -106,14 +102,14 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
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-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-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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
@ -162,7 +158,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.v3 v3.0.1/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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|
|
@ -12,7 +12,7 @@ require (
|
||||||
github.com/coreos/go-semver v0.3.1 // indirect
|
github.com/coreos/go-semver v0.3.1 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/stretchr/testify v1.8.2 // indirect
|
github.com/stretchr/testify v1.8.4 // indirect
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
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/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
|
||||||
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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||||
|
@ -10,17 +9,11 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
|
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
|
||||||
|
|
|
@ -4,9 +4,9 @@ go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
go.uber.org/zap v1.24.0
|
go.uber.org/zap v1.24.0
|
||||||
golang.org/x/sys v0.7.0
|
golang.org/x/sys v0.9.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|
|
@ -10,13 +10,9 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
|
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
|
||||||
|
@ -24,10 +20,9 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
||||||
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
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/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ID represents a generic identifier which is canonically
|
// ID represents a generic identifier which is canonically
|
||||||
|
@ -42,7 +42,7 @@ func (p IDSlice) Less(i, j int) bool { return uint64(p[i]) < uint64(p[j]) }
|
||||||
func (p IDSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
func (p IDSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||||
|
|
||||||
func (p IDSlice) String() string {
|
func (p IDSlice) String() string {
|
||||||
var b bytes.Buffer
|
var b strings.Builder
|
||||||
if p.Len() > 0 {
|
if p.Len() > 0 {
|
||||||
b.WriteString(p[0].String())
|
b.WriteString(p[0].String())
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,8 @@ go 1.19
|
||||||
require (
|
require (
|
||||||
github.com/dustin/go-humanize v1.0.1
|
github.com/dustin/go-humanize v1.0.1
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||||
github.com/prometheus/client_golang v1.15.0
|
github.com/prometheus/client_golang v1.15.1
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
go.etcd.io/etcd/api/v3 v3.6.0-alpha.0
|
go.etcd.io/etcd/api/v3 v3.6.0-alpha.0
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
||||||
go.uber.org/zap v1.24.0
|
go.uber.org/zap v1.24.0
|
||||||
|
@ -23,18 +23,18 @@ require (
|
||||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||||
github.com/kr/text v0.2.0 // indirect
|
github.com/kr/text v0.2.0 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/prometheus/client_model v0.3.0 // indirect
|
github.com/prometheus/client_model v0.4.0 // indirect
|
||||||
github.com/prometheus/common v0.42.0 // indirect
|
github.com/prometheus/common v0.43.0 // indirect
|
||||||
github.com/prometheus/procfs v0.9.0 // indirect
|
github.com/prometheus/procfs v0.9.0 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.10.0 // indirect
|
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|
|
@ -40,7 +40,6 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
@ -63,6 +62,7 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
||||||
|
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/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/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
|
@ -74,28 +74,23 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr
|
||||||
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||||
github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||||
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
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/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
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.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
|
@ -126,8 +121,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
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=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -144,14 +139,14 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
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-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-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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
@ -201,7 +196,6 @@ 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.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
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.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.v3 v3.0.1/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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|
|
@ -45,7 +45,7 @@ func hasChecksum(n int64) bool {
|
||||||
// selected node, and saved snapshot is the point-in-time state of
|
// selected node, and saved snapshot is the point-in-time state of
|
||||||
// the selected node.
|
// the selected node.
|
||||||
// Etcd <v3.6 will return "" as version.
|
// Etcd <v3.6 will return "" as version.
|
||||||
func SaveWithVersion(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath string) (version string, err error) {
|
func SaveWithVersion(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath string) (string, error) {
|
||||||
cfg.Logger = lg.Named("client")
|
cfg.Logger = lg.Named("client")
|
||||||
if len(cfg.Endpoints) != 1 {
|
if len(cfg.Endpoints) != 1 {
|
||||||
return "", fmt.Errorf("snapshot must be requested to one selected node, not multiple %v", cfg.Endpoints)
|
return "", fmt.Errorf("snapshot must be requested to one selected node, not multiple %v", cfg.Endpoints)
|
||||||
|
@ -91,7 +91,7 @@ func SaveWithVersion(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, d
|
||||||
zap.String("endpoint", cfg.Endpoints[0]),
|
zap.String("endpoint", cfg.Endpoints[0]),
|
||||||
zap.String("size", humanize.Bytes(uint64(size))),
|
zap.String("size", humanize.Bytes(uint64(size))),
|
||||||
zap.Duration("took", time.Since(start)),
|
zap.Duration("took", time.Since(start)),
|
||||||
zap.String("etcd-version", version),
|
zap.String("etcd-version", resp.Version),
|
||||||
)
|
)
|
||||||
|
|
||||||
if err = os.Rename(partpath, dbPath); err != nil {
|
if err = os.Rename(partpath, dbPath); err != nil {
|
||||||
|
|
25
codecov.yml
25
codecov.yml
|
@ -1,17 +1,16 @@
|
||||||
|
---
|
||||||
codecov:
|
codecov:
|
||||||
token: "6040de41-c073-4d6f-bbf8-d89256ef31e1"
|
token: 6040de41-c073-4d6f-bbf8-d89256ef31e1
|
||||||
disable_default_path_fixes: true
|
disable_default_path_fixes: true
|
||||||
|
|
||||||
fixes:
|
fixes:
|
||||||
- "go.etcd.io/etcd/api/v3/::api/"
|
- go.etcd.io/etcd/api/v3/::api/
|
||||||
- "go.etcd.io/etcd/client/v3/::client/v3/"
|
- go.etcd.io/etcd/client/v3/::client/v3/
|
||||||
- "go.etcd.io/etcd/client/v2/::client/v2/"
|
- go.etcd.io/etcd/client/v2/::client/v2/
|
||||||
- "go.etcd.io/etcd/etcdctl/v3/::etcdctl/"
|
- go.etcd.io/etcd/etcdctl/v3/::etcdctl/
|
||||||
- "go.etcd.io/etcd/pkg/v3/::pkg/"
|
- go.etcd.io/etcd/pkg/v3/::pkg/
|
||||||
- "go.etcd.io/etcd/server/v3/::server/"
|
- go.etcd.io/etcd/server/v3/::server/
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
- "**/*.pb.go"
|
- '**/*.pb.go'
|
||||||
- "**/*.pb.gw.go"
|
- '**/*.pb.gw.go'
|
||||||
- "tests/**/*"
|
- tests/**/*
|
||||||
- "go.etcd.io/etcd/tests/**/*"
|
- go.etcd.io/etcd/tests/**/*
|
||||||
|
|
|
@ -1,17 +1,15 @@
|
||||||
rule_files:
|
---
|
||||||
- manifests/etcd-prometheusRules.yaml
|
rule_files: [manifests/etcd-prometheusRules.yaml]
|
||||||
|
|
||||||
evaluation_interval: 1m
|
evaluation_interval: 1m
|
||||||
|
|
||||||
tests:
|
tests:
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'up{job="etcd",instance="10.10.10.0"}'
|
- series: up{job="etcd",instance="10.10.10.0"}
|
||||||
values: '1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
|
||||||
- series: 'up{job="etcd",instance="10.10.10.1"}'
|
- series: up{job="etcd",instance="10.10.10.1"}
|
||||||
values: '1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
|
||||||
- series: 'up{job="etcd",instance="10.10.10.2"}'
|
- series: up{job="etcd",instance="10.10.10.2"}
|
||||||
values: '1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 3m
|
- eval_time: 3m
|
||||||
alertname: etcdInsufficientMembers
|
alertname: etcdInsufficientMembers
|
||||||
|
@ -27,7 +25,7 @@ tests:
|
||||||
severity: critical
|
severity: critical
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": members are down (3).'
|
description: 'etcd cluster "etcd": members are down (3).'
|
||||||
summary: 'etcd cluster members are down.'
|
summary: etcd cluster members are down.
|
||||||
- eval_time: 7m
|
- eval_time: 7m
|
||||||
alertname: etcdInsufficientMembers
|
alertname: etcdInsufficientMembers
|
||||||
- eval_time: 11m
|
- eval_time: 11m
|
||||||
|
@ -38,7 +36,7 @@ tests:
|
||||||
severity: critical
|
severity: critical
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": insufficient members (1).'
|
description: 'etcd cluster "etcd": insufficient members (1).'
|
||||||
summary: 'etcd cluster has insufficient number of members.'
|
summary: etcd cluster has insufficient number of members.
|
||||||
- eval_time: 15m
|
- eval_time: 15m
|
||||||
alertname: etcdInsufficientMembers
|
alertname: etcdInsufficientMembers
|
||||||
exp_alerts:
|
exp_alerts:
|
||||||
|
@ -47,16 +45,15 @@ tests:
|
||||||
severity: critical
|
severity: critical
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": insufficient members (0).'
|
description: 'etcd cluster "etcd": insufficient members (0).'
|
||||||
summary: 'etcd cluster has insufficient number of members.'
|
summary: etcd cluster has insufficient number of members.
|
||||||
|
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'up{job="etcd",instance="10.10.10.0"}'
|
- series: up{job="etcd",instance="10.10.10.0"}
|
||||||
values: '1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
|
||||||
- series: 'up{job="etcd",instance="10.10.10.1"}'
|
- series: up{job="etcd",instance="10.10.10.1"}
|
||||||
values: '1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
- series: 'up{job="etcd",instance="10.10.10.2"}'
|
- series: up{job="etcd",instance="10.10.10.2"}
|
||||||
values: '1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 14m
|
- eval_time: 14m
|
||||||
alertname: etcdMembersDown
|
alertname: etcdMembersDown
|
||||||
|
@ -66,16 +63,15 @@ tests:
|
||||||
severity: critical
|
severity: critical
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": members are down (3).'
|
description: 'etcd cluster "etcd": members are down (3).'
|
||||||
summary: 'etcd cluster members are down.'
|
summary: etcd cluster members are down.
|
||||||
|
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'up{job="etcd",instance="10.10.10.0"}'
|
- series: up{job="etcd",instance="10.10.10.0"}
|
||||||
values: '1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
|
||||||
- series: 'up{job="etcd",instance="10.10.10.1"}'
|
- series: up{job="etcd",instance="10.10.10.1"}
|
||||||
values: '1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0'
|
values: 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
|
||||||
- series: 'etcd_network_peer_sent_failures_total{To="member-1",job="etcd",endpoint="test"}'
|
- series: etcd_network_peer_sent_failures_total{To="member-1",job="etcd",endpoint="test"}
|
||||||
values: '0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18'
|
values: 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 13m
|
- eval_time: 13m
|
||||||
alertname: etcdMembersDown
|
alertname: etcdMembersDown
|
||||||
|
@ -85,16 +81,15 @@ tests:
|
||||||
severity: critical
|
severity: critical
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": members are down (1).'
|
description: 'etcd cluster "etcd": members are down (1).'
|
||||||
summary: 'etcd cluster members are down.'
|
summary: etcd cluster members are down.
|
||||||
|
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.0"}
|
||||||
values: '0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 2 0 0 1 0 0 0 0 0 0 0 0 0 0
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.1"}
|
||||||
values: '0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.2"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.2"}
|
||||||
values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 10m
|
- eval_time: 10m
|
||||||
alertname: etcdHighNumberOfLeaderChanges
|
alertname: etcdHighNumberOfLeaderChanges
|
||||||
|
@ -104,61 +99,59 @@ tests:
|
||||||
severity: warning
|
severity: warning
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": 4 leader changes within the last 15 minutes. Frequent elections may be a sign of insufficient resources, high network latency, or disruptions by other components and should be investigated.'
|
description: 'etcd cluster "etcd": 4 leader changes within the last 15 minutes. Frequent elections may be a sign of insufficient resources, high network latency, or disruptions by other components and should be investigated.'
|
||||||
summary: 'etcd cluster has high number of leader changes.'
|
summary: etcd cluster has high number of leader changes.
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.0"}
|
||||||
values: '0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.1"}
|
||||||
values: '0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
- series: 'etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.2"}'
|
- series: etcd_server_leader_changes_seen_total{job="etcd",instance="10.10.10.2"}
|
||||||
values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'
|
values: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 10m
|
- eval_time: 10m
|
||||||
alertname: etcdHighNumberOfLeaderChanges
|
alertname: etcdHighNumberOfLeaderChanges
|
||||||
exp_alerts:
|
exp_alerts:
|
||||||
|
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||||
values: '0+8192x240'
|
values: 0+8192x240
|
||||||
- series: 'etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.0"}
|
||||||
values: '524288+0x240'
|
values: 524288+0x240
|
||||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||||
values: '0+1024x240'
|
values: 0+1024x240
|
||||||
- series: 'etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.1"}
|
||||||
values: '524288+0x240'
|
values: 524288+0x240
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 11m
|
- eval_time: 11m
|
||||||
alertname: etcdExcessiveDatabaseGrowth
|
alertname: etcdExcessiveDatabaseGrowth
|
||||||
exp_alerts:
|
exp_alerts:
|
||||||
- exp_labels:
|
- exp_labels:
|
||||||
instance: '10.10.10.0'
|
instance: 10.10.10.0
|
||||||
job: etcd
|
job: etcd
|
||||||
severity: warning
|
severity: warning
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance 10.10.10.0, please check as it might be disruptive.'
|
description: 'etcd cluster "etcd": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance 10.10.10.0, please check as it might be disruptive.'
|
||||||
summary: 'etcd cluster database growing very fast.'
|
summary: etcd cluster database growing very fast.
|
||||||
|
|
||||||
- interval: 1m
|
- interval: 1m
|
||||||
input_series:
|
input_series:
|
||||||
- series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||||
values: '300000000+0x10'
|
values: 300000000+0x10
|
||||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}'
|
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||||
values: '1000000000+0x10'
|
values: 1000000000+0x10
|
||||||
- series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||||
values: '700000000+0x10'
|
values: 700000000+0x10
|
||||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}'
|
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||||
values: '1000000000+0x10'
|
values: 1000000000+0x10
|
||||||
alert_rule_test:
|
alert_rule_test:
|
||||||
- eval_time: 11m
|
- eval_time: 11m
|
||||||
alertname: etcdDatabaseHighFragmentationRatio
|
alertname: etcdDatabaseHighFragmentationRatio
|
||||||
exp_alerts:
|
exp_alerts:
|
||||||
- exp_labels:
|
- exp_labels:
|
||||||
instance: '10.10.10.0'
|
instance: 10.10.10.0
|
||||||
job: etcd
|
job: etcd
|
||||||
severity: warning
|
severity: warning
|
||||||
exp_annotations:
|
exp_annotations:
|
||||||
description: 'etcd cluster "etcd": database size in use on instance 10.10.10.0 is 30% of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.'
|
description: 'etcd cluster "etcd": database size in use on instance 10.10.10.0 is 30% of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.'
|
||||||
runbook_url: https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation
|
runbook_url: https://etcd.io/docs/v3.5/op-guide/maintenance/#defragmentation
|
||||||
summary: 'etcd database size in use is less than 50% of the actual allocated storage.'
|
summary: etcd database size in use is less than 50% of the actual allocated storage.
|
||||||
|
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"encoding/gob"
|
"encoding/gob"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"go.etcd.io/etcd/server/v3/etcdserver/api/snap"
|
"go.etcd.io/etcd/server/v3/etcdserver/api/snap"
|
||||||
|
@ -63,7 +64,7 @@ func (s *kvstore) Lookup(key string) (string, bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *kvstore) Propose(k string, v string) {
|
func (s *kvstore) Propose(k string, v string) {
|
||||||
var buf bytes.Buffer
|
var buf strings.Builder
|
||||||
if err := gob.NewEncoder(&buf).Encode(kv{k, v}); err != nil {
|
if err := gob.NewEncoder(&buf).Encode(kv{k, v}); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,8 @@ discovery-proxy:
|
||||||
# DNS domain used to bootstrap initial cluster.
|
# DNS domain used to bootstrap initial cluster.
|
||||||
discovery-srv:
|
discovery-srv:
|
||||||
|
|
||||||
# Initial cluster configuration for bootstrapping.
|
# Comma separated string of initial cluster configuration for bootstrapping.
|
||||||
|
# Example: initial-cluster: "infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380"
|
||||||
initial-cluster:
|
initial-cluster:
|
||||||
|
|
||||||
# Initial cluster token for the etcd cluster during bootstrap.
|
# Initial cluster token for the etcd cluster during bootstrap.
|
||||||
|
|
|
@ -76,7 +76,7 @@ func newEpHashKVCommand() *cobra.Command {
|
||||||
Short: "Prints the KV history hash for each endpoint in --endpoints",
|
Short: "Prints the KV history hash for each endpoint in --endpoints",
|
||||||
Run: epHashKVCommandFunc,
|
Run: epHashKVCommandFunc,
|
||||||
}
|
}
|
||||||
hc.PersistentFlags().Int64Var(&epHashKVRev, "rev", 0, "maximum revision to hash (default: all revisions)")
|
hc.PersistentFlags().Int64Var(&epHashKVRev, "rev", 0, "maximum revision to hash (default: latest revision)")
|
||||||
return hc
|
return hc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,11 @@
|
||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
clientv3 "go.etcd.io/etcd/client/v3"
|
clientv3 "go.etcd.io/etcd/client/v3"
|
||||||
)
|
)
|
||||||
|
@ -58,7 +58,7 @@ func printJSON(v interface{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func printMemberListWithHexJSON(r clientv3.MemberListResponse) {
|
func printMemberListWithHexJSON(r clientv3.MemberListResponse) {
|
||||||
var buffer bytes.Buffer
|
var buffer strings.Builder
|
||||||
var b []byte
|
var b []byte
|
||||||
buffer.WriteString("{\"header\":{\"cluster_id\":\"")
|
buffer.WriteString("{\"header\":{\"cluster_id\":\"")
|
||||||
b = strconv.AppendUint(nil, r.Header.ClusterId, 16)
|
b = strconv.AppendUint(nil, r.Header.ClusterId, 16)
|
||||||
|
|
|
@ -25,6 +25,7 @@ require (
|
||||||
github.com/fatih/color v1.14.1 // indirect
|
github.com/fatih/color v1.14.1 // indirect
|
||||||
github.com/gogo/protobuf v1.3.2 // indirect
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||||
|
@ -33,9 +34,9 @@ require (
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
)
|
)
|
||||||
|
|
|
@ -67,6 +67,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
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/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||||
|
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/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
|
@ -87,10 +88,10 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||||
|
@ -105,7 +106,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
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.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
|
@ -136,8 +137,8 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
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=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -155,14 +156,14 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
|
|
@ -44,13 +44,14 @@ require (
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/google/btree v1.1.2 // indirect
|
github.com/google/btree v1.1.2 // indirect
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/jonboulle/clockwork v0.4.0 // indirect
|
github.com/jonboulle/clockwork v0.4.0 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/prometheus/client_golang v1.15.0 // indirect
|
github.com/prometheus/client_golang v1.15.1 // indirect
|
||||||
github.com/prometheus/client_model v0.3.0 // indirect
|
github.com/prometheus/client_model v0.4.0 // indirect
|
||||||
github.com/prometheus/common v0.42.0 // indirect
|
github.com/prometheus/common v0.43.0 // indirect
|
||||||
github.com/prometheus/procfs v0.9.0 // indirect
|
github.com/prometheus/procfs v0.9.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
|
||||||
|
@ -62,10 +63,10 @@ require (
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/goleak v1.1.12 // indirect
|
go.uber.org/goleak v1.1.12 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/crypto v0.8.0 // indirect
|
golang.org/x/crypto v0.10.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
golang.org/x/time v0.3.0 // indirect
|
golang.org/x/time v0.3.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||||
google.golang.org/grpc v1.51.0 // indirect
|
google.golang.org/grpc v1.51.0 // indirect
|
||||||
|
|
|
@ -52,7 +52,6 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
|
@ -76,6 +75,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
||||||
|
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/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
|
||||||
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||||
|
@ -95,13 +95,13 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||||
github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||||
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
|
@ -115,7 +115,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
@ -145,8 +145,8 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
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=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
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-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
@ -166,11 +166,11 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
|
golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -186,14 +186,14 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
|
|
16
go.mod
16
go.mod
|
@ -20,7 +20,7 @@ require (
|
||||||
github.com/coreos/go-semver v0.3.1
|
github.com/coreos/go-semver v0.3.1
|
||||||
github.com/dustin/go-humanize v1.0.1
|
github.com/dustin/go-humanize v1.0.1
|
||||||
github.com/spf13/cobra v1.7.0
|
github.com/spf13/cobra v1.7.0
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
go.etcd.io/bbolt v1.3.7
|
go.etcd.io/bbolt v1.3.7
|
||||||
go.etcd.io/etcd/api/v3 v3.6.0-alpha.0
|
go.etcd.io/etcd/api/v3 v3.6.0-alpha.0
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
||||||
|
@ -69,9 +69,9 @@ require (
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||||
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.15.0 // indirect
|
github.com/prometheus/client_golang v1.15.1 // indirect
|
||||||
github.com/prometheus/client_model v0.3.0 // indirect
|
github.com/prometheus/client_model v0.4.0 // indirect
|
||||||
github.com/prometheus/common v0.42.0 // indirect
|
github.com/prometheus/common v0.43.0 // indirect
|
||||||
github.com/prometheus/procfs v0.9.0 // indirect
|
github.com/prometheus/procfs v0.9.0 // indirect
|
||||||
github.com/rivo/uniseg v0.2.0 // indirect
|
github.com/rivo/uniseg v0.2.0 // indirect
|
||||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||||
|
@ -90,10 +90,10 @@ require (
|
||||||
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
|
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/crypto v0.8.0 // indirect
|
golang.org/x/crypto v0.10.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
|
40
go.sum
40
go.sum
|
@ -229,13 +229,13 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||||
github.com/prometheus/client_golang v1.15.0/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||||
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||||
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||||
|
@ -257,18 +257,14 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||||
|
@ -322,8 +318,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
||||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
@ -392,8 +388,8 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
@ -406,7 +402,7 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ
|
||||||
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
|
golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -418,7 +414,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
@ -459,8 +455,8 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
@ -469,8 +465,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
name: etcd-client
|
name: etcd-client
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- name: etcd-client-port
|
- name: etcd-client-port
|
||||||
port: 2379
|
port: 2379
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2379
|
targetPort: 2379
|
||||||
selector:
|
selector:
|
||||||
app: etcd
|
app: etcd
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -22,35 +21,33 @@ metadata:
|
||||||
name: etcd0
|
name: etcd0
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- command:
|
- command:
|
||||||
- /usr/local/bin/etcd
|
- /usr/local/bin/etcd
|
||||||
- --name
|
- --name
|
||||||
- etcd0
|
- etcd0
|
||||||
- --initial-advertise-peer-urls
|
- --initial-advertise-peer-urls
|
||||||
- http://etcd0:2380
|
- http://etcd0:2380
|
||||||
- --listen-peer-urls
|
- --listen-peer-urls
|
||||||
- http://0.0.0.0:2380
|
- http://0.0.0.0:2380
|
||||||
- --listen-client-urls
|
- --listen-client-urls
|
||||||
- http://0.0.0.0:2379
|
- http://0.0.0.0:2379
|
||||||
- --advertise-client-urls
|
- --advertise-client-urls
|
||||||
- http://etcd0:2379
|
- http://etcd0:2379
|
||||||
- --initial-cluster
|
- --initial-cluster
|
||||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||||
- --initial-cluster-state
|
- --initial-cluster-state
|
||||||
- new
|
- new
|
||||||
image: quay.io/coreos/etcd:latest
|
image: quay.io/coreos/etcd:latest
|
||||||
name: etcd0
|
name: etcd0
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 2379
|
- containerPort: 2379
|
||||||
name: client
|
name: client
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
- containerPort: 2380
|
- containerPort: 2380
|
||||||
name: server
|
name: server
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -59,19 +56,17 @@ metadata:
|
||||||
name: etcd0
|
name: etcd0
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- name: client
|
- name: client
|
||||||
port: 2379
|
port: 2379
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2379
|
targetPort: 2379
|
||||||
- name: server
|
- name: server
|
||||||
port: 2380
|
port: 2380
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2380
|
targetPort: 2380
|
||||||
selector:
|
selector:
|
||||||
etcd_node: etcd0
|
etcd_node: etcd0
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -81,35 +76,33 @@ metadata:
|
||||||
name: etcd1
|
name: etcd1
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- command:
|
- command:
|
||||||
- /usr/local/bin/etcd
|
- /usr/local/bin/etcd
|
||||||
- --name
|
- --name
|
||||||
- etcd1
|
- etcd1
|
||||||
- --initial-advertise-peer-urls
|
- --initial-advertise-peer-urls
|
||||||
- http://etcd1:2380
|
- http://etcd1:2380
|
||||||
- --listen-peer-urls
|
- --listen-peer-urls
|
||||||
- http://0.0.0.0:2380
|
- http://0.0.0.0:2380
|
||||||
- --listen-client-urls
|
- --listen-client-urls
|
||||||
- http://0.0.0.0:2379
|
- http://0.0.0.0:2379
|
||||||
- --advertise-client-urls
|
- --advertise-client-urls
|
||||||
- http://etcd1:2379
|
- http://etcd1:2379
|
||||||
- --initial-cluster
|
- --initial-cluster
|
||||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||||
- --initial-cluster-state
|
- --initial-cluster-state
|
||||||
- new
|
- new
|
||||||
image: quay.io/coreos/etcd:latest
|
image: quay.io/coreos/etcd:latest
|
||||||
name: etcd1
|
name: etcd1
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 2379
|
- containerPort: 2379
|
||||||
name: client
|
name: client
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
- containerPort: 2380
|
- containerPort: 2380
|
||||||
name: server
|
name: server
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -118,19 +111,17 @@ metadata:
|
||||||
name: etcd1
|
name: etcd1
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- name: client
|
- name: client
|
||||||
port: 2379
|
port: 2379
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2379
|
targetPort: 2379
|
||||||
- name: server
|
- name: server
|
||||||
port: 2380
|
port: 2380
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2380
|
targetPort: 2380
|
||||||
selector:
|
selector:
|
||||||
etcd_node: etcd1
|
etcd_node: etcd1
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -140,35 +131,33 @@ metadata:
|
||||||
name: etcd2
|
name: etcd2
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- command:
|
- command:
|
||||||
- /usr/local/bin/etcd
|
- /usr/local/bin/etcd
|
||||||
- --name
|
- --name
|
||||||
- etcd2
|
- etcd2
|
||||||
- --initial-advertise-peer-urls
|
- --initial-advertise-peer-urls
|
||||||
- http://etcd2:2380
|
- http://etcd2:2380
|
||||||
- --listen-peer-urls
|
- --listen-peer-urls
|
||||||
- http://0.0.0.0:2380
|
- http://0.0.0.0:2380
|
||||||
- --listen-client-urls
|
- --listen-client-urls
|
||||||
- http://0.0.0.0:2379
|
- http://0.0.0.0:2379
|
||||||
- --advertise-client-urls
|
- --advertise-client-urls
|
||||||
- http://etcd2:2379
|
- http://etcd2:2379
|
||||||
- --initial-cluster
|
- --initial-cluster
|
||||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||||
- --initial-cluster-state
|
- --initial-cluster-state
|
||||||
- new
|
- new
|
||||||
image: quay.io/coreos/etcd:latest
|
image: quay.io/coreos/etcd:latest
|
||||||
name: etcd2
|
name: etcd2
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 2379
|
- containerPort: 2379
|
||||||
name: client
|
name: client
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
- containerPort: 2380
|
- containerPort: 2380
|
||||||
name: server
|
name: server
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Service
|
kind: Service
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -177,13 +166,13 @@ metadata:
|
||||||
name: etcd2
|
name: etcd2
|
||||||
spec:
|
spec:
|
||||||
ports:
|
ports:
|
||||||
- name: client
|
- name: client
|
||||||
port: 2379
|
port: 2379
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2379
|
targetPort: 2379
|
||||||
- name: server
|
- name: server
|
||||||
port: 2380
|
port: 2380
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 2380
|
targetPort: 2380
|
||||||
selector:
|
selector:
|
||||||
etcd_node: etcd2
|
etcd_node: etcd2
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
---
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
metadata:
|
metadata:
|
||||||
|
@ -6,17 +7,17 @@ metadata:
|
||||||
name: vulcand
|
name: vulcand
|
||||||
spec:
|
spec:
|
||||||
containers:
|
containers:
|
||||||
- command:
|
- command:
|
||||||
- /go/bin/vulcand
|
- /go/bin/vulcand
|
||||||
- -apiInterface=0.0.0.0
|
- -apiInterface=0.0.0.0
|
||||||
- --etcd=http://etcd-client:2379
|
- --etcd=http://etcd-client:2379
|
||||||
image: mailgun/vulcand:v0.8.0-beta.2
|
image: mailgun/vulcand:v0.8.0-beta.2
|
||||||
name: vulcand
|
name: vulcand
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 8081
|
- containerPort: 8081
|
||||||
name: api
|
name: api
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
- containerPort: 8082
|
- containerPort: 8082
|
||||||
name: server
|
name: server
|
||||||
protocol: TCP
|
protocol: TCP
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
|
@ -17,7 +17,6 @@
|
||||||
package cobrautl
|
package cobrautl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
@ -103,7 +102,7 @@ GLOBAL OPTIONS:
|
||||||
}
|
}
|
||||||
|
|
||||||
func etcdFlagUsages(flagSet *pflag.FlagSet) string {
|
func etcdFlagUsages(flagSet *pflag.FlagSet) string {
|
||||||
x := new(bytes.Buffer)
|
x := new(strings.Builder)
|
||||||
|
|
||||||
flagSet.VisitAll(func(flag *pflag.Flag) {
|
flagSet.VisitAll(func(flag *pflag.Flag) {
|
||||||
if len(flag.Deprecated) > 0 {
|
if len(flag.Deprecated) > 0 {
|
||||||
|
|
|
@ -8,7 +8,7 @@ require (
|
||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/spf13/cobra v1.7.0
|
github.com/spf13/cobra v1.7.0
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/spf13/pflag v1.0.5
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.4
|
||||||
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
||||||
go.uber.org/zap v1.24.0
|
go.uber.org/zap v1.24.0
|
||||||
google.golang.org/grpc v1.51.0
|
google.golang.org/grpc v1.51.0
|
||||||
|
@ -22,9 +22,9 @@ require (
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
go.uber.org/atomic v1.7.0 // indirect
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/net v0.9.0 // indirect
|
golang.org/x/net v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.7.0 // indirect
|
golang.org/x/sys v0.9.0 // indirect
|
||||||
golang.org/x/text v0.9.0 // indirect
|
golang.org/x/text v0.10.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||||
google.golang.org/protobuf v1.30.0 // indirect
|
google.golang.org/protobuf v1.30.0 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
|
21
pkg/go.sum
21
pkg/go.sum
|
@ -69,14 +69,10 @@ github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRM
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||||
|
@ -99,8 +95,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
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=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -114,14 +110,14 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
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-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-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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
|
@ -165,7 +161,6 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
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.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||||
gopkg.in/yaml.v2 v2.2.3/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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
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.v3 v3.0.1/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-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
|
|
@ -18,6 +18,8 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"strconv"
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||||
|
@ -93,14 +95,16 @@ func (ss *StubServer) Addr() string {
|
||||||
|
|
||||||
type dummyStubServer struct {
|
type dummyStubServer struct {
|
||||||
testpb.UnimplementedTestServiceServer
|
testpb.UnimplementedTestServiceServer
|
||||||
body []byte
|
counter uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
|
func (d *dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
|
||||||
|
newCount := atomic.AddUint64(&d.counter, 1)
|
||||||
|
|
||||||
return &testpb.SimpleResponse{
|
return &testpb.SimpleResponse{
|
||||||
Payload: &testpb.Payload{
|
Payload: &testpb.Payload{
|
||||||
Type: testpb.PayloadType_COMPRESSABLE,
|
Type: testpb.PayloadType_COMPRESSABLE,
|
||||||
Body: d.body,
|
Body: []byte(strconv.FormatUint(newCount, 10)),
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -108,5 +112,5 @@ func (d dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*tes
|
||||||
// NewDummyStubServer creates a simple test server that serves Unary calls with
|
// NewDummyStubServer creates a simple test server that serves Unary calls with
|
||||||
// responses with the given payload.
|
// responses with the given payload.
|
||||||
func NewDummyStubServer(body []byte) *StubServer {
|
func NewDummyStubServer(body []byte) *StubServer {
|
||||||
return New(dummyStubServer{body: body})
|
return New(&dummyStubServer{})
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,12 @@
|
||||||
package report
|
package report
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -119,7 +119,7 @@ func (sp *secondPoints) getTimeSeries() TimeSeries {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t TimeSeries) String() string {
|
func (t TimeSeries) String() string {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(strings.Builder)
|
||||||
wr := csv.NewWriter(buf)
|
wr := csv.NewWriter(buf)
|
||||||
if err := wr.Write([]string{"UNIX-SECOND", "MIN-LATENCY-MS", "AVG-LATENCY-MS", "MAX-LATENCY-MS", "AVG-THROUGHPUT"}); err != nil {
|
if err := wr.Write([]string{"UNIX-SECOND", "MIN-LATENCY-MS", "AVG-LATENCY-MS", "MAX-LATENCY-MS", "AVG-THROUGHPUT"}); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
|
@ -16,10 +16,10 @@
|
||||||
package traceutil
|
package traceutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
@ -44,7 +44,7 @@ func writeFields(fields []Field) string {
|
||||||
if len(fields) == 0 {
|
if len(fields) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
var buf bytes.Buffer
|
var buf strings.Builder
|
||||||
buf.WriteString("{")
|
buf.WriteString("{")
|
||||||
for _, f := range fields {
|
for _, f := range fields {
|
||||||
buf.WriteString(f.format())
|
buf.WriteString(f.format())
|
||||||
|
|
|
@ -15,10 +15,10 @@ fi
|
||||||
|
|
||||||
ARCH=$(go env GOARCH)
|
ARCH=$(go env GOARCH)
|
||||||
VERSION="${VERSION}-${ARCH}"
|
VERSION="${VERSION}-${ARCH}"
|
||||||
DOCKERFILE="Dockerfile-release.${ARCH}"
|
DOCKERFILE="Dockerfile"
|
||||||
|
|
||||||
if [ -z "${BINARYDIR:-}" ]; then
|
if [ -z "${BINARYDIR:-}" ]; then
|
||||||
RELEASE="etcd-${1}"-$(go env GOOS)-$(go env GOARCH)
|
RELEASE="etcd-${1}"-$(go env GOOS)-${ARCH}
|
||||||
BINARYDIR="${RELEASE}"
|
BINARYDIR="${RELEASE}"
|
||||||
TARFILE="${RELEASE}.tar.gz"
|
TARFILE="${RELEASE}.tar.gz"
|
||||||
TARURL="https://github.com/etcd-io/etcd/releases/download/${1}/${TARFILE}"
|
TARURL="https://github.com/etcd-io/etcd/releases/download/${1}/${TARFILE}"
|
||||||
|
@ -43,8 +43,8 @@ cat ./"${DOCKERFILE}" > "${IMAGEDIR}"/Dockerfile
|
||||||
if [ -z "${TAG:-}" ]; then
|
if [ -z "${TAG:-}" ]; then
|
||||||
# Fix incorrect image "Architecture" using buildkit
|
# Fix incorrect image "Architecture" using buildkit
|
||||||
# From https://stackoverflow.com/q/72144329/
|
# From https://stackoverflow.com/q/72144329/
|
||||||
DOCKER_BUILDKIT=1 docker build -t "gcr.io/etcd-development/etcd:${VERSION}" "${IMAGEDIR}"
|
DOCKER_BUILDKIT=1 docker build --build-arg="ARCH=${ARCH}" -t "gcr.io/etcd-development/etcd:${VERSION}" "${IMAGEDIR}"
|
||||||
DOCKER_BUILDKIT=1 docker build -t "quay.io/coreos/etcd:${VERSION}" "${IMAGEDIR}"
|
DOCKER_BUILDKIT=1 docker build --build-arg="ARCH=${ARCH}" -t "quay.io/coreos/etcd:${VERSION}" "${IMAGEDIR}"
|
||||||
else
|
else
|
||||||
docker build -t "${TAG}:${VERSION}" "${IMAGEDIR}"
|
docker build -t "${TAG}:${VERSION}" "${IMAGEDIR}"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
source ./scripts/test_lib.sh
|
||||||
|
|
||||||
|
ROOTDIR=$(pwd)
|
||||||
|
|
||||||
|
# To fix according to newer version of go:
|
||||||
|
# go get golang.org/dl/gotip
|
||||||
|
# gotip download
|
||||||
|
# GO_CMD="gotip"
|
||||||
|
GO_CMD="go"
|
||||||
|
|
||||||
|
ROOTDIR=$(pwd)
|
||||||
|
|
||||||
|
function go_imports_fix {
|
||||||
|
GOFILES=$(run ${GO_CMD} list --f "{{with \$d:=.}}{{range .GoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...)
|
||||||
|
TESTGOFILES=$(run ${GO_CMD} list --f "{{with \$d:=.}}{{range .TestGoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...)
|
||||||
|
cd "${ROOTDIR}/tools/mod"
|
||||||
|
echo "${GOFILES}" "${TESTGOFILES}" | grep -v '.gw.go' | grep -v '.pb.go' | xargs -n 100 go run golang.org/x/tools/cmd/goimports -w -local go.etcd.io
|
||||||
|
}
|
||||||
|
|
||||||
|
log_callout -e "\\nFixing goimports for you...\n"
|
||||||
|
|
||||||
|
run_for_modules go_imports_fix || exit 2
|
||||||
|
|
||||||
|
log_success -e "\\nSUCCESS: goimports are fixed :)"
|
|
@ -8,8 +8,6 @@ go mod tidy
|
||||||
source ./scripts/test_lib.sh
|
source ./scripts/test_lib.sh
|
||||||
source ./scripts/updatebom.sh
|
source ./scripts/updatebom.sh
|
||||||
|
|
||||||
ROOTDIR=$(pwd)
|
|
||||||
|
|
||||||
# To fix according to newer version of go:
|
# To fix according to newer version of go:
|
||||||
# go get golang.org/dl/gotip
|
# go get golang.org/dl/gotip
|
||||||
# gotip download
|
# gotip download
|
||||||
|
@ -31,20 +29,11 @@ function bash_ws_fix {
|
||||||
find ./ -name '*.sh.bak' -print0 | xargs -0 rm
|
find ./ -name '*.sh.bak' -print0 | xargs -0 rm
|
||||||
}
|
}
|
||||||
|
|
||||||
function go_imports_fix {
|
|
||||||
GOFILES=$(run ${GO_CMD} list --f "{{with \$d:=.}}{{range .GoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...)
|
|
||||||
TESTGOFILES=$(run ${GO_CMD} list --f "{{with \$d:=.}}{{range .TestGoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...)
|
|
||||||
cd "${ROOTDIR}/tools/mod"
|
|
||||||
echo "${GOFILES}" "${TESTGOFILES}" | grep -v '.gw.go' | grep -v '.pb.go' | xargs -n 100 go run golang.org/x/tools/cmd/goimports -w -local go.etcd.io
|
|
||||||
}
|
|
||||||
|
|
||||||
log_callout -e "\\nFixing etcd code for you...\n"
|
log_callout -e "\\nFixing etcd code for you...\n"
|
||||||
|
|
||||||
run_for_modules mod_tidy_fix || exit 2
|
run_for_modules mod_tidy_fix || exit 2
|
||||||
run_for_modules run ${GO_CMD} fmt || exit 2
|
run_for_modules run ${GO_CMD} fmt || exit 2
|
||||||
run_for_module tests bom_fix || exit 2
|
run_for_module tests bom_fix || exit 2
|
||||||
log_callout "Fixing goimports..."
|
|
||||||
run_for_modules go_imports_fix || exit 2
|
|
||||||
bash_ws_fix || exit 2
|
bash_ws_fix || exit 2
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ log_callout -e "\\nRunning gofast (gogo) proto generation..."
|
||||||
for dir in ${DIRS}; do
|
for dir in ${DIRS}; do
|
||||||
run pushd "${dir}"
|
run pushd "${dir}"
|
||||||
run protoc --gofast_out=plugins=grpc:. -I=".:${GOGOPROTO_PATH}:${ETCD_ROOT_DIR}/..:${RAFT_ROOT}:${ETCD_ROOT_DIR}:${GRPC_GATEWAY_ROOT}/third_party/googleapis" \
|
run protoc --gofast_out=plugins=grpc:. -I=".:${GOGOPROTO_PATH}:${ETCD_ROOT_DIR}/..:${RAFT_ROOT}:${ETCD_ROOT_DIR}:${GRPC_GATEWAY_ROOT}/third_party/googleapis" \
|
||||||
|
-I"${GRPC_GATEWAY_ROOT}" \
|
||||||
--plugin="${GOFAST_BIN}" ./**/*.proto
|
--plugin="${GOFAST_BIN}" ./**/*.proto
|
||||||
|
|
||||||
run sed -i.bak -E 's|"etcd/api/|"go.etcd.io/etcd/api/v3/|g' ./**/*.pb.go
|
run sed -i.bak -E 's|"etcd/api/|"go.etcd.io/etcd/api/v3/|g' ./**/*.pb.go
|
||||||
|
@ -64,6 +65,7 @@ for pb in api/etcdserverpb/rpc server/etcdserver/api/v3lock/v3lockpb/v3lock serv
|
||||||
log_callout "grpc & swagger for: ${pb}.proto"
|
log_callout "grpc & swagger for: ${pb}.proto"
|
||||||
run protoc -I. \
|
run protoc -I. \
|
||||||
-I"${GRPC_GATEWAY_ROOT}"/third_party/googleapis \
|
-I"${GRPC_GATEWAY_ROOT}"/third_party/googleapis \
|
||||||
|
-I"${GRPC_GATEWAY_ROOT}" \
|
||||||
-I"${GOGOPROTO_PATH}" \
|
-I"${GOGOPROTO_PATH}" \
|
||||||
-I"${ETCD_ROOT_DIR}/.." \
|
-I"${ETCD_ROOT_DIR}/.." \
|
||||||
-I"${RAFT_ROOT}" \
|
-I"${RAFT_ROOT}" \
|
||||||
|
@ -95,10 +97,6 @@ for pb in api/etcdserverpb/rpc server/etcdserver/api/v3lock/v3lockpb/v3lock serv
|
||||||
Documentation/dev-guide/apispec/swagger/"${swaggerName}".swagger.json
|
Documentation/dev-guide/apispec/swagger/"${swaggerName}".swagger.json
|
||||||
done
|
done
|
||||||
|
|
||||||
log_callout -e "\\nRunning swagger ..."
|
|
||||||
run_go_tool github.com/hexfusion/schwag -input=Documentation/dev-guide/apispec/swagger/rpc.swagger.json
|
|
||||||
|
|
||||||
|
|
||||||
if [ "${1:-}" != "--skip-protodoc" ]; then
|
if [ "${1:-}" != "--skip-protodoc" ]; then
|
||||||
log_callout "protodoc is auto-generating grpc API reference documentation..."
|
log_callout "protodoc is auto-generating grpc API reference documentation..."
|
||||||
|
|
||||||
|
|
|
@ -112,10 +112,10 @@ main() {
|
||||||
# Check go version.
|
# Check go version.
|
||||||
log_callout "Check go version"
|
log_callout "Check go version"
|
||||||
local go_version current_go_version
|
local go_version current_go_version
|
||||||
go_version="go$(grep -oP '(?<=GO_VERSION:\s")[^"]*' .github/workflows/go-version.yaml | tr -d ' ')"
|
go_version="go$(cat .go-version)"
|
||||||
current_go_version=$(go version | awk '{ print $3 }')
|
current_go_version=$(go version | awk '{ print $3 }')
|
||||||
if [[ "${current_go_version}" != "${go_version}" ]]; then
|
if [[ "${current_go_version}" != "${go_version}" ]]; then
|
||||||
log_error "Current go version is ${current_go_version}, but etcd ${RELEASE_VERSION} requires ${go_version} (see .github/workflows/build.yaml)."
|
log_error "Current go version is ${current_go_version}, but etcd ${RELEASE_VERSION} requires ${go_version} (see .go-version)."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,9 @@
|
||||||
# $ PASSES=unit PKG=./wal TESTCASE="\bTestNew\b" TIMEOUT=1m ./scripts/test.sh
|
# $ PASSES=unit PKG=./wal TESTCASE="\bTestNew\b" TIMEOUT=1m ./scripts/test.sh
|
||||||
# $ PASSES=integration PKG=./client/integration TESTCASE="\bTestV2NoRetryEOF\b" TIMEOUT=1m ./scripts/test.sh
|
# $ PASSES=integration PKG=./client/integration TESTCASE="\bTestV2NoRetryEOF\b" TIMEOUT=1m ./scripts/test.sh
|
||||||
#
|
#
|
||||||
|
# KEEP_GOING_SUITE must be set to true to keep going with the next suite execution, passed to PASSES variable when there is a failure
|
||||||
|
# in a particular suite.
|
||||||
|
# KEEP_GOING_MODULE must be set to true to keep going with execution when there is failure in any module.
|
||||||
#
|
#
|
||||||
# Run code coverage
|
# Run code coverage
|
||||||
# COVERDIR must either be a absolute path or a relative path to the etcd root
|
# COVERDIR must either be a absolute path or a relative path to the etcd root
|
||||||
|
@ -55,6 +58,7 @@ if [ -n "${OUTPUT_FILE}" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PASSES=${PASSES:-"gofmt bom dep build unit"}
|
PASSES=${PASSES:-"gofmt bom dep build unit"}
|
||||||
|
KEEP_GOING_SUITE=${KEEP_GOING_SUITE:-false}
|
||||||
PKG=${PKG:-}
|
PKG=${PKG:-}
|
||||||
SHELLCHECK_VERSION=${SHELLCHECK_VERSION:-"v0.8.0"}
|
SHELLCHECK_VERSION=${SHELLCHECK_VERSION:-"v0.8.0"}
|
||||||
|
|
||||||
|
@ -646,16 +650,30 @@ function run_pass {
|
||||||
shift 1
|
shift 1
|
||||||
log_callout -e "\\n'${pass}' started at $(date)"
|
log_callout -e "\\n'${pass}' started at $(date)"
|
||||||
if "${pass}_pass" "$@" ; then
|
if "${pass}_pass" "$@" ; then
|
||||||
log_success "'${pass}' completed at $(date)"
|
log_success "'${pass}' PASSED and completed at $(date)"
|
||||||
|
return 0
|
||||||
else
|
else
|
||||||
log_error "FAIL: '${pass}' failed at $(date)"
|
log_error "FAIL: '${pass}' FAILED at $(date)"
|
||||||
exit 255
|
if [ "$KEEP_GOING_SUITE" = true ]; then
|
||||||
|
return 2
|
||||||
|
else
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
log_callout "Starting at: $(date)"
|
log_callout "Starting at: $(date)"
|
||||||
|
fail_flag=false
|
||||||
for pass in $PASSES; do
|
for pass in $PASSES; do
|
||||||
run_pass "${pass}" "${@}"
|
if run_pass "${pass}" "${@}"; then
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
fail_flag=true
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
if [ "$fail_flag" = true ]; then
|
||||||
|
log_error "There was FAILURE in the test suites ran. Look above log detail"
|
||||||
|
exit 255
|
||||||
|
fi
|
||||||
|
|
||||||
log_success "SUCCESS"
|
log_success "SUCCESS"
|
||||||
|
|
|
@ -203,11 +203,25 @@ function modules_exp() {
|
||||||
# run given command across all modules and packages
|
# run given command across all modules and packages
|
||||||
# (unless the set is limited using ${PKG} or / ${USERMOD})
|
# (unless the set is limited using ${PKG} or / ${USERMOD})
|
||||||
function run_for_modules {
|
function run_for_modules {
|
||||||
|
KEEP_GOING_MODULE=${KEEP_GOING_MODULE:-false}
|
||||||
local pkg="${PKG:-./...}"
|
local pkg="${PKG:-./...}"
|
||||||
|
local fail_mod=false
|
||||||
if [ -z "${USERMOD:-}" ]; then
|
if [ -z "${USERMOD:-}" ]; then
|
||||||
for m in $(module_dirs); do
|
for m in $(module_dirs); do
|
||||||
run_for_module "${m}" "$@" "${pkg}" || return "$?"
|
if run_for_module "${m}" "$@" "${pkg}"; then
|
||||||
|
continue
|
||||||
|
else
|
||||||
|
if [ "$KEEP_GOING_MODULE" = false ]; then
|
||||||
|
log_error "There was a Failure in module ${m}, aborting..."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
log_error "There was a Failure in module ${m}, keep going..."
|
||||||
|
fail_mod=true
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
|
if [ "$fail_mod" = true ]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
run_for_module "${USERMOD}" "$@" "${pkg}" || return "$?"
|
run_for_module "${USERMOD}" "$@" "${pkg}" || return "$?"
|
||||||
fi
|
fi
|
||||||
|
@ -293,7 +307,7 @@ function go_test {
|
||||||
junit_filename_prefix=$(junitFilenamePrefix)
|
junit_filename_prefix=$(junitFilenamePrefix)
|
||||||
|
|
||||||
if [ "${VERBOSE:-}" == "1" ]; then
|
if [ "${VERBOSE:-}" == "1" ]; then
|
||||||
goTestFlags="-v"
|
goTestFlags="-v "
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Expanding patterns (like ./...) into list of packages
|
# Expanding patterns (like ./...) into list of packages
|
||||||
|
@ -308,6 +322,10 @@ function go_test {
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "${mode}" == "fail_fast" ]; then
|
||||||
|
goTestFlags+="-failfast "
|
||||||
|
fi
|
||||||
|
|
||||||
local failures=""
|
local failures=""
|
||||||
|
|
||||||
# execution of tests against packages:
|
# execution of tests against packages:
|
||||||
|
|
|
@ -68,6 +68,7 @@ const (
|
||||||
DefaultGRPCKeepAliveTimeout = 20 * time.Second
|
DefaultGRPCKeepAliveTimeout = 20 * time.Second
|
||||||
DefaultDowngradeCheckTime = 5 * time.Second
|
DefaultDowngradeCheckTime = 5 * time.Second
|
||||||
DefaultWaitClusterReadyTimeout = 5 * time.Second
|
DefaultWaitClusterReadyTimeout = 5 * time.Second
|
||||||
|
DefaultAutoCompactionMode = "periodic"
|
||||||
|
|
||||||
DefaultDiscoveryDialTimeout = 2 * time.Second
|
DefaultDiscoveryDialTimeout = 2 * time.Second
|
||||||
DefaultDiscoveryRequestTimeOut = 5 * time.Second
|
DefaultDiscoveryRequestTimeOut = 5 * time.Second
|
||||||
|
@ -546,6 +547,8 @@ func NewConfig() *Config {
|
||||||
Auth: &clientv3.AuthConfig{},
|
Auth: &clientv3.AuthConfig{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
AutoCompactionMode: DefaultAutoCompactionMode,
|
||||||
}
|
}
|
||||||
cfg.InitialCluster = cfg.InitialClusterFromName(cfg.Name)
|
cfg.InitialCluster = cfg.InitialClusterFromName(cfg.Name)
|
||||||
return cfg
|
return cfg
|
||||||
|
@ -772,8 +775,9 @@ func (cfg *Config) Validate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
switch cfg.AutoCompactionMode {
|
switch cfg.AutoCompactionMode {
|
||||||
case "":
|
|
||||||
case CompactorModeRevision, CompactorModePeriodic:
|
case CompactorModeRevision, CompactorModePeriodic:
|
||||||
|
case "":
|
||||||
|
return errors.New("undefined auto-compaction-mode")
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unknown auto-compaction-mode %q", cfg.AutoCompactionMode)
|
return fmt.Errorf("unknown auto-compaction-mode %q", cfg.AutoCompactionMode)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"go.etcd.io/etcd/client/pkg/v3/srv"
|
"go.etcd.io/etcd/client/pkg/v3/srv"
|
||||||
"go.etcd.io/etcd/client/pkg/v3/transport"
|
"go.etcd.io/etcd/client/pkg/v3/transport"
|
||||||
|
@ -202,6 +203,11 @@ func TestAutoCompactionModeParse(t *testing.T) {
|
||||||
// err mode
|
// err mode
|
||||||
{"errmode", "1", false, 0},
|
{"errmode", "1", false, 0},
|
||||||
{"errmode", "1h", false, time.Hour},
|
{"errmode", "1h", false, time.Hour},
|
||||||
|
// empty mode
|
||||||
|
{"", "1", true, 0},
|
||||||
|
{"", "1h", false, time.Hour},
|
||||||
|
{"", "a", true, 0},
|
||||||
|
{"", "-1", true, 0},
|
||||||
}
|
}
|
||||||
|
|
||||||
hasErr := func(err error) bool {
|
hasErr := func(err error) bool {
|
||||||
|
@ -507,3 +513,10 @@ func TestTLSVersionMinMax(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUndefinedAutoCompactionModeValidate(t *testing.T) {
|
||||||
|
cfg := *NewConfig()
|
||||||
|
cfg.AutoCompactionMode = ""
|
||||||
|
err := cfg.Validate()
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ package embed
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
defaultLog "log"
|
defaultLog "log"
|
||||||
|
@ -629,10 +630,10 @@ func configureClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err erro
|
||||||
for _, u := range append(cfg.ListenClientUrls, cfg.ListenClientHttpUrls...) {
|
for _, u := range append(cfg.ListenClientUrls, cfg.ListenClientHttpUrls...) {
|
||||||
if u.Scheme == "http" || u.Scheme == "unix" {
|
if u.Scheme == "http" || u.Scheme == "unix" {
|
||||||
if !cfg.ClientTLSInfo.Empty() {
|
if !cfg.ClientTLSInfo.Empty() {
|
||||||
cfg.logger.Warn("scheme is HTTP while key and cert files are present; ignoring key and cert files", zap.String("client-url", u.String()))
|
cfg.logger.Warn("scheme is http or unix while key and cert files are present; ignoring key and cert files", zap.String("client-url", u.String()))
|
||||||
}
|
}
|
||||||
if cfg.ClientTLSInfo.ClientCertAuth {
|
if cfg.ClientTLSInfo.ClientCertAuth {
|
||||||
cfg.logger.Warn("scheme is HTTP while --client-cert-auth is enabled; ignoring client cert auth for this URL", zap.String("client-url", u.String()))
|
cfg.logger.Warn("scheme is http or unix while --client-cert-auth is enabled; ignoring client cert auth for this URL", zap.String("client-url", u.String()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (u.Scheme == "https" || u.Scheme == "unixs") && cfg.ClientTLSInfo.Empty() {
|
if (u.Scheme == "https" || u.Scheme == "unixs") && cfg.ClientTLSInfo.Empty() {
|
||||||
|
@ -887,6 +888,8 @@ func parseCompactionRetention(mode, retention string) (ret time.Duration, err er
|
||||||
ret = time.Duration(int64(h))
|
ret = time.Duration(int64(h))
|
||||||
case CompactorModePeriodic:
|
case CompactorModePeriodic:
|
||||||
ret = time.Duration(int64(h)) * time.Hour
|
ret = time.Duration(int64(h)) * time.Hour
|
||||||
|
case "":
|
||||||
|
return 0, errors.New("--auto-compaction-mode is undefined")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// periodic compaction
|
// periodic compaction
|
||||||
|
|
|
@ -189,8 +189,7 @@ func newConfig() *config {
|
||||||
fs.StringVar(&cfg.ec.DNSClusterServiceName, "discovery-srv-name", cfg.ec.DNSClusterServiceName, "Service name to query when using DNS discovery.")
|
fs.StringVar(&cfg.ec.DNSClusterServiceName, "discovery-srv-name", cfg.ec.DNSClusterServiceName, "Service name to query when using DNS discovery.")
|
||||||
fs.StringVar(&cfg.ec.InitialCluster, "initial-cluster", cfg.ec.InitialCluster, "Initial cluster configuration for bootstrapping.")
|
fs.StringVar(&cfg.ec.InitialCluster, "initial-cluster", cfg.ec.InitialCluster, "Initial cluster configuration for bootstrapping.")
|
||||||
fs.StringVar(&cfg.ec.InitialClusterToken, "initial-cluster-token", cfg.ec.InitialClusterToken, "Initial cluster token for the etcd cluster during bootstrap.")
|
fs.StringVar(&cfg.ec.InitialClusterToken, "initial-cluster-token", cfg.ec.InitialClusterToken, "Initial cluster token for the etcd cluster during bootstrap.")
|
||||||
fs.Var(cfg.cf.clusterState, "initial-cluster-state", "Initial cluster state ('new' or 'existing').")
|
fs.Var(cfg.cf.clusterState, "initial-cluster-state", "Initial cluster state ('new' when bootstrapping a new cluster or 'existing' when adding new members to an existing cluster). After successful initialization (bootstrapping or adding), flag is ignored on restarts.")
|
||||||
|
|
||||||
fs.BoolVar(&cfg.ec.StrictReconfigCheck, "strict-reconfig-check", cfg.ec.StrictReconfigCheck, "Reject reconfiguration requests that would cause quorum loss.")
|
fs.BoolVar(&cfg.ec.StrictReconfigCheck, "strict-reconfig-check", cfg.ec.StrictReconfigCheck, "Reject reconfiguration requests that would cause quorum loss.")
|
||||||
|
|
||||||
fs.BoolVar(&cfg.ec.PreVote, "pre-vote", cfg.ec.PreVote, "Enable to run an additional Raft election phase.")
|
fs.BoolVar(&cfg.ec.PreVote, "pre-vote", cfg.ec.PreVote, "Enable to run an additional Raft election phase.")
|
||||||
|
|
|
@ -103,7 +103,8 @@ Clustering:
|
||||||
--initial-cluster 'default=http://localhost:2380'
|
--initial-cluster 'default=http://localhost:2380'
|
||||||
Initial cluster configuration for bootstrapping.
|
Initial cluster configuration for bootstrapping.
|
||||||
--initial-cluster-state 'new'
|
--initial-cluster-state 'new'
|
||||||
Initial cluster state ('new' or 'existing').
|
Initial cluster state ('new' when bootstrapping a new cluster or 'existing' when adding new members to an existing cluster).
|
||||||
|
After successful initialization (bootstrapping or adding), flag is ignored on restarts
|
||||||
--initial-cluster-token 'etcd-cluster'
|
--initial-cluster-token 'etcd-cluster'
|
||||||
Initial cluster token for the etcd cluster during bootstrap.
|
Initial cluster token for the etcd cluster during bootstrap.
|
||||||
Specifying this can protect you from unintended cross-cluster interaction when running multiple clusters.
|
Specifying this can protect you from unintended cross-cluster interaction when running multiple clusters.
|
||||||
|
@ -255,6 +256,10 @@ Experimental feature:
|
||||||
Enable to check data corruption before serving any client/peer traffic.
|
Enable to check data corruption before serving any client/peer traffic.
|
||||||
--experimental-corrupt-check-time '0s'
|
--experimental-corrupt-check-time '0s'
|
||||||
Duration of time between cluster corruption check passes.
|
Duration of time between cluster corruption check passes.
|
||||||
|
--experimental-compact-hash-check-enabled 'false'
|
||||||
|
Enable leader to periodically check followers compaction hashes.
|
||||||
|
--experimental-compact-hash-check-time '1m'
|
||||||
|
Duration of time between leader checks followers compaction hashes.
|
||||||
--experimental-enable-lease-checkpoint 'false'
|
--experimental-enable-lease-checkpoint 'false'
|
||||||
ExperimentalEnableLeaseCheckpoint enables primary lessor to persist lease remainingTTL to prevent indefinite auto-renewal of long lived leases.
|
ExperimentalEnableLeaseCheckpoint enables primary lessor to persist lease remainingTTL to prevent indefinite auto-renewal of long lived leases.
|
||||||
--experimental-compaction-batch-limit 1000
|
--experimental-compaction-batch-limit 1000
|
||||||
|
|
|
@ -35,13 +35,11 @@ func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool, ser
|
||||||
}
|
}
|
||||||
endpoints := srvs.Endpoints
|
endpoints := srvs.Endpoints
|
||||||
|
|
||||||
if lg != nil {
|
lg.Info(
|
||||||
lg.Info(
|
"discovered cluster from SRV",
|
||||||
"discovered cluster from SRV",
|
zap.String("srv-server", dns),
|
||||||
zap.String("srv-server", dns),
|
zap.Strings("endpoints", endpoints),
|
||||||
zap.Strings("endpoints", endpoints),
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if insecure {
|
if insecure {
|
||||||
return *srvs
|
return *srvs
|
||||||
|
@ -52,32 +50,26 @@ func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool, ser
|
||||||
ServerName: dns,
|
ServerName: dns,
|
||||||
}
|
}
|
||||||
|
|
||||||
if lg != nil {
|
lg.Info(
|
||||||
lg.Info(
|
"validating discovered SRV endpoints",
|
||||||
"validating discovered SRV endpoints",
|
zap.String("srv-server", dns),
|
||||||
zap.String("srv-server", dns),
|
zap.Strings("endpoints", endpoints),
|
||||||
zap.Strings("endpoints", endpoints),
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
endpoints, err = transport.ValidateSecureEndpoints(tlsInfo, endpoints)
|
endpoints, err = transport.ValidateSecureEndpoints(tlsInfo, endpoints)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if lg != nil {
|
lg.Warn(
|
||||||
lg.Warn(
|
"failed to validate discovered endpoints",
|
||||||
"failed to validate discovered endpoints",
|
zap.String("srv-server", dns),
|
||||||
zap.String("srv-server", dns),
|
zap.Strings("endpoints", endpoints),
|
||||||
zap.Strings("endpoints", endpoints),
|
zap.Error(err),
|
||||||
zap.Error(err),
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if lg != nil {
|
lg.Info(
|
||||||
lg.Info(
|
"using validated discovered SRV endpoints",
|
||||||
"using validated discovered SRV endpoints",
|
zap.String("srv-server", dns),
|
||||||
zap.String("srv-server", dns),
|
zap.Strings("endpoints", endpoints),
|
||||||
zap.Strings("endpoints", endpoints),
|
)
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// map endpoints back to SRVClients struct with SRV data
|
// map endpoints back to SRVClients struct with SRV data
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
package membership
|
package membership
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"context"
|
"context"
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
@ -215,7 +214,7 @@ func (c *RaftCluster) ClientURLs() []string {
|
||||||
func (c *RaftCluster) String() string {
|
func (c *RaftCluster) String() string {
|
||||||
c.Lock()
|
c.Lock()
|
||||||
defer c.Unlock()
|
defer c.Unlock()
|
||||||
b := &bytes.Buffer{}
|
b := &strings.Builder{}
|
||||||
fmt.Fprintf(b, "{ClusterID:%s ", c.cid)
|
fmt.Fprintf(b, "{ClusterID:%s ", c.cid)
|
||||||
var ms []string
|
var ms []string
|
||||||
for _, m := range c.members {
|
for _, m := range c.members {
|
||||||
|
|
|
@ -90,7 +90,7 @@ func (ms *maintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRe
|
||||||
err := ms.bg.Backend().Defrag()
|
err := ms.bg.Backend().Defrag()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ms.lg.Warn("failed to defragment", zap.Error(err))
|
ms.lg.Warn("failed to defragment", zap.Error(err))
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
ms.lg.Info("finished defragment")
|
ms.lg.Info("finished defragment")
|
||||||
return &pb.DefragmentResponse{}, nil
|
return &pb.DefragmentResponse{}, nil
|
||||||
|
@ -279,7 +279,7 @@ type authMaintenanceServer struct {
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRequest) (*pb.DefragmentResponse, error) {
|
func (ams *authMaintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRequest) (*pb.DefragmentResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.Defragment(ctx, sr)
|
return ams.maintenanceServer.Defragment(ctx, sr)
|
||||||
|
@ -287,7 +287,7 @@ func (ams *authMaintenanceServer) Defragment(ctx context.Context, sr *pb.Defragm
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) Snapshot(sr *pb.SnapshotRequest, srv pb.Maintenance_SnapshotServer) error {
|
func (ams *authMaintenanceServer) Snapshot(sr *pb.SnapshotRequest, srv pb.Maintenance_SnapshotServer) error {
|
||||||
if err := ams.isPermitted(srv.Context()); err != nil {
|
if err := ams.isPermitted(srv.Context()); err != nil {
|
||||||
return err
|
return togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.Snapshot(sr, srv)
|
return ams.maintenanceServer.Snapshot(sr, srv)
|
||||||
|
@ -295,7 +295,7 @@ func (ams *authMaintenanceServer) Snapshot(sr *pb.SnapshotRequest, srv pb.Mainte
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) Hash(ctx context.Context, r *pb.HashRequest) (*pb.HashResponse, error) {
|
func (ams *authMaintenanceServer) Hash(ctx context.Context, r *pb.HashRequest) (*pb.HashResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.Hash(ctx, r)
|
return ams.maintenanceServer.Hash(ctx, r)
|
||||||
|
@ -303,14 +303,14 @@ func (ams *authMaintenanceServer) Hash(ctx context.Context, r *pb.HashRequest) (
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) HashKV(ctx context.Context, r *pb.HashKVRequest) (*pb.HashKVResponse, error) {
|
func (ams *authMaintenanceServer) HashKV(ctx context.Context, r *pb.HashKVRequest) (*pb.HashKVResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
return ams.maintenanceServer.HashKV(ctx, r)
|
return ams.maintenanceServer.HashKV(ctx, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) Status(ctx context.Context, ar *pb.StatusRequest) (*pb.StatusResponse, error) {
|
func (ams *authMaintenanceServer) Status(ctx context.Context, ar *pb.StatusRequest) (*pb.StatusResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.Status(ctx, ar)
|
return ams.maintenanceServer.Status(ctx, ar)
|
||||||
|
@ -318,7 +318,7 @@ func (ams *authMaintenanceServer) Status(ctx context.Context, ar *pb.StatusReque
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) MoveLeader(ctx context.Context, tr *pb.MoveLeaderRequest) (*pb.MoveLeaderResponse, error) {
|
func (ams *authMaintenanceServer) MoveLeader(ctx context.Context, tr *pb.MoveLeaderRequest) (*pb.MoveLeaderResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.MoveLeader(ctx, tr)
|
return ams.maintenanceServer.MoveLeader(ctx, tr)
|
||||||
|
@ -326,7 +326,7 @@ func (ams *authMaintenanceServer) MoveLeader(ctx context.Context, tr *pb.MoveLea
|
||||||
|
|
||||||
func (ams *authMaintenanceServer) Downgrade(ctx context.Context, r *pb.DowngradeRequest) (*pb.DowngradeResponse, error) {
|
func (ams *authMaintenanceServer) Downgrade(ctx context.Context, r *pb.DowngradeRequest) (*pb.DowngradeResponse, error) {
|
||||||
if err := ams.isPermitted(ctx); err != nil {
|
if err := ams.isPermitted(ctx); err != nil {
|
||||||
return nil, err
|
return nil, togRPCError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ams.maintenanceServer.Downgrade(ctx, r)
|
return ams.maintenanceServer.Downgrade(ctx, r)
|
||||||
|
|
|
@ -125,16 +125,27 @@ func (aa *authApplierV3) LeaseRevoke(lc *pb.LeaseRevokeRequest) (*pb.LeaseRevoke
|
||||||
func (aa *authApplierV3) checkLeasePuts(leaseID lease.LeaseID) error {
|
func (aa *authApplierV3) checkLeasePuts(leaseID lease.LeaseID) error {
|
||||||
l := aa.lessor.Lookup(leaseID)
|
l := aa.lessor.Lookup(leaseID)
|
||||||
if l != nil {
|
if l != nil {
|
||||||
for _, key := range l.Keys() {
|
return aa.checkLeasePutsKeys(l)
|
||||||
if err := aa.as.IsPutPermitted(&aa.authInfo, []byte(key)); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (aa *authApplierV3) checkLeasePutsKeys(l *lease.Lease) error {
|
||||||
|
// early return for most-common scenario of either disabled auth or admin user.
|
||||||
|
// IsAdminPermitted also checks whether auth is enabled
|
||||||
|
if err := aa.as.IsAdminPermitted(&aa.authInfo); err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, key := range l.Keys() {
|
||||||
|
if err := aa.as.IsPutPermitted(&aa.authInfo, []byte(key)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (aa *authApplierV3) UserGet(r *pb.AuthUserGetRequest) (*pb.AuthUserGetResponse, error) {
|
func (aa *authApplierV3) UserGet(r *pb.AuthUserGetRequest) (*pb.AuthUserGetResponse, error) {
|
||||||
err := aa.as.IsAdminPermitted(&aa.authInfo)
|
err := aa.as.IsAdminPermitted(&aa.authInfo)
|
||||||
if err != nil && r.Name != aa.authInfo.Username {
|
if err != nil && r.Name != aa.authInfo.Username {
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
// Copyright 2023 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 apply
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
|
betesting "go.etcd.io/etcd/server/v3/storage/backend/testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"go.uber.org/zap/zaptest"
|
||||||
|
|
||||||
|
"go.etcd.io/etcd/server/v3/storage/schema"
|
||||||
|
|
||||||
|
"go.etcd.io/etcd/api/v3/authpb"
|
||||||
|
pb "go.etcd.io/etcd/api/v3/etcdserverpb"
|
||||||
|
"go.etcd.io/etcd/server/v3/auth"
|
||||||
|
"go.etcd.io/etcd/server/v3/lease"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCheckLeasePutsKeys(t *testing.T) {
|
||||||
|
lg := zaptest.NewLogger(t)
|
||||||
|
|
||||||
|
b, _ := betesting.NewDefaultTmpBackend(t)
|
||||||
|
defer betesting.Close(t, b)
|
||||||
|
|
||||||
|
simpleTokenTTLDefault := 300 * time.Second
|
||||||
|
tokenTypeSimple := "simple"
|
||||||
|
dummyIndexWaiter := func(index uint64) <-chan struct{} {
|
||||||
|
ch := make(chan struct{}, 1)
|
||||||
|
go func() {
|
||||||
|
ch <- struct{}{}
|
||||||
|
}()
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
tp, _ := auth.NewTokenProvider(zaptest.NewLogger(t), tokenTypeSimple, dummyIndexWaiter, simpleTokenTTLDefault)
|
||||||
|
as := auth.NewAuthStore(lg, schema.NewAuthBackend(lg, b), tp, bcrypt.MinCost)
|
||||||
|
|
||||||
|
aa := authApplierV3{as: as}
|
||||||
|
assert.NoError(t, aa.checkLeasePutsKeys(lease.NewLease(lease.LeaseID(1), 3600)), "auth is disabled, should allow puts")
|
||||||
|
assert.NoError(t, enableAuthAndCreateRoot(aa.as), "error while enabling auth")
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "root"}
|
||||||
|
assert.NoError(t, aa.checkLeasePutsKeys(lease.NewLease(lease.LeaseID(1), 3600)), "auth is enabled, should allow puts for root")
|
||||||
|
|
||||||
|
l := lease.NewLease(lease.LeaseID(1), 3600)
|
||||||
|
l.SetLeaseItem(lease.LeaseItem{Key: "a"})
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "bob", Revision: 0}
|
||||||
|
assert.ErrorIs(t, aa.checkLeasePutsKeys(l), auth.ErrUserEmpty, "auth is enabled, should not allow bob, non existing at rev 0")
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "bob", Revision: 1}
|
||||||
|
assert.ErrorIs(t, aa.checkLeasePutsKeys(l), auth.ErrAuthOldRevision, "auth is enabled, old revision")
|
||||||
|
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "bob", Revision: aa.as.Revision()}
|
||||||
|
assert.ErrorIs(t, aa.checkLeasePutsKeys(l), auth.ErrPermissionDenied, "auth is enabled, bob does not have permissions, bob does not exist")
|
||||||
|
_, err := aa.as.UserAdd(&pb.AuthUserAddRequest{Name: "bob", Options: &authpb.UserAddOptions{NoPassword: true}})
|
||||||
|
assert.NoError(t, err, "bob should be added without error")
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "bob", Revision: aa.as.Revision()}
|
||||||
|
assert.ErrorIs(t, aa.checkLeasePutsKeys(l), auth.ErrPermissionDenied, "auth is enabled, bob exists yet does not have permissions")
|
||||||
|
|
||||||
|
// allow bob to access "a"
|
||||||
|
_, err = aa.as.RoleAdd(&pb.AuthRoleAddRequest{Name: "bobsrole"})
|
||||||
|
assert.NoError(t, err, "bobsrole should be added without error")
|
||||||
|
_, err = aa.as.RoleGrantPermission(&pb.AuthRoleGrantPermissionRequest{
|
||||||
|
Name: "bobsrole",
|
||||||
|
Perm: &authpb.Permission{
|
||||||
|
PermType: authpb.READWRITE,
|
||||||
|
Key: []byte("a"),
|
||||||
|
RangeEnd: nil,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
assert.NoError(t, err, "bobsrole should be granted permissions without error")
|
||||||
|
_, err = aa.as.UserGrantRole(&pb.AuthUserGrantRoleRequest{
|
||||||
|
User: "bob",
|
||||||
|
Role: "bobsrole",
|
||||||
|
})
|
||||||
|
assert.NoError(t, err, "bob should be granted bobsrole without error")
|
||||||
|
|
||||||
|
aa.authInfo = auth.AuthInfo{Username: "bob", Revision: aa.as.Revision()}
|
||||||
|
assert.NoError(t, aa.checkLeasePutsKeys(l), "bob should be able to access key 'a'")
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func enableAuthAndCreateRoot(as auth.AuthStore) error {
|
||||||
|
_, err := as.UserAdd(&pb.AuthUserAddRequest{
|
||||||
|
Name: "root",
|
||||||
|
HashedPassword: encodePassword("root"),
|
||||||
|
Options: &authpb.UserAddOptions{NoPassword: false}})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = as.RoleAdd(&pb.AuthRoleAddRequest{Name: "root"})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = as.UserGrantRole(&pb.AuthUserGrantRoleRequest{User: "root", Role: "root"})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return as.AuthEnable()
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodePassword(s string) string {
|
||||||
|
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(s), bcrypt.MinCost)
|
||||||
|
return base64.StdEncoding.EncodeToString(hashedPassword)
|
||||||
|
}
|
|
@ -86,7 +86,6 @@ func (h hasherAdapter) TriggerCorruptAlarm(memberID types.ID) {
|
||||||
// before serving any peer/client traffic. Only mismatch when hashes
|
// before serving any peer/client traffic. Only mismatch when hashes
|
||||||
// are different at requested revision, with same compact revision.
|
// are different at requested revision, with same compact revision.
|
||||||
func (cm *corruptionChecker) InitialCheck() error {
|
func (cm *corruptionChecker) InitialCheck() error {
|
||||||
|
|
||||||
cm.lg.Info(
|
cm.lg.Info(
|
||||||
"starting initial corruption check",
|
"starting initial corruption check",
|
||||||
zap.String("local-member-id", cm.hasher.MemberId().String()),
|
zap.String("local-member-id", cm.hasher.MemberId().String()),
|
||||||
|
@ -260,7 +259,7 @@ func (cm *corruptionChecker) PeriodicCheck() error {
|
||||||
// have different hashes.
|
// have different hashes.
|
||||||
//
|
//
|
||||||
// We might miss opportunity to perform the check if the compaction is still
|
// We might miss opportunity to perform the check if the compaction is still
|
||||||
// ongoing on one of the members or it was unresponsive. In such situation the
|
// ongoing on one of the members, or it was unresponsive. In such situation the
|
||||||
// method still passes without raising alarm.
|
// method still passes without raising alarm.
|
||||||
func (cm *corruptionChecker) CompactHashCheck() {
|
func (cm *corruptionChecker) CompactHashCheck() {
|
||||||
cm.lg.Info("starting compact hash check",
|
cm.lg.Info("starting compact hash check",
|
||||||
|
@ -269,12 +268,13 @@ func (cm *corruptionChecker) CompactHashCheck() {
|
||||||
)
|
)
|
||||||
hashes := cm.uncheckedRevisions()
|
hashes := cm.uncheckedRevisions()
|
||||||
// Assume that revisions are ordered from largest to smallest
|
// Assume that revisions are ordered from largest to smallest
|
||||||
for _, hash := range hashes {
|
for i, hash := range hashes {
|
||||||
peers := cm.hasher.PeerHashByRev(hash.Revision)
|
peers := cm.hasher.PeerHashByRev(hash.Revision)
|
||||||
if len(peers) == 0 {
|
if len(peers) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if cm.checkPeerHashes(hash, peers) {
|
if cm.checkPeerHashes(hash, peers) {
|
||||||
|
cm.lg.Info("finished compaction hash check", zap.Int("number-of-hashes-checked", i+1))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1202,8 +1202,8 @@ func (s *EtcdServer) MoveLeader(ctx context.Context, lead, transferee uint64) er
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TransferLeadership transfers the leader to the chosen transferee.
|
// TryTransferLeadershipOnShutdown transfers the leader to the chosen transferee. It is only used in server graceful shutdown.
|
||||||
func (s *EtcdServer) TransferLeadership() error {
|
func (s *EtcdServer) TryTransferLeadershipOnShutdown() error {
|
||||||
lg := s.Logger()
|
lg := s.Logger()
|
||||||
if !s.isLeader() {
|
if !s.isLeader() {
|
||||||
lg.Info(
|
lg.Info(
|
||||||
|
@ -1253,7 +1253,7 @@ func (s *EtcdServer) HardStop() {
|
||||||
// Do and Process cannot be called after Stop has been invoked.
|
// Do and Process cannot be called after Stop has been invoked.
|
||||||
func (s *EtcdServer) Stop() {
|
func (s *EtcdServer) Stop() {
|
||||||
lg := s.Logger()
|
lg := s.Logger()
|
||||||
if err := s.TransferLeadership(); err != nil {
|
if err := s.TryTransferLeadershipOnShutdown(); err != nil {
|
||||||
lg.Warn("leadership transfer failed", zap.String("local-member-id", s.MemberId().String()), zap.Error(err))
|
lg.Warn("leadership transfer failed", zap.String("local-member-id", s.MemberId().String()), zap.Error(err))
|
||||||
}
|
}
|
||||||
s.HardStop()
|
s.HardStop()
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue