Compare commits
1 Commits
master
...
storage-do
Author | SHA1 | Date |
---|---|---|
Piotr Tabor | f3b1dc54a4 |
|
@ -1,102 +1,92 @@
|
|||
---
|
||||
name: Bug Report
|
||||
description: Report a bug encountered while operating etcd
|
||||
description: Report a bug encountered while operating Etcd
|
||||
labels:
|
||||
- type/bug
|
||||
- type/bug
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: confirmations
|
||||
attributes:
|
||||
label: Bug report criteria
|
||||
description: Please confirm this bug report meets the following criteria.
|
||||
options:
|
||||
- label: This bug report is not security related, security issues should be disclosed privately via security@etcd.io.
|
||||
- label: This is not a support request, support requests should be raised in the etcd [discussion forums](https://github.com/etcd-io/etcd/discussions).
|
||||
- label: You have read the etcd [bug reporting guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md).
|
||||
- label: Existing open issues along with etcd [frequently asked questions](https://etcd.io/docs/latest/faq) have been checked and this is not a duplicate.
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please read https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md
|
||||
If this matter is security related, please disclose it privately via security@etcd.io.
|
||||
Please fill the form below and provide as much information as possible.
|
||||
Not doing so may result in your bug not being addressed in a timely manner.
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Please fill the form below and provide as much information as possible.
|
||||
Not doing so may result in your bug not being addressed in a timely manner.
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: What happened?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
label: What happened?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: What did you expect to happen?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: expected
|
||||
attributes:
|
||||
label: What did you expect to happen?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: repro
|
||||
attributes:
|
||||
label: How can we reproduce it (as minimally and precisely as possible)?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: repro
|
||||
attributes:
|
||||
label: How can we reproduce it (as minimally and precisely as possible)?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
||||
- type: textarea
|
||||
id: etcdVersion
|
||||
attributes:
|
||||
label: Etcd version (please run commands below)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
- type: textarea
|
||||
id: etcdVersion
|
||||
attributes:
|
||||
label: Etcd version (please run commands below)
|
||||
value: |
|
||||
<details>
|
||||
```console
|
||||
$ etcd --version
|
||||
# paste output here
|
||||
|
||||
```console
|
||||
$ etcd --version
|
||||
# paste output here
|
||||
$ etcdctl version
|
||||
# paste output here
|
||||
```
|
||||
|
||||
$ etcdctl version
|
||||
# paste output here
|
||||
```
|
||||
</details>
|
||||
validations:
|
||||
required: true
|
||||
|
||||
</details>
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: config
|
||||
attributes:
|
||||
label: Etcd configuration (command line flags or environment variables)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
- type: textarea
|
||||
id: config
|
||||
attributes:
|
||||
label: Etcd configuration (command line flags or environment variables)
|
||||
value: |
|
||||
<details>
|
||||
# paste your configuration here
|
||||
|
||||
# paste your configuration here
|
||||
</details>
|
||||
|
||||
</details>
|
||||
- type: textarea
|
||||
id: etcdDebugInformation
|
||||
attributes:
|
||||
label: Etcd debug information (please run commands below, feel free to obfuscate the IP address or FQDN in the output)
|
||||
value: |
|
||||
<details>
|
||||
|
||||
- type: textarea
|
||||
id: etcdDebugInformation
|
||||
attributes:
|
||||
label: Etcd debug information (please run commands below, feel free to obfuscate the IP address or FQDN in the output)
|
||||
value: |
|
||||
<details>
|
||||
```console
|
||||
$ etcdctl member list -w table
|
||||
# paste output here
|
||||
|
||||
```console
|
||||
$ etcdctl member list -w table
|
||||
# paste output here
|
||||
$ etcdctl --endpoints=<member list> endpoint status -w table
|
||||
# paste output here
|
||||
```
|
||||
|
||||
$ etcdctl --endpoints=<member list> endpoint status -w table
|
||||
# paste output here
|
||||
```
|
||||
</details>
|
||||
|
||||
</details>
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: Shell
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: shell
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Question
|
||||
url: https://github.com/etcd-io/etcd/discussions
|
||||
about: Question relating to Etcd
|
||||
- name: Question
|
||||
url: https://github.com/etcd-io/etcd/discussions
|
||||
about: Question relating to Etcd
|
||||
|
|
|
@ -1,19 +1,18 @@
|
|||
---
|
||||
name: Feature request
|
||||
description: Provide idea for a new feature
|
||||
labels:
|
||||
- type/feature
|
||||
- type/feature
|
||||
body:
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: What would you like to be added?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: What would you like to be added?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: Why is this needed?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: Why is this needed?
|
||||
validations:
|
||||
required: true
|
||||
|
|
|
@ -1,31 +1,30 @@
|
|||
---
|
||||
name: Membership nomination
|
||||
description: Nominate new etcd members
|
||||
labels:
|
||||
- area/community
|
||||
- area/community
|
||||
body:
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: Who would you like to nominate?
|
||||
validations:
|
||||
- type: textarea
|
||||
id: feature
|
||||
attributes:
|
||||
label: Who would you like to nominate?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- id: requirements
|
||||
type: checkboxes
|
||||
attributes:
|
||||
label: Requirements
|
||||
options:
|
||||
- label: I have reviewed the [community membership guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md)
|
||||
required: true
|
||||
- label: The members are actively contributing to 1 or more etcd subprojects
|
||||
required: true
|
||||
- label: The members are being sponsored by two current reviewers or a current maintainer.
|
||||
required: true
|
||||
|
||||
- id: requirements
|
||||
type: checkboxes
|
||||
attributes:
|
||||
label: Requirements
|
||||
options:
|
||||
- label: I have reviewed the [community membership guidelines](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md)
|
||||
required: true
|
||||
- label: The members are actively contributing to 1 or more etcd subprojects
|
||||
required: true
|
||||
- label: The members are being sponsored by two current reviewers or a current maintainer.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: How do the new members meet the regular active contribution requirements?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: rationale
|
||||
attributes:
|
||||
label: How do the new members meet the regular active contribution requirements?
|
||||
validations:
|
||||
required: true
|
||||
|
|
|
@ -1,34 +1,33 @@
|
|||
---
|
||||
name: Flaking Test
|
||||
description: Report flaky tests
|
||||
labels:
|
||||
- type/flake
|
||||
- type/flake
|
||||
body:
|
||||
- type: textarea
|
||||
id: workflows
|
||||
attributes:
|
||||
label: Which github workflows are flaking?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: workflows
|
||||
attributes:
|
||||
label: Which github workflows are flaking?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: tests
|
||||
attributes:
|
||||
label: Which tests are flaking?
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: tests
|
||||
attributes:
|
||||
label: Which tests are flaking?
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: link
|
||||
attributes:
|
||||
label: Github Action link
|
||||
- type: input
|
||||
id: link
|
||||
attributes:
|
||||
label: Github Action link
|
||||
|
||||
- type: textarea
|
||||
id: reason
|
||||
attributes:
|
||||
label: Reason for failure (if possible)
|
||||
- type: textarea
|
||||
id: reason
|
||||
attributes:
|
||||
label: Reason for failure (if possible)
|
||||
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
||||
- type: textarea
|
||||
id: additional
|
||||
attributes:
|
||||
label: Anything else we need to know?
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: github-actions
|
||||
|
@ -11,11 +10,11 @@ updates:
|
|||
schedule:
|
||||
interval: weekly
|
||||
allow:
|
||||
- dependency-type: all
|
||||
- dependency-type: all
|
||||
|
||||
- package-ecosystem: gomod
|
||||
directory: /tools/mod # Not linked from /go.mod
|
||||
schedule:
|
||||
interval: weekly
|
||||
allow:
|
||||
- dependency-type: all
|
||||
- dependency-type: all
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
|
@ -28,7 +27,11 @@ exemptAssignees: false
|
|||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking as stale. Set to `false` to disable
|
||||
markComment: This issue has been automatically marked as stale because it has not had recent activity. It will be closed after 21 days if no further activity occurs. Thank you for your contributions.
|
||||
markComment: >
|
||||
This issue has been automatically marked as stale because it has not had
|
||||
recent activity. It will be closed after 21 days if no further activity
|
||||
occurs. Thank you for your contributions.
|
||||
|
||||
# Comment to post when removing the stale label.
|
||||
# unmarkComment: >
|
||||
# Your comment here.
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
---
|
||||
name: Build
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
|
@ -20,12 +22,10 @@ jobs:
|
|||
- linux-ppc64le
|
||||
- linux-s390x
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
|
@ -11,15 +10,18 @@
|
|||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
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:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [main]
|
||||
branches: [ main ]
|
||||
schedule:
|
||||
- cron: '20 14 * * 5'
|
||||
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
|
@ -28,28 +30,44 @@ jobs:
|
|||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'go' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
language: ['go']
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
with:
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
languages: ${{ matrix.language }}
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # v2.20.0
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # v2.2.12
|
||||
|
||||
# ℹ️ 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
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.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
|
||||
on: [push]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
coverage:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-coverage
|
||||
- linux-amd64-coverage
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
mkdir "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-coverage)
|
||||
GOARCH=amd64 ./scripts/codecov_upload.sh
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
mkdir "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-coverage)
|
||||
GOARCH=amd64 ./scripts/codecov_upload.sh
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -1,45 +1,40 @@
|
|||
---
|
||||
name: E2E-arm64
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 1 * * *' # runs daily at 1am.
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
# this is to prevent the job to run at forked projects
|
||||
if: github.repository == 'etcd-io/etcd'
|
||||
runs-on: [self-hosted, Linux, ARM64]
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
runs-on: [Linux, ARM64]
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-arm64-e2e
|
||||
- linux-arm64-e2e
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
ref: main
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-arm64-e2e)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-arm64-e2e)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -1,39 +1,39 @@
|
|||
---
|
||||
name: E2E
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-e2e
|
||||
- linux-386-e2e
|
||||
- linux-amd64-e2e
|
||||
- linux-386-e2e
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-e2e)
|
||||
VERBOSE=1 GOOS=linux GOARCH=amd64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
;;
|
||||
linux-386-e2e)
|
||||
VERBOSE=1 GOOS=linux GOARCH=386 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-e2e)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e-release
|
||||
;;
|
||||
linux-386-e2e)
|
||||
GOOS=linux GOARCH=386 CPU=4 EXPECT_DEBUG=true RACE=true make test-e2e
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -1,26 +1,26 @@
|
|||
---
|
||||
name: Fuzzing v3rpc
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
fuzzing:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: false
|
||||
env:
|
||||
TARGET_PATH: ./server/etcdserver/api/v3rpc
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
||||
GOARCH=amd64 CPU=4 make fuzz
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: failure()
|
||||
with:
|
||||
path: "${{env.TARGET_PATH}}/testdata/fuzz/**/*"
|
||||
GOARCH=amd64 CPU=4 make fuzz
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: failure()
|
||||
with:
|
||||
path: "${{env.TARGET_PATH}}/testdata/fuzz/**/*"
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
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
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- run: |
|
||||
set -euo pipefail
|
||||
|
|
|
@ -1,38 +1,39 @@
|
|||
---
|
||||
name: grpcProxy-tests
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-grpcproxy-integration
|
||||
- linux-amd64-grpcproxy-e2e
|
||||
- linux-amd64-grpcproxy-integration
|
||||
- linux-amd64-grpcproxy-e2e
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-grpcproxy-integration)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-integration
|
||||
;;
|
||||
linux-amd64-grpcproxy-e2e)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-e2e
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
echo "${TARGET}"
|
||||
case "${TARGET}" in
|
||||
linux-amd64-grpcproxy-integration)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-integration
|
||||
;;
|
||||
linux-amd64-grpcproxy-e2e)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true make test-grpcproxy-e2e
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
name: Measure Test Flakiness
|
||||
|
||||
on:
|
||||
|
@ -12,12 +11,12 @@ jobs:
|
|||
name: Measure Test Flakiness
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
./scripts/measure-test-flakiness.sh
|
||||
make bin/etcd-test-analyzer
|
||||
bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main
|
||||
./scripts/measure-test-flakiness.sh
|
||||
make bin/etcd-test-analyzer
|
||||
bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main
|
||||
|
|
|
@ -1,34 +1,34 @@
|
|||
---
|
||||
name: Release
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
main:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: release
|
||||
run: |
|
||||
set -euo pipefail
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- name: release
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
git config --global user.email "github-action@etcd.io"
|
||||
git config --global user.name "Github Action"
|
||||
gpg --batch --gen-key <<EOF
|
||||
%no-protection
|
||||
Key-Type: 1
|
||||
Key-Length: 2048
|
||||
Subkey-Type: 1
|
||||
Subkey-Length: 2048
|
||||
Name-Real: Github Action
|
||||
Name-Email: github-action@etcd.io
|
||||
Expire-Date: 0
|
||||
EOF
|
||||
DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99
|
||||
- name: test-image
|
||||
run: |
|
||||
VERSION=3.6.99 ./scripts/test_images.sh
|
||||
git config --global user.email "github-action@etcd.io"
|
||||
git config --global user.name "Github Action"
|
||||
gpg --batch --gen-key <<EOF
|
||||
%no-protection
|
||||
Key-Type: 1
|
||||
Key-Length: 2048
|
||||
Subkey-Type: 1
|
||||
Subkey-Length: 2048
|
||||
Name-Real: Github Action
|
||||
Name-Email: github-action@etcd.io
|
||||
Expire-Date: 0
|
||||
EOF
|
||||
DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99
|
||||
- name: test-image
|
||||
run: |
|
||||
VERSION=3.6.99 ./scripts/test_images.sh
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
name: Robustness Nightly
|
||||
permissions: read-all
|
||||
on:
|
||||
|
@ -15,14 +14,6 @@ jobs:
|
|||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: main
|
||||
main-arm64:
|
||||
uses: ./.github/workflows/robustness-template-arm64.yaml
|
||||
with:
|
||||
etcdBranch: main
|
||||
count: 100
|
||||
testTimeout: 200m
|
||||
artifactName: main-arm64
|
||||
runs-on: "['self-hosted', 'Linux', 'ARM64']"
|
||||
release-35:
|
||||
uses: ./.github/workflows/robustness-template.yaml
|
||||
with:
|
||||
|
|
|
@ -1,72 +0,0 @@
|
|||
---
|
||||
name: Reusable Robustness Workflow
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
etcdBranch:
|
||||
required: true
|
||||
type: string
|
||||
count:
|
||||
required: true
|
||||
type: number
|
||||
testTimeout:
|
||||
required: false
|
||||
type: string
|
||||
default: '30m'
|
||||
artifactName:
|
||||
required: true
|
||||
type: string
|
||||
runs-on:
|
||||
required: false
|
||||
type: string
|
||||
default: "['ubuntu-latest']"
|
||||
permissions: read-all
|
||||
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 210
|
||||
runs-on: ${{ fromJson(inputs.runs-on) }}
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: test-robustness
|
||||
env:
|
||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
|
||||
# Use --failfast to avoid overriding report generated by failed test
|
||||
GO_TEST_FLAGS="-v --count ${{ inputs.count }} --timeout ${{ inputs.testTimeout }} --failfast --run TestRobustness"
|
||||
case "${ETCD_BRANCH}" in
|
||||
release-3.5)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.5
|
||||
;;
|
||||
release-3.4)
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness-release-3.4
|
||||
;;
|
||||
main)
|
||||
make gofail-enable
|
||||
make build
|
||||
EXPECT_DEBUG=true GO_TEST_FLAGS=${GO_TEST_FLAGS} RESULTS_DIR=/tmp/results make test-robustness
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target ${ETCD_BRANCH}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ inputs.artifactName }}
|
||||
path: /tmp/results/*
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
name: Reusable Robustness Workflow
|
||||
on:
|
||||
workflow_call:
|
||||
|
@ -16,50 +15,46 @@ on:
|
|||
artifactName:
|
||||
required: true
|
||||
type: string
|
||||
runs-on:
|
||||
required: false
|
||||
type: string
|
||||
default: "['ubuntu-latest']"
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
timeout-minutes: 210
|
||||
runs-on: ${{ fromJson(inputs.runs-on) }}
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- name: test-robustness
|
||||
env:
|
||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- name: test-robustness
|
||||
env:
|
||||
ETCD_BRANCH: "${{ inputs.etcdBranch }}"
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
# 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/*
|
||||
# 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@v2
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ inputs.artifactName }}
|
||||
path: /tmp/results/*
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
name: Robustness
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
name: Scorecards supply-chain security
|
||||
on:
|
||||
# Only the default branch is supported.
|
||||
|
@ -6,7 +5,7 @@ on:
|
|||
schedule:
|
||||
- cron: '45 1 * * 0'
|
||||
push:
|
||||
branches: ["main"]
|
||||
branches: [ "main" ]
|
||||
|
||||
# Declare default permissions as read only.
|
||||
permissions: read-all
|
||||
|
@ -23,7 +22,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: "Checkout code"
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # tag=v3.0.0
|
||||
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # tag=v3.0.0
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
|
@ -50,6 +49,6 @@ jobs:
|
|||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@6c089f53dd51dc3fc7e599c3cb5356453a52ca9e # tag=v1.0.26
|
||||
uses: github/codeql-action/upload-sarif@7df0ce34898d659f95c0c4a09eaa8d4e32ee64db # tag=v1.0.26
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
|
|
@ -1,24 +1,23 @@
|
|||
---
|
||||
name: Static Analysis
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
run:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3.6.0
|
||||
uses: golangci/golangci-lint-action@08e2f20817b15149a52b5b3ebe7de50aff2ba8c5 # v3.4.0
|
||||
with:
|
||||
version: v1.49.0
|
||||
args: --config tools/.golangci.yaml
|
||||
- name: protoc
|
||||
uses: arduino/setup-protoc@149f6c87b92550901b26acd1632e11c3662e381f # v1.3.0
|
||||
uses: arduino/setup-protoc@64c0c85d18e984422218383b81c52f8b077404d3 # v1.1.2
|
||||
with:
|
||||
version: '3.14.0'
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
|
@ -1,62 +1,56 @@
|
|||
---
|
||||
name: Tests-arm64
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *' # runs daily at 1:30 am.
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
# this is to prevent the job to run at forked projects
|
||||
if: github.repository == 'etcd-io/etcd'
|
||||
runs-on: [self-hosted, Linux, ARM64]
|
||||
container: golang:1.19-bullseye
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
runs-on: [Linux, ARM64]
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-arm64-integration-1-cpu
|
||||
- linux-arm64-integration-2-cpu
|
||||
- linux-arm64-integration-4-cpu
|
||||
- linux-arm64-unit-4-cpu-race
|
||||
- linux-arm64-integration-1-cpu
|
||||
- linux-arm64-integration-2-cpu
|
||||
- linux-arm64-integration-4-cpu
|
||||
- linux-arm64-unit-4-cpu-race
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
# https://github.com/actions/checkout/issues/1169
|
||||
- run: git config --system --add safe.directory '*'
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
ref: main
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
case "${TARGET}" in
|
||||
linux-arm64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=1 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=2 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 make test-integration
|
||||
;;
|
||||
linux-arm64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
case "${TARGET}" in
|
||||
linux-arm64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=1 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=2 make test-integration
|
||||
;;
|
||||
linux-arm64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 make test-integration
|
||||
;;
|
||||
linux-arm64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=arm64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
||||
|
|
|
@ -1,56 +1,56 @@
|
|||
---
|
||||
name: Tests
|
||||
on: [push, pull_request]
|
||||
permissions: read-all
|
||||
jobs:
|
||||
goversion:
|
||||
uses: ./.github/workflows/go-version.yaml
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
needs: goversion
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target:
|
||||
- linux-amd64-integration-1-cpu
|
||||
- linux-amd64-integration-2-cpu
|
||||
- linux-amd64-integration-4-cpu
|
||||
- linux-amd64-unit-4-cpu-race
|
||||
- linux-386-unit-1-cpu
|
||||
- linux-amd64-integration-1-cpu
|
||||
- linux-amd64-integration-2-cpu
|
||||
- linux-amd64-integration-4-cpu
|
||||
- linux-amd64-unit-4-cpu-race
|
||||
- linux-386-unit-1-cpu
|
||||
steps:
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
- id: goversion
|
||||
run: echo "goversion=$(cat .go-version)" >> "$GITHUB_OUTPUT"
|
||||
- uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1
|
||||
with:
|
||||
go-version: ${{ steps.goversion.outputs.goversion }}
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
go clean -testcache
|
||||
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
|
||||
- uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0
|
||||
with:
|
||||
go-version: ${{ needs.goversion.outputs.goversion }}
|
||||
- run: date
|
||||
- env:
|
||||
TARGET: ${{ matrix.target }}
|
||||
run: |
|
||||
set -euo pipefail
|
||||
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
case "${TARGET}" in
|
||||
linux-amd64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=1 make test-integration
|
||||
;;
|
||||
linux-amd64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=2 make test-integration
|
||||
;;
|
||||
linux-amd64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 make test-integration
|
||||
;;
|
||||
linux-amd64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
;;
|
||||
linux-386-unit-1-cpu)
|
||||
GOOS=linux GOARCH=386 CPU=1 GO_TEST_FLAGS='-p=4' make test-unit
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
||||
mkdir "${TARGET}"
|
||||
export JUNIT_REPORT_DIR=$(realpath ${TARGET})
|
||||
case "${TARGET}" in
|
||||
linux-amd64-integration-1-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=1 make test-integration
|
||||
;;
|
||||
linux-amd64-integration-2-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=2 make test-integration
|
||||
;;
|
||||
linux-amd64-integration-4-cpu)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 make test-integration
|
||||
;;
|
||||
linux-amd64-unit-4-cpu-race)
|
||||
GOOS=linux GOARCH=amd64 CPU=4 RACE=true GO_TEST_FLAGS='-p=2' make test-unit
|
||||
;;
|
||||
linux-386-unit-1-cpu)
|
||||
GOOS=linux GOARCH=386 CPU=1 GO_TEST_FLAGS='-p=4' make test-unit
|
||||
;;
|
||||
*)
|
||||
echo "Failed to find target"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
- uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
|
||||
if: always()
|
||||
with:
|
||||
path: ./**/junit_*.xml
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
1.19.10
|
|
@ -1,22 +1,25 @@
|
|||
---
|
||||
run:
|
||||
timeout: 30m
|
||||
skip-files: [^zz_generated.*]
|
||||
skip-files:
|
||||
- "^zz_generated.*"
|
||||
|
||||
issues:
|
||||
max-same-issues: 0
|
||||
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||
exclude-rules:
|
||||
# exclude ineffassing linter for generated files for conversion
|
||||
- path: conversion\.go
|
||||
linters: [ineffassign]
|
||||
linters:
|
||||
- ineffassign
|
||||
|
||||
linters:
|
||||
disable-all: true
|
||||
enable: # please keep this alphabetized
|
||||
# Don't use soon to deprecated[1] linters that lead to false
|
||||
# https://github.com/golangci/golangci-lint/issues/1841
|
||||
# - deadcode
|
||||
# - structcheck
|
||||
# - varcheck
|
||||
# Don't use soon to deprecated[1] linters that lead to false
|
||||
# https://github.com/golangci/golangci-lint/issues/1841
|
||||
# - deadcode
|
||||
# - structcheck
|
||||
# - varcheck
|
||||
- goimports
|
||||
- ineffassign
|
||||
- revive
|
||||
|
@ -24,14 +27,15 @@ linters:
|
|||
- stylecheck
|
||||
- unused
|
||||
- unconvert # Remove unnecessary type conversions
|
||||
|
||||
linters-settings: # please keep this alphabetized
|
||||
goimports:
|
||||
local-prefixes: go.etcd.io # Put imports beginning with prefix after 3rd-party packages.
|
||||
staticcheck:
|
||||
checks:
|
||||
- all
|
||||
- -SA1019 # TODO(fix) Using a deprecated function, variable, constant or field
|
||||
- -SA2002 # TODO(fix) Called testing.T.FailNow or SkipNow in a goroutine, which isn’t allowed
|
||||
- "all"
|
||||
- "-SA1019" # TODO(fix) Using a deprecated function, variable, constant or field
|
||||
- "-SA2002" # TODO(fix) Called testing.T.FailNow or SkipNow in a goroutine, which isn’t allowed
|
||||
stylecheck:
|
||||
checks:
|
||||
- ST1019 # Importing the same package multiple times.
|
||||
- "ST1019" # Importing the same package multiple times.
|
|
@ -4,23 +4,6 @@ Previous change logs can be found at [CHANGELOG-3.3](https://github.com/etcd-io/
|
|||
|
||||
<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)
|
||||
|
||||
### etcd server
|
||||
|
|
|
@ -4,28 +4,7 @@ Previous change logs can be found at [CHANGELOG-3.4](https://github.com/etcd-io/
|
|||
|
||||
<hr>
|
||||
|
||||
## v3.5.10 (tbd)
|
||||
|
||||
### etcd server
|
||||
- Fix [corruption check may get a `ErrCompacted` error when server has just been compacted](https://github.com/etcd-io/etcd/pull/16048)
|
||||
- Improve [Lease put performance for the case that auth is disabled or the user is admin](https://github.com/etcd-io/etcd/pull/16019)
|
||||
|
||||
### etcd grpc-proxy
|
||||
- Fix [Memberlist results not updated when proxy node down](https://github.com/etcd-io/etcd/pull/15907).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.9 (2023-05-11)
|
||||
|
||||
### etcd server
|
||||
- Fix [LeaseTimeToLive API may return keys to clients which have no read permission on the keys](https://github.com/etcd-io/etcd/pull/15815).
|
||||
|
||||
### Dependencies
|
||||
- Compile binaries using [go 1.19.9](https://github.com/etcd-io/etcd/pull/15822).
|
||||
|
||||
<hr>
|
||||
|
||||
## v3.5.8 (2023-04-13)
|
||||
## v3.5.8 (TBD)
|
||||
|
||||
### 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.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## Production recommendation
|
||||
|
||||
The minimum recommended etcd versions to run in **production** are v3.4.22+ and v3.5.6+. Refer to the [versioning policy](https://etcd.io/docs/v3.5/op-guide/versioning/) for more details.
|
||||
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.
|
||||
|
||||
### v3.5 data corruption issue
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
ARG ARCH=amd64
|
||||
FROM --platform=linux/${ARCH} gcr.io/distroless/static-debian11
|
||||
FROM --platform=linux/amd64 gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/arm64 gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/ppc64le gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -0,0 +1,13 @@
|
|||
FROM --platform=linux/s390x gcr.io/distroless/static-debian11
|
||||
|
||||
ADD etcd /usr/local/bin/
|
||||
ADD etcdctl /usr/local/bin/
|
||||
ADD etcdutl /usr/local/bin/
|
||||
|
||||
WORKDIR /var/etcd/
|
||||
WORKDIR /var/lib/etcd/
|
||||
|
||||
EXPOSE 2379 2380
|
||||
|
||||
# Define default command.
|
||||
CMD ["/usr/local/bin/etcd"]
|
|
@ -112,19 +112,8 @@ depend on to make decisions in the best interest of the project in a consistent
|
|||
- Initiating, contributing and resolving discussions (emails, GitHub issues, meetings)
|
||||
- Identifying subtle or complex issues in designs and implementation PRs
|
||||
- Directly contributed to the project through implementation and / or review
|
||||
- Sponsored by two active maintainers and elected by supermajority
|
||||
- Sponsors must be from multiple member companies to demonstrate integration across community.
|
||||
- To become a maintainer send an email with your candidacy to [etcd-maintainers-private@googlegroups.com]
|
||||
- Ensure your sponsors are @mentioned on the email
|
||||
- Include a list of contributions representative of your work on the project.
|
||||
- Existing maintainers vote will privately and respond to the email with either acceptance or with feedback for suggested improvement.
|
||||
- With your membership approved you are expected to:
|
||||
- Open a PR and add an entry to the [MAINTAINERS] file
|
||||
- Subscribe to [etcd-maintainers@googlegroups.com] and [etcd-maintainers-private@googlegroups.com]
|
||||
- Request to join to [etcd-maintainer teams of etcd organization of GitHub](https://github.com/orgs/etcd-io/teams/maintainers-etcd)
|
||||
- Request to join to the private slack channel for etcd maintainers on [kubernetes slack](http://slack.kubernetes.io/)
|
||||
- Request access to etcd-development GCP project where we publish releases
|
||||
- Request access to passwords shared between maintainers
|
||||
- Subscribed to [etcd-maintainers@googlegroups.com]
|
||||
- Elected by supermajority of active maintainers.
|
||||
|
||||
### Responsibilities and privileges
|
||||
|
||||
|
|
|
@ -1,102 +0,0 @@
|
|||
Dependency management
|
||||
======
|
||||
|
||||
# Table of Contents
|
||||
- **[Main branch](#main-branch)**
|
||||
- [Dependencies used in workflows](#dependencies-used-in-workflows)
|
||||
- [Bumping order](#bumping-order)
|
||||
- [Steps to bump a dependency](#steps-to-bump-a-dependency)
|
||||
- [Indirect dependencies](#indirect-dependencies)
|
||||
- [About gRPC](#about-grpc)
|
||||
- [Rotation worksheet](#rotation-worksheet)
|
||||
- **[Stable branches](#stable-branches)**
|
||||
|
||||
# Main branch
|
||||
|
||||
The dependabot is enabled & [configured](https://github.com/etcd-io/etcd/blob/main/.github/dependabot.yml) to
|
||||
manage dependencies for etcd `main` branch. But dependabot doesn't work well for multi-module repository like `etcd`,
|
||||
see [dependabot-core/issues/6678](https://github.com/dependabot/dependabot-core/issues/6678).
|
||||
Usually human intervention is required each time when dependabot automatically opens some PRs to bump dependencies.
|
||||
Please see guidance below.
|
||||
|
||||
## Dependencies used in workflows
|
||||
The PRs which automatically bump dependencies (see examples below) used in workflows are fine, and can be approved & merged directly as long as all checks are successful.
|
||||
- [build(deps): bump github/codeql-action from 2.2.11 to 2.2.12](https://github.com/etcd-io/etcd/pull/15736)
|
||||
- [build(deps): bump actions/checkout from 3.5.0 to 3.5.2](https://github.com/etcd-io/etcd/pull/15735)
|
||||
- [build(deps): bump ossf/scorecard-action from 2.1.2 to 2.1.3](https://github.com/etcd-io/etcd/pull/15607)
|
||||
|
||||
## Bumping order
|
||||
When multiple etcd modules depend on the same package, please bump the package version for all the modules in the correct order. The rule is simple:
|
||||
if module A depends on module B, then bump the dependency for module B before module A. If the two modules do not depend on each other, then
|
||||
it doesn't matter to bump which module first. For example, multiple modules depend on `github.com/spf13/cobra`, we need to bump the dependency
|
||||
in the following order,
|
||||
- go.etcd.io/etcd/pkg/v3
|
||||
- go.etcd.io/etcd/server/v3
|
||||
- go.etcd.io/etcd/etcdctl/v3
|
||||
- go.etcd.io/etcd/etcdutl/v3
|
||||
- go.etcd.io/etcd/tests/v3
|
||||
- go.etcd.io/etcd/v3
|
||||
- go.etcd.io/etcd/tools/v3
|
||||
For more details about etcd Golang modules, please check https://etcd.io/docs/next/dev-internal/modules/
|
||||
|
||||
Note the module `go.etcd.io/etcd/tools/v3` doesn't depend on any other modules, nor by any other modules, so it doesn't matter when to bump dependencies for it.
|
||||
|
||||
## Steps to bump a dependency
|
||||
Use the `github.com/spf13/cobra` as an example, follow steps below to bump it from 1.6.1 to 1.7.0 for module `go.etcd.io/etcd/etcdctl/v3`,
|
||||
```
|
||||
$ cd ${ETCD_ROOT_DIR}/etcdctl
|
||||
$ go get github.com/spf13/cobra@v1.7.0
|
||||
$ go mod tidy
|
||||
$ cd ..
|
||||
$ ./scripts/fix.sh
|
||||
```
|
||||
|
||||
Execute the same steps for all other modules. When you finish bumping the dependency for all modules, then commit the change,
|
||||
```
|
||||
$ git add .
|
||||
$ git commit --signoff -m "dependency: bump github.com/spf13/cobra from 1.6.1 to 1.7.0"
|
||||
```
|
||||
|
||||
Please close the related PRs which were automatically opened by dependabot.
|
||||
|
||||
When you bump multiple dependencies in one PR, it's recommended to create a separate commit for each dependency. But it isn't a must; for example,
|
||||
you can get all dependencies bumping for the module `go.etcd.io/etcd/tools/v3` included in one commit.
|
||||
|
||||
## Indirect dependencies
|
||||
Usually we don't bump a dependency if all modules just indirectly depend on it, such as `github.com/go-logr/logr`.
|
||||
|
||||
If an indirect dependency (e.g. `D1`) causes any CVE or bugs which affect etcd, usually the module (e.g. `M1`, not part of etcd, but used by etcd)
|
||||
which depends on it should bump the dependency (`D1`), and then etcd just needs to bump `M1`. However, if the module (`M1`) somehow doesn't
|
||||
bump the problematic dependency, then etcd can still bump it (`D1`) directly following the same steps above. But as a long-term solution, etcd should
|
||||
try to remove the dependency on such module (`M1`) that lack maintenance.
|
||||
|
||||
For mixed cases, in which some modules directly while others indirectly depend on a dependency, we have multiple options,
|
||||
- Bump the dependency for all modules, no matter it's direct or indirect dependency.
|
||||
- Bump the dependency only for modules which directly depend on it.
|
||||
|
||||
We should try to follow the first way, and temporarily fall back to the second one if we run into any issue on the first way. Eventually we
|
||||
should fix the issue and ensure all modules depend on the same version of the dependency.
|
||||
|
||||
## Known incompatible dependency updates
|
||||
|
||||
### arduino/setup-protoc
|
||||
Please refer to [build(deps): bump arduino/setup-protoc from 1.3.0 to 2.0.0](https://github.com/etcd-io/etcd/pull/16016)
|
||||
|
||||
### About gRPC
|
||||
There is a compatible issue between etcd and gRPC 1.52.0, and there is a pending PR [pull/15131](https://github.com/etcd-io/etcd/pull/15131).
|
||||
|
||||
The plan is to remove the dependency on some grpc-go's experimental API firstly, afterwards try to bump it again. Please get more details in
|
||||
[issues/15145](https://github.com/etcd-io/etcd/issues/15145).
|
||||
|
||||
`go.opentelemetry.io/otel` version update is indirectly blocked due to this gRPC issue. Please get more details in [pull/15810](https://github.com/etcd-io/etcd/pull/15810).
|
||||
|
||||
## Rotation worksheet
|
||||
The dependabot scheduling interval is weekly; it means dependabot will automatically raise a bunch of PRs per week.
|
||||
Usually human intervention is required each time. We have a [rotation worksheet](https://docs.google.com/spreadsheets/d/1DDWzbcOx1p32MhyelaPZ_SfYtAD6xRsrtGRZ9QXPOyQ/edit#gid=0),
|
||||
and everyone is welcome to participate; you just need to register your name in the worksheet.
|
||||
|
||||
# Stable branches
|
||||
Usually we don't proactively bump dependencies for stable releases unless there are any CVEs or bugs that affect etcd.
|
||||
|
||||
If we have to do it, then follow the same guidance above. Note that there is no `./scripts/fix.sh` in release-3.4, so no need to
|
||||
execute it for 3.4.
|
|
@ -0,0 +1,749 @@
|
|||
# Etcd persistent storage files
|
||||
|
||||
Last updated : etcd-v3.5 (2023-03-15)
|
||||
|
||||
|
||||
## Purpose
|
||||
|
||||
The document explains the etcd persistent storage format: naming, content and tools that allow developers to inspect them. Going forward the document should be extended with changes to the storage model. This document is targeted at etcd developers to help with their data recovery needs.
|
||||
|
||||
|
||||
## Prerequisites
|
||||
|
||||
The following articles provide helpful background information for this document:
|
||||
|
||||
* Etcd data model overview: https://etcd.io/docs/v3.4/learning/data_model
|
||||
* Raft overview: http://web.stanford.edu/~ouster/cgi-bin/papers/Raft-atc14.pdf (especially "5.3 Log replication" section).
|
||||
|
||||
|
||||
## Overview
|
||||
|
||||
### Long leaving files
|
||||
|
||||
<table style="border: 1px solid black;">
|
||||
<tr style="border: 1px solid black;">
|
||||
<td><strong>File name</strong></td>
|
||||
<td><strong>High level purpose</strong></td>
|
||||
</tr>
|
||||
|
||||
<tr style="outline: thin solid">
|
||||
<td>./member/snap/db</td>
|
||||
<td><strong>bbolt <a href="https://en.wikipedia.org/wiki/B%2B_tree">b+tree</a></strong> that stores all the applied data, membership authorization information & metadata. It’s aware of what's the last applied WAL log index (<a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/cindex/cindex.go#L92">"consistent_index"</a>).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr style="outline: thin solid">
|
||||
<td><pre>
|
||||
./member/snap/0000000000000002-0000000000049425.snap
|
||||
./member/snap/0000000000000002-0000000000061ace.snap
|
||||
</pre></td>
|
||||
<td>Periodic <strong>snapshots of legacy v2 store</strong>, containing:
|
||||
<ul>
|
||||
<li>basic membership information
|
||||
<li>etcd-version
|
||||
</ul>
|
||||
As of etcd v3, the content is redundant to the content of /snap/db files.
|
||||
|
||||
Periodically (<a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/server.go#L87">30s</a>) these files <a href="etcdserver/server.go:774">are purged</a>, and the last `--max-snapshots=5` are preserved.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr style="outline: thin solid">
|
||||
<td><pre>/member/snap/000000000007a178.snap.db</pre></td>
|
||||
<td>A complete <strong>bbolt snapshot downloaded</strong> from the etcd leader if the replica was lagging too much.
|
||||
<p>
|
||||
Has the same type of content as (./member/snap/db) file.
|
||||
<p>
|
||||
The file is used in 2 scenarios:
|
||||
<ul>
|
||||
<li>In response to the leader's request to recover from the snapshot.
|
||||
<li><a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/server.go#L444">During the server startup</a>, when the last snapshot (.snap.db file) is found and detected to be having a newer index than the consistent_index in the current `snap.db` file.</li>
|
||||
</ul>
|
||||
|
||||
Note: Periodic snapshots generated on each replica are only emitted in the form of *.snap file (not snap.db file). So there is no guarantee the most recent snapshot (in WAL log) has the *.snap.db file. But in such a case the backend (snap/db) is expected to be newer than the snapshot.
|
||||
|
||||
The file<a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/server.go#L1236"> is not being deleted when the recovery is over</a> (so whole content is populated to ./member/snap/db file) Periodically (<a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/server.go#L87">30s</a>) the files <a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/server.go#L774">are</a> purged.
|
||||
Here also `--max-snapshots=5` are preserved. As these files can be O(GBs) this might create a risk of disk space exhaustion.
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr style="outline: thin solid">
|
||||
<td><pre>
|
||||
./member/wal/000000000000000f-00000000000b38c7.wal
|
||||
./member/wal/000000000000000e-00000000000a7fe3.wal
|
||||
./member/wal/000000000000000d-000000000009c70c.wal
|
||||
</pre></td>
|
||||
<td><strong>Raft’s Write Ahead Logs</strong>, containing recent transactions accepted by Raft, periodic snapshots or CRC records.
|
||||
|
||||
Recent `--max-wals=5` files are being preserved. Each of these files is `~64*10^6` bytes. The file is cut when it exceeds this hardcoded size, so the files might slightly exceed that size (so the preallocated `0.tmp` does not offer full disk-exceeded protection).
|
||||
|
||||
If the snapshots are too infrequent, there can be more than `--max-wals=5`, as file-system level locks are protecting the files preventing them from being deleted too early.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr style="outline: thin solid">
|
||||
<td><pre>./member/wal/0.tmp (or .../1.tmp)</pre>
|
||||
</td>
|
||||
<td><strong>Preallocated space</strong> for the next write ahead log file.
|
||||
|
||||
Used to avoid Raft being stuck by a lack of WAL logs capacity without the possibility to raise an alarm.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
### Temporary files
|
||||
During etcd internal processing, it is possible that several short living files might be encountered:
|
||||
|
||||
|
||||
<table style="border: 1px solid black;">
|
||||
<tr style="outline: thin solid">
|
||||
<td><strong>File</strong>
|
||||
</td>
|
||||
<td><strong>High level purpose</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="outline: thin solid">
|
||||
<td>./member/snap/ \
|
||||
0000000000000002-000000000007a178.snap.broken \
|
||||
|
||||
</td>
|
||||
<td>Snapshot files are renamed as ‘broken’ when they cannot be loaded:
|
||||
<p>
|
||||
TODO: etcdserver/api/snap/snapshotter.go:148
|
||||
<p>
|
||||
The attempt to load the newest file happens when etcd is being started:
|
||||
<p>
|
||||
TODO: etcdserver/server.go:428 \
|
||||
Or during backup/migrate commands of etcdctl.
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="outline: thin solid">
|
||||
<td>/member/snap/tmp071677638 (random suffix)
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae9734ed278b7a1a7dfc82e800471ebbf9fce56f/etcdserver/api/snap/db.go#L39">Temporary</a> (bbolt) file created on replicas in response to the msgSnap leaders request, so to the demand from the leader to recover storage from the given snapshot.
|
||||
<p>
|
||||
After successful (complete) retrieval of content the file is <a href="https://github.com/etcd-io/etcd/blob/ae9734ed278b7a1a7dfc82e800471ebbf9fce56f/etcdserver/api/snap/db.go#L55">renamed</a> to: \
|
||||
/member/snap/<code>[SNAPSHOT-INDEX].snap.db \
|
||||
\
|
||||
</code>In case of a server dying / being killed in the middle of the files download, the files remain on disk and are never automatically cleaned.They can be substantial in size (GBs). \
|
||||
See <a href="https://github.com/etcd-io/etcd/issues/12837">etcd/issues/12837</a>. <strong>Fixed in etcd 3.5.</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="outline: thin solid">
|
||||
<td>/member/snap/db.tmp.071677638 (random suffix)
|
||||
</td>
|
||||
<td>A temporary file that contains a copy of the backend content (/member/snap/db), during the <a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/mvcc/backend/backend.go#L373">process of defragmentation</a>. After the successful process the file is renamed to /member/snap/db, replacing the original backend.
|
||||
<p>
|
||||
On etcd server startup these files get<a href="https://github.com/etcd-io/etcd/blob/a4570a60e771402360755beb7d662bdbca1f87f2/server/etcdserver/api/snap/snapshotter.go#L217"> pruned</a>.
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
## Bbolt b+tree: **member/snap/db **
|
||||
|
||||
This file contains the main etcd content, applied to a specific point of the Raft log (see [consistent_index](https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/cindex/cindex.go#L92)).
|
||||
|
||||
|
||||
### Physical organization
|
||||
|
||||
The better bolt storage is physically organized as a [b+tree](https://en.wikipedia.org/wiki/B%2B_tree). The physical pages of b-tree are never modified in-place[^1]. Instead, the content is copied to a new page (reclaimed from the freepages list) and the old page is added to the free-pages list as soon as there is no open transaction that might access it. Thanks to this process, an open RO transaction sees a consistent historical state of the storage. The RW transaction is exclusive and blocking all other RW transactions. \
|
||||
Big values are stored on multiple continuous pages. The process of page reclamation combined with a need to allocate contiguous areas of pages of different sizes might lead to growing fragmentation of the bbolt storage.
|
||||
|
||||
The bbolt file never shrinks on its own. Only in the defragmentation process, the file can be rewritten to a new one that has some buffer of free pages on its end and has truncated size.
|
||||
|
||||
|
||||
### Logical organization
|
||||
|
||||
The bbolt storage is divided into buckets. In each bucket there are stored keys (byte[]->value byte[] pairs), in lexicographical order. The list below represents buckets used by etcd (as of version 3.5) and the keys in use.
|
||||
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><strong>bucket</strong>
|
||||
</td>
|
||||
<td><strong>key</strong>
|
||||
</td>
|
||||
<td><strong>Exemplar value</strong>
|
||||
</td>
|
||||
<td><strong>description</strong>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>alarm
|
||||
</td>
|
||||
<td><code><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/api/etcdserverpb/rpc.proto#L976">rpcpb.Alarm</a>:</code>
|
||||
<code>{MemberID, Alarm: NONE|NOSPACE|CORRUPT}</code>
|
||||
</td>
|
||||
<td>nil
|
||||
</td>
|
||||
<td>Indicates problems have been diagnosed in one of the members.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>auth
|
||||
</td>
|
||||
<td>"authRevision"
|
||||
</td>
|
||||
<td>""(empty) or \
|
||||
<code>BigEndian.PutUint64</code>
|
||||
</td>
|
||||
<td>Any change of Roles or Users increments this field on transaction commit.
|
||||
<p>
|
||||
The value is used only for <a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/v3_server.go#L461">optimistic locking during</a> the authorization process.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>authRoles
|
||||
</td>
|
||||
<td>[roleName] as string
|
||||
</td>
|
||||
<td><code><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/api/authpb/auth.proto#L38">authpb.Role</a> </code>marshalled
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>authUsers
|
||||
</td>
|
||||
<td>[userName] as string
|
||||
</td>
|
||||
<td><code><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/api/authpb/auth.proto#L17">authpb.User</a> </code>marshalled
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="2" >cluster
|
||||
</td>
|
||||
<td>"clusterVersion"
|
||||
</td>
|
||||
<td>"3.5.0" (string)
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/etcdserver/server.go#L2314">minor</a> version of consensus-agreed common storage version.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>“downgrade”
|
||||
</td>
|
||||
<td>Json: { \
|
||||
“target-version”: "3.4.0" \
|
||||
“enabled”: true/false
|
||||
<p>
|
||||
}
|
||||
</td>
|
||||
<td>Persists intent configured by the most recent: <code>Downgrade RPC </code>request.
|
||||
<p>
|
||||
Since v3.5
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>key</strong>
|
||||
</td>
|
||||
<td>[revisionId]
|
||||
<p>
|
||||
encoded using
|
||||
<p>
|
||||
<a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/revision.go#L56">bytesToRev</a>{main,sub}
|
||||
<p>
|
||||
The key-value deletes are marshalled with ‘t’ at the end (as a “Thumbstone”)
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/api/mvccpb/kv.proto#L12">mvccpb.KeyValue</a> marshalled proto (<code>key, create_rev, mod_rev, version, value, lease id</code>)
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>lease
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td><code><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/lease/leasepb/lease.proto#L13">leasepb.Lease</a> </code> marshalled proto (ID, TTL, RemainingTTL)
|
||||
</td>
|
||||
<td>Note: LeaseCheckpoint is extending only RemainingTTL. Just TTL is from the original Grant.
|
||||
<p>
|
||||
<span style="text-decoration:underline;">Note2: We persist TTLs in seconds (from the undefined ‘now’). Crash-looping server does not release leases !!!</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>members
|
||||
</td>
|
||||
<td>[memberId] in hex as string: \
|
||||
\
|
||||
"8e9e05c52164694d"
|
||||
</td>
|
||||
<td><em>json as string serialized <a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/api/membership/member.go#L43">Member</a> structure:</em> \
|
||||
{"id":10276657743932975437, \
|
||||
"peerURLs":[ \
|
||||
"<a href="http://localhost:2380">http://localhost:2380</a>"], \
|
||||
"name":"default", \
|
||||
"clientURLs": \
|
||||
["http://localhost:2379"]}
|
||||
</td>
|
||||
<td>Agreed cluster membership information.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>members \
|
||||
_removed
|
||||
</td>
|
||||
<td>[memberId] in hex as string: \
|
||||
\
|
||||
"8e9e05c52164694d"
|
||||
</td>
|
||||
<td><code>[]byte("removed")</code>
|
||||
</td>
|
||||
<td>Ids of all removed members. \
|
||||
\
|
||||
Used to validate that a removed member is never added again under the same id.
|
||||
<p>
|
||||
<a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/api/membership/cluster.go#L251">The field is currently (3.4) read from store V2 and never from V3.</a> See <a href="https://github.com/etcd-io/etcd/pull/12820">https://github.com/etcd-io/etcd/pull/12820</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td rowspan="3" ><strong>meta</strong>
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/etcdserver/cindex/cindex.go#L92">"consistent_index"</a>
|
||||
</td>
|
||||
<td>uint64 bytes (BigEndian)
|
||||
</td>
|
||||
<td>Represents the offset of the last applied WAL entry to the bolt DB storage.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/kvstore.go#L41">"scheduledCompactRev"</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/revision.go#L56">bytesToRev</a>{main,sub} encoded. (16 bytes)
|
||||
</td>
|
||||
<td>Used to reinitialize compaction if a crash happened after a compaction request.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/kvstore.go#L42">"finishedCompactRev"</a>
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/revision.go#L56">bytesToRev</a>{main,sub} encoded. (16 bytes)
|
||||
</td>
|
||||
<td>Revision at which store was recently successfully compacted (<a href="https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/kvstore_compaction.go#L54">https://github.com/etcd-io/etcd/blob/ae7862e8bc8007eb396099db4e0e04ac026c8df5/server/mvcc/kvstore_compaction.go#L54</a>)
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>“confState”
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/pull/12962">Since etcd 3.5</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>“term”
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td><a href="https://github.com/etcd-io/etcd/pull/12964">Since etcd 3.5</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
</td>
|
||||
<td>“storage-version”
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
<td>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
### Tools
|
||||
|
||||
|
||||
#### BBolt
|
||||
|
||||
Bbolt has a command line tool that enables inspecting the file content.
|
||||
|
||||
Examples of use:
|
||||
|
||||
|
||||
##### List all buckets in given bbolt file:
|
||||
|
||||
% gobin --run go.etcd.io/bbolt/cmd/bbolt buckets ./default.etcd/member/snap/db
|
||||
|
||||
|
||||
##### Read a particular key/value pair:
|
||||
|
||||
% gobin --run go.etcd.io/bbolt/cmd/bbolt get ./default.etcd/member/snap/db cluster clusterVersion
|
||||
|
||||
|
||||
#### etcd-dump-db
|
||||
|
||||
etcd-dump-db can be used to list content of v3 etcd backend (bbolt).
|
||||
|
||||
% go run go.etcd.io/etcd/v3/tools/etcd-dump-db list-bucket default.etcd
|
||||
|
||||
alarm
|
||||
|
||||
auth
|
||||
|
||||
...
|
||||
|
||||
See more examples in: [https://github.com/etcd-io/etcd/tree/master/tools/etcd-dump-db](https://github.com/etcd-io/etcd/tree/master/tools/etcd-dump-db)
|
||||
|
||||
|
||||
##
|
||||
|
||||
|
||||
## WAL: Write ahead log
|
||||
|
||||
Write ahead log is a Raft persistent storage that is used to store proposals. First the leader stores the proposal in its log and then (concurrently) replicates it using Raft protocol to followers. Each follower persists the proposal in its WAL before confirming back replication to the leader.
|
||||
|
||||
\
|
||||
The WAL log used in etcd differs from canonical Raft model 2-fold:
|
||||
|
||||
|
||||
|
||||
* It does persist not only indexed entries, but also Raft snapshots (lightweight) & hard-state. So the entire Raft state of the member can be recovered from the WAL log alone.
|
||||
* It is append-only. Entries are not overridden in place, but an entry appended later in the file (with the same index) is superseding the previous one.
|
||||
|
||||
|
||||
### File names
|
||||
|
||||
The WAL log files are named using following pattern:
|
||||
|
||||
|
||||
```
|
||||
"%016x-%016x.wal", seq, index
|
||||
```
|
||||
|
||||
|
||||
Example: ./member/wal/0000000000000010-00000000000bf1e6.wal
|
||||
|
||||
So the file names contains hex-encoded:
|
||||
|
||||
|
||||
|
||||
* Sequential number of the WAL log file
|
||||
* Index of the first entry or snapshot in the file. \
|
||||
In particular the first file “0000000000000000-0000000000000000.wal” has the initial snapshot record with index=0. \
|
||||
|
||||
|
||||
|
||||
### Physical content
|
||||
|
||||
The WAL log file contains a sequence of "[Frames](https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/wal/encoder.go#L62)". Each frame contains:
|
||||
|
||||
|
||||
|
||||
1. [LittleEndian](https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/wal/encoder.go#L120)[^2] encoded uint64 that contains the length of the marshalled [walpb.Record](https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/wal/walpb/record.proto#L11) (3).
|
||||
|
||||
|
||||
2. Padding: Some number of 0 bytes, such that whole frame has aligned (mod 8) size
|
||||
3. Marshalled [walpb.Record](https://github.com/etcd-io/etcd/blob/a1ff0d5373335665b3e5f4cb22a538ac63757cb6/server/wal/walpb/record.proto#L11) data:
|
||||
1. [type](wal/wal.go:39) - int encoded enum driving interpretation of the data-field below
|
||||
2. data - depending on type, usually marshalled proto
|
||||
3. crc - RC-32 checksum of all “data” fields combined (no type) in all the log records on this particular replica since WAL log creation. Please note that CRC takes in consideration ALL records (even if they didn’t get committedcomitted by Raft).
|
||||
|
||||
The files are “cut” (new file is started) when the current file is exceeding 64*10^6 bytes.
|
||||
|
||||
|
||||
### Logical content
|
||||
|
||||
Write ahead log files in the logical layer contains:
|
||||
|
||||
|
||||
|
||||
* `Raftpb.Entry: `recent proposals replicated by Raft leader. Some of these proposals are considered ‘committed’ and the others are subject to be logically overridden.
|
||||
* `Raftpb.HardState(term,commit,vote): `periodic (very frequent) information about the index of a log entry that is ‘committed’ (replicated to the majority of servers), so guaranteed to be not changed/overridden and that can be applied to the backends (v2, v3). It also contains a “term” (indicator whether there were any election related changes) and a vote - a member the current replica voted for in the current term.
|
||||
* `walpb.Snapshot(term, index): `periodic snapshots of Raft state (no DB content, just snapshot log index and Raft term)
|
||||
* V2 store content is stored in a separate *.store files.
|
||||
* V3 store content is maintained in the bbolt file, and it’s becoming an implicit snapshot as soon as entries are applied there.
|
||||
* crc32 checksum record (at the beginning of each file), used to resume CRC checking for the remainder of the file.
|
||||
* `etcdserverpb.Metadata(node_id, cluster_id)` - identifying the cluster & replica the log represents.
|
||||
|
||||
Each WAL-log file is build from (in order):
|
||||
|
||||
|
||||
|
||||
1. CRC-32 frame (running crc from all previous files, 0 for the first file).
|
||||
2. Metadata frame (cluster & replica IDs)
|
||||
3. For the initial WAL file only:
|
||||
|
||||
Empty Snapshot frame (Index:0, Term: 0) \
|
||||
The purpose of this frame is to hold an invariant that all entries are ‘preceded’ by a snapshot.
|
||||
|
||||
|
||||
For not initial (2nd+) WAL file:
|
||||
|
||||
|
||||
HardState frame.
|
||||
|
||||
|
||||
|
||||
4. Mix of entry, hard-state & snapshot records
|
||||
|
||||
The WAL log can contain multiple entries for the same index. Such a situation can happen in cases described in figure 7. of the [Raft paper](http://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14.pdf). The etcd WAL log is appended only, so the entries are getting overridden, by appending a new entry with the same index.
|
||||
|
||||
In particular during the WAL reading, [the logic is overriding old entries with newer entries](https://github.com/etcd-io/etcd/blob/release-3.4/wal/wal.go#L448-L462). Thus only the last version of entries with entry.index <= HardState.commit can be considered as final. Entries with index > HardState.commit are subject to change.
|
||||
|
||||
The “terms” in the WAL log are expected to be monotonic.
|
||||
|
||||
The “indexes” in the WAL log are expected to:
|
||||
|
||||
|
||||
|
||||
1. start from some snapshot
|
||||
2. be sequentially growing after that snapshot as long as they stay in the same ‘term’
|
||||
3. if the term changes, the index can decrease, but to a new value that is higher than the latest HardState.commit.
|
||||
4. a new snapshot might happen with any index >= HardState.commit, that opens a new sequence for indexes.
|
||||
|
||||
|
||||
|
||||
<p id="gdcalert1" ><span style="color: red; font-weight: bold">>>>>> gd2md-html alert: inline drawings not supported directly from Docs. You may want to copy the inline drawing to a standalone drawing and export by reference. See <a href="https://github.com/evbacher/gd2md-html/wiki/Google-Drawings-by-reference">Google Drawings by reference</a> for details. The img URL below is a placeholder. </span><br>(<a href="#">Back to top</a>)(<a href="#gdcalert2">Next alert</a>)<br><span style="color: red; font-weight: bold">>>>>> </span></p>
|
||||
|
||||
|
||||
![drawing](https://docs.google.com/drawings/d/12345/export/png)
|
||||
|
||||
|
||||
|
||||
### Tools
|
||||
|
||||
|
||||
#### etcd-dump-logs
|
||||
|
||||
etcd WAL logs can be read using [etcd-dump-logs](https://github.com/etcd-io/etcd/tree/master/tools/etcd-dump-logs) tool:
|
||||
|
||||
% go install go.etcd.io/etcd/v3/tools/etcd-dump-logs@latest
|
||||
|
||||
% go run go.etcd.io/etcd/v3/tools/etcd-dump-logs --start-index=0 aname.etcd
|
||||
|
||||
Be aware that:
|
||||
|
||||
|
||||
|
||||
* The tool shows only Entries, and not all the WAL records (Snapshots, HardStates) that are in the WAL log files.
|
||||
* The tool automatically applies ‘overrides’ on the entries. If an entry got overridden (by a fresher entry under the same index), the tool will print only the final value.
|
||||
* The tool also prints uncommitted entries (from the tail of the LOG), without information about HardState.commitIndex, so it’s not known whether entries are final or not.
|
||||
|
||||
|
||||
## Snapshots of (Store V2): **member/snap/{term}-{index}.snap **
|
||||
|
||||
|
||||
### File names:
|
||||
|
||||
**member/snap/{term}-{index}.snap **
|
||||
|
||||
The filenames are generated [here](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/server/etcdserver/api/snap/snapshotter.go#L78) `("%016x-%016x.snap") `and are using 2 hex-encoded compounds:
|
||||
|
||||
|
||||
|
||||
* term -> Raft term (period between elections) at the time snapshot is emitted
|
||||
* index -> of last applied proposal at the time snapshot is emitted
|
||||
|
||||
|
||||
### Creation
|
||||
|
||||
The *.snap files are created by [Snapshotter.SaveSnap](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/server/etcdserver/api/snap/snapshotter.go#L68) method.
|
||||
|
||||
There are 2 triggers controlling creation of these files:
|
||||
|
||||
|
||||
|
||||
* A new file is created every (approximately) --snapshotCount=(by default 100'000) applied proposals. It’s an approximation as we might receive proposals in batches and we consider snapshotting only at the end of batch, finally the snapshotting process is asynchronously scheduled. \
|
||||
The flag name (--snapshotCount) is pretty misleading as it drives [differences in index value between ](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/server/etcdserver/server.go#L1266)last snapshot index and last applied proposal index. \
|
||||
|
||||
* Raft requests the replica to restore from the snapshot. As a replica is receiving the snapshot over wire (msgSnap) message, it also checkpoints (lightweight) it into WAL log. This guarantees that in the WAL logs tail there is always a valid snapshot followed by entries. So it suppresses potential lack of continuity in the WAL logs.
|
||||
|
||||
Currently the files are roughly[^3] associated 1-1 with WAL logs Snapshot entries. With store v2 decommissioning we expect the files to stop being written at all (opt-in: 3.5.x, mandatory 3.6.x).
|
||||
|
||||
|
||||
### Content
|
||||
|
||||
The file contains marshalled [snapdb.snapshot proto](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/server/etcdserver/api/snap/snappb/snap.proto#L11) `(uint32 crc, bytes data)`,
|
||||
|
||||
that in the 'data' field holds [Raftpb.Snapshot](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/raft/raftpb/raft.proto#L31):
|
||||
|
||||
(bytes data, SnapshotMetadata{index, term, [conf](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/raft/raftpb/raft.proto#L99)} metadata),
|
||||
|
||||
Finally the nested data holds a JSON serialized
|
||||
|
||||
<p id="gdcalert2" ><span style="color: red; font-weight: bold">>>>>> gd2md-html alert: undefined internal link (link text: "store v2 content"). Did you generate a TOC with blue links? </span><br>(<a href="#">Back to top</a>)(<a href="#gdcalert3">Next alert</a>)<br><span style="color: red; font-weight: bold">>>>>> </span></p>
|
||||
|
||||
[store v2 content](#heading=h.j3kt3frgwhrh).
|
||||
|
||||
In particular there is:
|
||||
|
||||
|
||||
|
||||
* Term
|
||||
* Index
|
||||
* Membership data:
|
||||
* <code>/0/members/8e9e05c52164694d/attributes -> <strong>{\"name\":\"default\",\"clientURLs\":[\"[http://localhost:2379\](http://localhost:2379\)"]}</strong></code>
|
||||
* <code>/0/members/8e9e05c52164694d/RaftAttributes -> <strong>"{\"peerURLs\":[\"http://localhost:2380\"]}"</strong></code>
|
||||
* Storage version: /0/version-> 3.5.0
|
||||
|
||||
|
||||
### Tools
|
||||
|
||||
|
||||
#### protoc
|
||||
|
||||
Following command allows you to see the file content when executed from etcd root directory:
|
||||
|
||||
|
||||
```
|
||||
cat default.etcd/member/snap/0000000000000002-0000000000049425.snap |
|
||||
protoc --decode=snappb.snapshot \
|
||||
server/etcdserver/api/snap/snappb/snap.proto \
|
||||
-I $(go list -f '{{.Dir}}' github.com/gogo/protobuf/proto)/.. \
|
||||
-I .
|
||||
-I $(go list -m -f '{{.Dir}}' github.com/gogo/protobuf)/protobuf
|
||||
```
|
||||
|
||||
|
||||
Analogously you can extract 'data' field and decode as '[Raftpb.Snapshot](https://github.com/etcd-io/etcd/blob/ad5b30297a43daeb5ce7311fa606ce4c1f16618f/raft/raftpb/raft.proto#L31)`'`
|
||||
|
||||
|
||||
### Exemplar JSON serialized store v2 content in etcd 3.4 *.snap files:
|
||||
|
||||
|
||||
```
|
||||
{
|
||||
"Root":{
|
||||
"Path":"/",
|
||||
"CreatedIndex":0,
|
||||
"ModifiedIndex":0,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"",
|
||||
"Children":{
|
||||
"0":{
|
||||
"Path":"/0",
|
||||
"CreatedIndex":0,
|
||||
"ModifiedIndex":0,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"",
|
||||
"Children":{
|
||||
"members":{
|
||||
"Path":"/0/members",
|
||||
"CreatedIndex":1,
|
||||
"ModifiedIndex":1,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"",
|
||||
"Children":{
|
||||
"8e9e05c52164694d":{
|
||||
"Path":"/0/members/8e9e05c52164694d",
|
||||
"CreatedIndex":1,
|
||||
"ModifiedIndex":1,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"",
|
||||
"Children":{
|
||||
"attributes":{
|
||||
"Path":"/0/members/8e9e05c52164694d/attributes",
|
||||
"CreatedIndex":2,
|
||||
"ModifiedIndex":2,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"{\"name\":\"default\",\"clientURLs\":[\"http://localhost:2379\"]}",
|
||||
"Children":null
|
||||
},
|
||||
"RaftAttributes":{
|
||||
"Path":"/0/members/8e9e05c52164694d/RaftAttributes",
|
||||
"CreatedIndex":1,
|
||||
"ModifiedIndex":1,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"{\"peerURLs\":[\"http://localhost:2380\"]}",
|
||||
"Children":null
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"version":{
|
||||
"Path":"/0/version",
|
||||
"CreatedIndex":3,
|
||||
"ModifiedIndex":3,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"3.5.0",
|
||||
"Children":null
|
||||
}
|
||||
}
|
||||
},
|
||||
"1":{
|
||||
"Path":"/1",
|
||||
"CreatedIndex":0,
|
||||
"ModifiedIndex":0,
|
||||
"ExpireTime":"0001-01-01T00:00:00Z",
|
||||
"Value":"",
|
||||
"Children":{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"WatcherHub":{
|
||||
"EventHistory":{
|
||||
"Queue":{
|
||||
"Events":[
|
||||
{
|
||||
"action":"create",
|
||||
"node":{
|
||||
"key":"/0/members/8e9e05c52164694d/RaftAttributes",
|
||||
"value":"{\"peerURLs\":[\"http://localhost:2380\"]}",
|
||||
"modifiedIndex":1,
|
||||
"createdIndex":1
|
||||
}
|
||||
},
|
||||
{
|
||||
"action":"set",
|
||||
"node":{
|
||||
"key":"/0/members/8e9e05c52164694d/attributes",
|
||||
"value":"{\"name\":\"default\",\"clientURLs\":[\"http://localhost:2379\"]}",
|
||||
"modifiedIndex":2,
|
||||
"createdIndex":2
|
||||
}
|
||||
},
|
||||
{
|
||||
"action":"set",
|
||||
"node":{
|
||||
"key":"/0/version",
|
||||
"value":"3.5.0",
|
||||
"modifiedIndex":3,
|
||||
"createdIndex":3
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- Footnotes themselves at the bottom. -->
|
||||
## Notes
|
||||
|
||||
[^1]:
|
||||
The metadata pages at the beginning of the bbolt file are modified in-place.
|
||||
|
||||
[^2]:
|
||||
|
||||
Inconsistent, as majority of uint’s are written bigendian
|
||||
|
||||
[^3]:
|
||||
The initial (index:0) snapshot at the beginning of WAL log is not associated with *.snap file. Also the old *.snap files (or WAL logs) might get purged.
|
||||
|
||||
|
||||
## Changes
|
||||
|
||||
This section is reserved to describe changes to the file formats introduces
|
||||
between different etcd versions.
|
|
@ -4,177 +4,43 @@
|
|||
|
||||
Speed up issue management.
|
||||
|
||||
The `etcd` issues are listed at <https://github.com/etcd-io/etcd/issues> and are identified with labels. For example, an issue that is identified as a bug will be set to label `type/bug`.
|
||||
The `etcd` 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 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
|
||||
|
||||
The etcd project uses labels to indicate common attributes such as `area`, `type` and `priority` of incoming issues.
|
||||
|
||||
New issues will often start out without any labels, but typically `etcd` maintainers, reviewers and members will add labels by following these triage guidelines. The detailed list of labels can be found at <https://github.com/etcd-io/etcd/labels>.
|
||||
Following are few predetermined searches on issues for convenience:
|
||||
* [Bugs](https://github.com/etcd-io/etcd/labels/area%2Fbug)
|
||||
* [Help Wanted](https://github.com/etcd-io/etcd/labels/Help%20Wanted)
|
||||
* [Longest untriaged issues](https://github.com/etcd-io/etcd/issues?utf8=%E2%9C%93&q=is%3Aopen+sort%3Aupdated-asc+)
|
||||
|
||||
## Scope
|
||||
|
||||
This document serves as the primary guidelines for triaging incoming issues in `etcd`.
|
||||
These guidelines serves as a primary document for triaging an incoming issues in
|
||||
`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.
|
||||
|
||||
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 an issue is a bug
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Step 1 - Find an issue to triage
|
||||
## Inactive issues
|
||||
|
||||
To get started you can use the following recommended issue searches to identify issues that are in need of triage:
|
||||
Issues that lack enough information from the issue reporter should be closed if issue reporter do not provide information in 60 days.
|
||||
|
||||
* [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+)
|
||||
## Duplicate issues
|
||||
|
||||
## Step 2 - Check the issue is valid
|
||||
If an issue is a duplicate, add a comment stating so along with a reference for the original issue and close it.
|
||||
|
||||
Before we start adding labels or trying to work out a priority, our first triage step needs to be working out if the issue actually belongs to the etcd project and is not a duplicate.
|
||||
## Issues that don't belong to etcd
|
||||
|
||||
### Issues that don't belong to etcd
|
||||
Sometime issues are reported that actually belongs to other projects that `etcd` use. For example, `grpc` or `golang` issues. Such issues should be addressed by asking reporter to open issues in appropriate other project. Close the issue unless a maintainer and issue reporter see a need to keep it open for tracking purpose.
|
||||
|
||||
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.
|
||||
## Verify important labels are in place
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
### Duplicate issues
|
||||
## Poke issue owner 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.
|
||||
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.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -251,16 +251,13 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"type_url": {
|
||||
"type": "string",
|
||||
"description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
|
||||
"type": "string"
|
||||
},
|
||||
"value": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||
"format": "byte"
|
||||
}
|
||||
},
|
||||
"description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }"
|
||||
}
|
||||
},
|
||||
"runtimeError": {
|
||||
"type": "object",
|
||||
|
|
|
@ -108,16 +108,13 @@
|
|||
"type": "object",
|
||||
"properties": {
|
||||
"type_url": {
|
||||
"type": "string",
|
||||
"description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
|
||||
"type": "string"
|
||||
},
|
||||
"value": {
|
||||
"type": "string",
|
||||
"format": "byte",
|
||||
"description": "Must be a valid serialized protocol buffer of the above specified type."
|
||||
"format": "byte"
|
||||
}
|
||||
},
|
||||
"description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := ptypes.MarshalAny(foo)\n ...\n foo := \u0026pb.Foo{}\n if err := ptypes.UnmarshalAny(any, foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }"
|
||||
}
|
||||
},
|
||||
"runtimeError": {
|
||||
"type": "object",
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
# etcd arm64 test infrastructure
|
||||
|
||||
## Infrastructure summary
|
||||
|
||||
All etcd project pipelines run via github actions. The etcd project currently maintains dedicated infrastructure for running `arm64` continuous integration testing. This is required because currently github actions runner virtual machines are only offered as `x64`.
|
||||
|
||||
The infrastructure consists of two `c3.large.arm` bare metal servers kindly provided by [Equinix Metal](https://www.equinix.com/) via the [CNCF Community Infrastructure Lab].
|
||||
|
||||
| Hostname | IP | Operating System | Region |
|
||||
|-------------------------------|----------------|--------------------|---------------|
|
||||
| etcd-c3-large-arm64-runner-01 | 86.109.7.233 | Ubuntu 22.04.1 LTS | Washington DC |
|
||||
| etcd-c3-large-arm64-runner-02 | 147.28.151.226 | Ubuntu 22.04.1 LTS | Washington DC |
|
||||
|
||||
## Infrastructure support
|
||||
|
||||
The etcd project aims to self manage and resolve issues with project infrastructure internally where possible, however if situations emerge where we need to engage support from Equinix Metal we can open an issue under the [CNCF Community Infrastructure Lab] project or contact the [Equinix Metal support team](https://deploy.equinix.com/support). If the situation is urgent contact @vielmetti directly who can provide further assistance or escalation points.
|
||||
|
||||
## Granting infrastructure access
|
||||
|
||||
Etcd arm64 test infrastructure access is closely controlled to ensure the infrastructure is secure and protect the integrity of the etcd project.
|
||||
|
||||
Access to the infrastructure is defined by the infra admins table below:
|
||||
|
||||
| Name | Github | K8s Slack | Email |
|
||||
|---------------------------|----------------|--------------------|--------------------|
|
||||
| Marek Siarkowicz | @serathius | @ Serathius | Ref MAINTAINERS.md |
|
||||
| Benjamin Wang | @ahrtr | @ Benjamin Wang | Ref MAINTAINERS.md |
|
||||
| Davanum Srinivas | @dimns | @ Dims | davanum@gmail.com |
|
||||
| Chao Chen | @chaochn47 | @ Chao Chen | chaochn@amazon.com |
|
||||
| James Blair | @jmhbnz | @ James Blair | etcd@jamma.life |
|
||||
|
||||
Individuals in this table are granted access to the infrastructure in two ways:
|
||||
|
||||
### 1. Equinix metal web console access
|
||||
|
||||
An etcd project exists under the CNCF organisation in the Equinix Metal web console. The direct url to the etcd console is <https://console.equinix.com/projects/1b8c1eb7-983c-4b40-97e0-e317406e232e>.
|
||||
|
||||
When a new person is added to the infra admins table, an existing member or etcd maintainer should raise an issue in the [CNCF Community Infrastructure Labs](https://github.com/cncf/cluster/issues) to ensure they are granted web console access.
|
||||
|
||||
### 2. Server ssh access
|
||||
|
||||
Infra admins can ssh directly to the servers with a dedicated user account for each person, usernames are based on github handles for easy recognition in logs. These infra admins will be able to elevate to the `root` user when necessary via `sudo`.
|
||||
|
||||
Access to machines via ssh is strictly via individual ssh key based authentication, and is not permitted directly to the `root` user. Password authentication is never to be used for etcd infrastructure ssh authentication.
|
||||
|
||||
When a new member is added to the infra admins table, and existing member with ssh access should complete the following actions on all etcd servers:
|
||||
|
||||
- create the new user via `sudo adduser <username>`.
|
||||
- add their public key to `/home/<username>/.ssh/authorized_keys` file. Note: Public keys are to be retrieved via github only, example: <https://github.com/jmhbnz.keys>.
|
||||
- add the new user to machine sudoers file via `usermod -aG sudo <username>`.
|
||||
|
||||
## Revoking infrastructure access
|
||||
|
||||
When a member is removed from the infra admins table existing members must review servers and ensure their user access to etcd infrastructure is revoked by removing the members `/home/<username>/.ssh/authorized_keys` entries.
|
||||
|
||||
Note: When revoking access do not delete a user or their home directory from servers, as access may need to be reinstated in future.
|
||||
|
||||
### Regular access review
|
||||
|
||||
On a regular at least quarterly basis members of the infra admins team are responsible for verifying that no unneccessary infrastructure access exists by reviewing membership of the table above and existing server access.
|
||||
|
||||
## Provisioning new machines
|
||||
|
||||
If the etcd project needs new `arm64` infrastructure we can open an issue with the [CNCF Community Infrastructure Lab]. An example etcd request is [here](https://github.com/cncf/cluster/issues/227).
|
||||
|
||||
Note: `arm64` compute capacity is not currently available in all regions, this can be checked with [metal-cli](https://github.com/equinix/metal-cli) `metal capacity get | grep arm`.
|
||||
|
||||
[CNCF Community Infrastructure Lab]: https://github.com/cncf/cluster/issues
|
|
@ -1,6 +1,6 @@
|
|||
# The official list of maintainers and reviewers for the project maintenance.
|
||||
#
|
||||
# Refer to the https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/community-membership.md for description of the roles.
|
||||
# Refer to the GOVERNANCE.md for description of the roles.
|
||||
#
|
||||
# Names should be added to this file like so:
|
||||
# Individual's name <submission email address> (@GITHUB_HANDLE) pkg:*
|
||||
|
@ -11,8 +11,8 @@
|
|||
# MAINTAINERS
|
||||
Benjamin Wang <wachao@vmware.com> (ahrtr@) pkg:*
|
||||
Hitoshi Mitake <h.mitake@gmail.com> (@mitake) pkg:*
|
||||
Marek Siarkowicz <siarkowicz@google.com> <marek.siarkowicz@gmail.com> (@serathius) pkg:*
|
||||
Piotr Tabor <piotr.tabor@gmail.com> (@ptabor) pkg:*
|
||||
Marek Siarkowicz <marek.siarkowicz@gmail.com> (@serathius) pkg:*
|
||||
Piotr Tabor <ptab@google.com> (@ptabor) pkg:*
|
||||
Sahdev Zala <spzala@us.ibm.com> (@spzala) pkg:*
|
||||
|
||||
# REVIEWERS
|
||||
|
|
31
Makefile
31
Makefile
|
@ -64,8 +64,8 @@ fuzz:
|
|||
|
||||
verify: verify-gofmt verify-bom verify-lint verify-dep verify-shellcheck verify-goword \
|
||||
verify-govet verify-license-header verify-receiver-name verify-mod-tidy verify-shellcheck \
|
||||
verify-shellws verify-proto-annotations verify-genproto verify-goimport verify-yamllint
|
||||
fix: fix-goimports fix-bom fix-lint fix-yamllint
|
||||
verify-shellws verify-proto-annotations verify-genproto verify-goimport
|
||||
fix: fix-bom fix-lint
|
||||
./scripts/fix.sh
|
||||
|
||||
.PHONY: verify-gofmt
|
||||
|
@ -76,7 +76,7 @@ verify-gofmt:
|
|||
verify-bom:
|
||||
PASSES="bom" ./scripts/test.sh
|
||||
|
||||
.PHONY: fix-bom
|
||||
.PHONY: update-bom
|
||||
fix-bom:
|
||||
./scripts/updatebom.sh
|
||||
|
||||
|
@ -86,11 +86,11 @@ verify-dep:
|
|||
|
||||
.PHONY: verify-lint
|
||||
verify-lint:
|
||||
golangci-lint run --config tools/.golangci.yaml
|
||||
golangci-lint run
|
||||
|
||||
.PHONY: fix-lint
|
||||
.PHONY: update-lint
|
||||
fix-lint:
|
||||
golangci-lint run --config tools/.golangci.yaml --fix
|
||||
golangci-lint run --fix
|
||||
|
||||
.PHONY: verify-shellcheck
|
||||
verify-shellcheck:
|
||||
|
@ -132,29 +132,12 @@ verify-genproto:
|
|||
verify-goimport:
|
||||
PASSES="goimport" ./scripts/test.sh
|
||||
|
||||
.PHONY: fix-goimports
|
||||
fix-goimports:
|
||||
./scripts/fix-goimports.sh
|
||||
|
||||
.PHONY: verify-yamllint
|
||||
verify-yamllint:
|
||||
yamllint --config-file tools/.yamllint .
|
||||
|
||||
YAMLFMT_VERSION = $(shell cd tools/mod && go list -m -f '{{.Version}}' github.com/google/yamlfmt)
|
||||
|
||||
.PHONY: fix-yamllint
|
||||
fix-yamllint:
|
||||
ifeq (, $(shell which yamlfmt))
|
||||
$(shell go install github.com/google/yamlfmt/cmd/yamlfmt@$(YAMLFMT_VERSION))
|
||||
endif
|
||||
yamlfmt -conf tools/.yamlfmt .
|
||||
|
||||
# Cleanup
|
||||
|
||||
clean:
|
||||
rm -f ./codecov
|
||||
rm -rf ./covdir
|
||||
rm -f ./bin/Dockerfile-release
|
||||
rm -f ./bin/Dockerfile-release*
|
||||
rm -rf ./bin/etcd*
|
||||
rm -rf ./default.etcd
|
||||
rm -rf ./tests/e2e/default.etcd
|
||||
|
|
19
Procfile
19
Procfile
|
@ -6,21 +6,4 @@ etcd2: bin/etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --adve
|
|||
etcd3: bin/etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
|
||||
#proxy: bin/etcd grpc-proxy start --endpoints=127.0.0.1:2379,127.0.0.1:22379,127.0.0.1:32379 --listen-addr=127.0.0.1:23790 --advertise-client-url=127.0.0.1:23790 --enable-pprof
|
||||
|
||||
# A learner node can be started using the below Procfile.learner (uncomment and run)
|
||||
|
||||
# Use goreman to run `go install github.com/mattn/goreman@latest`
|
||||
|
||||
# 1. Start the cluster using Procfile
|
||||
# 2. Add learner node to the cluster
|
||||
# % etcdctl member add infra4 --peer-urls="http://127.0.0.1:42380" --learner=true
|
||||
|
||||
# 3. Start learner node with goreman
|
||||
# Change the path of bin/etcd if etcd is located elsewhere
|
||||
|
||||
# uncomment below to setup
|
||||
|
||||
# etcd4: bin/etcd --name infra4 --listen-client-urls http://127.0.0.1:42379 --advertise-client-urls http://127.0.0.1:42379 --listen-peer-urls http://127.0.0.1:42380 --initial-advertise-peer-urls http://127.0.0.1:42380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra4=http://127.0.0.1:42380,infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state existing --enable-pprof --logger=zap --log-outputs=stderr
|
||||
|
||||
# 4. The learner node can be promoted to voting member by the command
|
||||
# % etcdctl member promote <memberid>
|
||||
|
||||
# A learner node can be started using Procfile.learner
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# Use goreman to run `go 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>
|
|
@ -0,0 +1,7 @@
|
|||
# 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,10 +27,6 @@ etcd is used [in production by many companies](./ADOPTERS.md), and the developme
|
|||
|
||||
See [etcdctl][etcdctl] for a simple command line client.
|
||||
|
||||
![etcd reliability is important](logos/etcd-xkcd-2347.png)
|
||||
|
||||
<sub>Original image credited to xkcd.com/2347, alterations by Josh Berkus.</sub>
|
||||
|
||||
[raft]: https://raft.github.io/
|
||||
[k8s]: http://kubernetes.io/
|
||||
[doorman]: https://github.com/youtube/doorman
|
||||
|
@ -51,6 +47,7 @@ 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).
|
||||
|
||||
[github-release]: https://github.com/etcd-io/etcd/releases
|
||||
[branch-management]: https://etcd.io/docs/latest/branch_management
|
||||
|
||||
### Running etcd
|
||||
|
||||
|
@ -73,15 +70,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:
|
||||
|
||||
```bash
|
||||
```
|
||||
etcdctl put mykey "this is awesome"
|
||||
etcdctl get mykey
|
||||
```
|
||||
|
||||
etcd is now running and serving client requests. For more, please check out:
|
||||
|
||||
* [Interactive etcd playground](http://play.etcd.io)
|
||||
* [Animated quick demo](https://etcd.io/docs/latest/demo)
|
||||
- [Interactive etcd playground](http://play.etcd.io)
|
||||
- [Animated quick demo](https://etcd.io/docs/latest/demo)
|
||||
|
||||
### etcd TCP ports
|
||||
|
||||
|
@ -119,14 +116,13 @@ go get go.etcd.io/etcd/client/v3
|
|||
|
||||
Now it's time to dig into the full etcd API and other guides.
|
||||
|
||||
* Read the full [documentation].
|
||||
* Review etcd [frequently asked questions].
|
||||
* Explore the full gRPC [API].
|
||||
* Set up a [multi-machine cluster][clustering].
|
||||
* Learn the [config format, env variables and flags][configuration].
|
||||
* Find [language bindings and tools][integrations].
|
||||
* Use TLS to [secure an etcd cluster][security].
|
||||
* [Tune etcd][tuning].
|
||||
- Read the full [documentation][].
|
||||
- Explore the full gRPC [API][].
|
||||
- Set up a [multi-machine cluster][clustering].
|
||||
- Learn the [config format, env variables and flags][configuration].
|
||||
- Find [language bindings and tools][integrations].
|
||||
- Use TLS to [secure an etcd cluster][security].
|
||||
- [Tune etcd][tuning].
|
||||
|
||||
[documentation]: https://etcd.io/docs/latest
|
||||
[api]: https://etcd.io/docs/latest/learning/api
|
||||
|
@ -138,9 +134,9 @@ Now it's time to dig into the full etcd API and other guides.
|
|||
|
||||
## Contact
|
||||
|
||||
* Email: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
||||
* Slack: [#etcd](https://kubernetes.slack.com/messages/C3HD8ARJ5/details/) channel on Kubernetes ([get an invite](http://slack.kubernetes.io/))
|
||||
* [Community meetings](#community-meetings)
|
||||
- Email: [etcd-dev](https://groups.google.com/forum/?hl=en#!forum/etcd-dev)
|
||||
- Slack: [#etcd](https://kubernetes.slack.com/messages/C3HD8ARJ5/details/) channel on Kubernetes ([get an invite](http://slack.kubernetes.io/))
|
||||
- [Community meetings](#Community-meetings)
|
||||
|
||||
### Community meetings
|
||||
|
||||
|
@ -167,9 +163,7 @@ Please refer to [community-membership.md](Documentation/contributor-guide/commun
|
|||
|
||||
## Reporting bugs
|
||||
|
||||
See [reporting bugs](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md) for details about reporting any issues. Before opening an issue please check it is not covered in our [frequently asked questions].
|
||||
|
||||
[frequently asked questions]: https://etcd.io/docs/latest/faq
|
||||
See [reporting bugs](https://github.com/etcd-io/etcd/blob/main/Documentation/contributor-guide/reporting_bugs.md) for details about reporting any issues.
|
||||
|
||||
## Reporting a security vulnerability
|
||||
|
||||
|
|
|
@ -12,7 +12,6 @@ import (
|
|||
|
||||
_ "github.com/gogo/protobuf/gogoproto"
|
||||
proto "github.com/golang/protobuf/proto"
|
||||
_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"
|
||||
authpb "go.etcd.io/etcd/api/v3/authpb"
|
||||
mvccpb "go.etcd.io/etcd/api/v3/mvccpb"
|
||||
_ "go.etcd.io/etcd/api/v3/versionpb"
|
||||
|
@ -6186,287 +6185,284 @@ func init() {
|
|||
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
|
||||
|
||||
var fileDescriptor_77a6da22d6a3feb1 = []byte{
|
||||
// 4478 bytes of a gzipped FileDescriptorProto
|
||||
// 4424 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x3c, 0xdf, 0x6f, 0x1c, 0x49,
|
||||
0x5a, 0xee, 0x19, 0x7b, 0xc6, 0xf3, 0xcd, 0x78, 0x3c, 0xae, 0x38, 0xd9, 0xc9, 0x6c, 0xe2, 0x78,
|
||||
0x3b, 0x9b, 0xdd, 0x6c, 0x36, 0xf1, 0x24, 0x76, 0x72, 0x0b, 0x41, 0xbb, 0xdc, 0xc4, 0x9e, 0x4d,
|
||||
0x4c, 0x1c, 0xdb, 0xd7, 0x9e, 0x64, 0x6f, 0x83, 0x74, 0xa6, 0x3d, 0x53, 0x19, 0xf7, 0x79, 0xa6,
|
||||
0x7b, 0xae, 0xbb, 0xed, 0xd8, 0xcb, 0xc3, 0x1d, 0x07, 0xc7, 0xe9, 0x40, 0x3a, 0x89, 0x45, 0x42,
|
||||
0x27, 0x04, 0x2f, 0x08, 0x09, 0x1e, 0x0e, 0x04, 0x0f, 0x3c, 0x20, 0x90, 0x78, 0x80, 0x07, 0x78,
|
||||
0x40, 0x42, 0xe2, 0x1f, 0x80, 0xe5, 0x9e, 0xf8, 0x23, 0x10, 0xaa, 0x5f, 0x5d, 0xd5, 0xdd, 0xd5,
|
||||
0xb6, 0xf7, 0xec, 0xd5, 0xbd, 0xac, 0xa7, 0xab, 0xbe, 0x5f, 0xf5, 0x7d, 0xf5, 0x7d, 0x5f, 0xd5,
|
||||
0xf7, 0xd5, 0x06, 0x4a, 0xfe, 0xa8, 0xbb, 0x30, 0xf2, 0xbd, 0xd0, 0x43, 0x15, 0x1c, 0x76, 0x7b,
|
||||
0x01, 0xf6, 0x0f, 0xb0, 0x3f, 0xda, 0x69, 0xcc, 0xf6, 0xbd, 0xbe, 0x47, 0x27, 0x9a, 0xe4, 0x17,
|
||||
0x83, 0x69, 0xd4, 0x09, 0x4c, 0xd3, 0x1e, 0x39, 0xcd, 0xe1, 0x41, 0xb7, 0x3b, 0xda, 0x69, 0xee,
|
||||
0x1d, 0xf0, 0x99, 0x46, 0x34, 0x63, 0xef, 0x87, 0xbb, 0xa3, 0x1d, 0xfa, 0x87, 0xcf, 0xcd, 0x47,
|
||||
0x73, 0x07, 0xd8, 0x0f, 0x1c, 0xcf, 0x1d, 0xed, 0x88, 0x5f, 0x1c, 0xe2, 0x4a, 0xdf, 0xf3, 0xfa,
|
||||
0x03, 0xcc, 0xf0, 0x5d, 0xd7, 0x0b, 0xed, 0xd0, 0xf1, 0xdc, 0x80, 0xcf, 0xde, 0xa6, 0x7f, 0xba,
|
||||
0x77, 0xfa, 0xd8, 0xbd, 0x13, 0xbc, 0xb6, 0xfb, 0x7d, 0xec, 0x37, 0xbd, 0x11, 0x85, 0x48, 0x43,
|
||||
0x9b, 0x3f, 0x36, 0xa0, 0x6a, 0xe1, 0x60, 0xe4, 0xb9, 0x01, 0x7e, 0x82, 0xed, 0x1e, 0xf6, 0xd1,
|
||||
0x55, 0x80, 0xee, 0x60, 0x3f, 0x08, 0xb1, 0xbf, 0xed, 0xf4, 0xea, 0xc6, 0xbc, 0x71, 0x73, 0xdc,
|
||||
0x2a, 0xf1, 0x91, 0xd5, 0x1e, 0x7a, 0x13, 0x4a, 0x43, 0x3c, 0xdc, 0x61, 0xb3, 0x39, 0x3a, 0x3b,
|
||||
0xc9, 0x06, 0x56, 0x7b, 0xa8, 0x01, 0x93, 0x3e, 0x3e, 0x70, 0x88, 0xb0, 0xf5, 0xfc, 0xbc, 0x71,
|
||||
0x33, 0x6f, 0x45, 0xdf, 0x04, 0xd1, 0xb7, 0x5f, 0x85, 0xdb, 0x21, 0xf6, 0x87, 0xf5, 0x71, 0x86,
|
||||
0x48, 0x06, 0x3a, 0xd8, 0x1f, 0x3e, 0x2c, 0x7e, 0xff, 0xef, 0xea, 0xf9, 0xa5, 0x85, 0xbb, 0xe6,
|
||||
0x3f, 0x4f, 0x40, 0xc5, 0xb2, 0xdd, 0x3e, 0xb6, 0xf0, 0x77, 0xf6, 0x71, 0x10, 0xa2, 0x1a, 0xe4,
|
||||
0xf7, 0xf0, 0x11, 0x95, 0xa3, 0x62, 0x91, 0x9f, 0x8c, 0x90, 0xdb, 0xc7, 0xdb, 0xd8, 0x65, 0x12,
|
||||
0x54, 0x08, 0x21, 0xb7, 0x8f, 0xdb, 0x6e, 0x0f, 0xcd, 0xc2, 0xc4, 0xc0, 0x19, 0x3a, 0x21, 0x67,
|
||||
0xcf, 0x3e, 0x62, 0x72, 0x8d, 0x27, 0xe4, 0x5a, 0x06, 0x08, 0x3c, 0x3f, 0xdc, 0xf6, 0xfc, 0x1e,
|
||||
0xf6, 0xeb, 0x13, 0xf3, 0xc6, 0xcd, 0xea, 0xe2, 0xdb, 0x0b, 0xaa, 0x7d, 0x17, 0x54, 0x81, 0x16,
|
||||
0xb6, 0x3c, 0x3f, 0xdc, 0x20, 0xb0, 0x56, 0x29, 0x10, 0x3f, 0xd1, 0xc7, 0x50, 0xa6, 0x44, 0x42,
|
||||
0xdb, 0xef, 0xe3, 0xb0, 0x5e, 0xa0, 0x54, 0x6e, 0x9c, 0x40, 0xa5, 0x43, 0x81, 0x2d, 0xca, 0x9e,
|
||||
0xfd, 0x46, 0x26, 0x54, 0x02, 0xec, 0x3b, 0xf6, 0xc0, 0xf9, 0xcc, 0xde, 0x19, 0xe0, 0x7a, 0x71,
|
||||
0xde, 0xb8, 0x39, 0x69, 0xc5, 0xc6, 0xc8, 0xfa, 0xf7, 0xf0, 0x51, 0xb0, 0xed, 0xb9, 0x83, 0xa3,
|
||||
0xfa, 0x24, 0x05, 0x98, 0x24, 0x03, 0x1b, 0xee, 0xe0, 0x88, 0x5a, 0xcf, 0xdb, 0x77, 0x43, 0x36,
|
||||
0x5b, 0xa2, 0xb3, 0x25, 0x3a, 0x42, 0xa7, 0xef, 0x41, 0x6d, 0xe8, 0xb8, 0xdb, 0x43, 0xaf, 0xb7,
|
||||
0x1d, 0x29, 0x04, 0x88, 0x42, 0x1e, 0x15, 0x7f, 0x8f, 0x5a, 0xe0, 0x9e, 0x55, 0x1d, 0x3a, 0xee,
|
||||
0x33, 0xaf, 0x67, 0x09, 0xfd, 0x10, 0x14, 0xfb, 0x30, 0x8e, 0x52, 0x4e, 0xa2, 0xd8, 0x87, 0x2a,
|
||||
0xca, 0x07, 0x70, 0x81, 0x70, 0xe9, 0xfa, 0xd8, 0x0e, 0xb1, 0xc4, 0xaa, 0xc4, 0xb1, 0x66, 0x86,
|
||||
0x8e, 0xbb, 0x4c, 0x41, 0x62, 0x88, 0xf6, 0x61, 0x0a, 0x71, 0x2a, 0x89, 0x68, 0x1f, 0xc6, 0x11,
|
||||
0xcd, 0x0f, 0xa0, 0x14, 0xd9, 0x05, 0x4d, 0xc2, 0xf8, 0xfa, 0xc6, 0x7a, 0xbb, 0x36, 0x86, 0x00,
|
||||
0x0a, 0xad, 0xad, 0xe5, 0xf6, 0xfa, 0x4a, 0xcd, 0x40, 0x65, 0x28, 0xae, 0xb4, 0xd9, 0x47, 0xae,
|
||||
0x51, 0xfc, 0x9c, 0xef, 0xb7, 0xa7, 0x00, 0xd2, 0x14, 0xa8, 0x08, 0xf9, 0xa7, 0xed, 0x4f, 0x6b,
|
||||
0x63, 0x04, 0xf8, 0x45, 0xdb, 0xda, 0x5a, 0xdd, 0x58, 0xaf, 0x19, 0x84, 0xca, 0xb2, 0xd5, 0x6e,
|
||||
0x75, 0xda, 0xb5, 0x1c, 0x81, 0x78, 0xb6, 0xb1, 0x52, 0xcb, 0xa3, 0x12, 0x4c, 0xbc, 0x68, 0xad,
|
||||
0x3d, 0x6f, 0xd7, 0xc6, 0x23, 0x62, 0x72, 0x17, 0xff, 0x89, 0x01, 0x53, 0xdc, 0xdc, 0xcc, 0xb7,
|
||||
0xd0, 0x7d, 0x28, 0xec, 0x52, 0xff, 0xa2, 0x3b, 0xb9, 0xbc, 0x78, 0x25, 0xb1, 0x37, 0x62, 0x3e,
|
||||
0x68, 0x71, 0x58, 0x64, 0x42, 0x7e, 0xef, 0x20, 0xa8, 0xe7, 0xe6, 0xf3, 0x37, 0xcb, 0x8b, 0xb5,
|
||||
0x05, 0x16, 0x47, 0x16, 0x9e, 0xe2, 0xa3, 0x17, 0xf6, 0x60, 0x1f, 0x5b, 0x64, 0x12, 0x21, 0x18,
|
||||
0x1f, 0x7a, 0x3e, 0xa6, 0x1b, 0x7e, 0xd2, 0xa2, 0xbf, 0x89, 0x17, 0x50, 0x9b, 0xf3, 0xcd, 0xce,
|
||||
0x3e, 0xa4, 0x78, 0xff, 0x6e, 0x00, 0x6c, 0xee, 0x87, 0xd9, 0x2e, 0x36, 0x0b, 0x13, 0x07, 0x84,
|
||||
0x03, 0x77, 0x2f, 0xf6, 0x41, 0x7d, 0x0b, 0xdb, 0x01, 0x8e, 0x7c, 0x8b, 0x7c, 0xa0, 0x79, 0x28,
|
||||
0x8e, 0x7c, 0x7c, 0xb0, 0xbd, 0x77, 0x40, 0xb9, 0x4d, 0x4a, 0x3b, 0x15, 0xc8, 0xf8, 0xd3, 0x03,
|
||||
0x74, 0x0b, 0x2a, 0x4e, 0xdf, 0xf5, 0x7c, 0xbc, 0xcd, 0x88, 0x4e, 0xa8, 0x60, 0x8b, 0x56, 0x99,
|
||||
0x4d, 0xd2, 0x25, 0x29, 0xb0, 0x8c, 0x55, 0x41, 0x0b, 0xbb, 0x46, 0xe6, 0xe4, 0x7a, 0xbe, 0x67,
|
||||
0x40, 0x99, 0xae, 0xe7, 0x4c, 0xca, 0x5e, 0x94, 0x0b, 0xc9, 0x51, 0xb4, 0x94, 0xc2, 0x53, 0x4b,
|
||||
0x93, 0x22, 0xb8, 0x80, 0x56, 0xf0, 0x00, 0x87, 0xf8, 0x2c, 0xc1, 0x4b, 0x51, 0x65, 0x5e, 0xab,
|
||||
0x4a, 0xc9, 0xef, 0xcf, 0x0d, 0xb8, 0x10, 0x63, 0x78, 0xa6, 0xa5, 0xd7, 0xa1, 0xd8, 0xa3, 0xc4,
|
||||
0x98, 0x4c, 0x79, 0x4b, 0x7c, 0xa2, 0xfb, 0x30, 0xc9, 0x45, 0x0a, 0xea, 0x79, 0xfd, 0x36, 0x94,
|
||||
0x52, 0x16, 0x99, 0x94, 0x81, 0x14, 0xf3, 0x1f, 0x72, 0x50, 0xe2, 0xca, 0xd8, 0x18, 0xa1, 0x16,
|
||||
0x4c, 0xf9, 0xec, 0x63, 0x9b, 0xae, 0x99, 0xcb, 0xd8, 0xc8, 0x8e, 0x93, 0x4f, 0xc6, 0xac, 0x0a,
|
||||
0x47, 0xa1, 0xc3, 0xe8, 0x57, 0xa0, 0x2c, 0x48, 0x8c, 0xf6, 0x43, 0x6e, 0xa8, 0x7a, 0x9c, 0x80,
|
||||
0xdc, 0xda, 0x4f, 0xc6, 0x2c, 0xe0, 0xe0, 0x9b, 0xfb, 0x21, 0xea, 0xc0, 0xac, 0x40, 0x66, 0xeb,
|
||||
0xe3, 0x62, 0xe4, 0x29, 0x95, 0xf9, 0x38, 0x95, 0xb4, 0x39, 0x9f, 0x8c, 0x59, 0x88, 0xe3, 0x2b,
|
||||
0x93, 0x68, 0x45, 0x8a, 0x14, 0x1e, 0xb2, 0xfc, 0x92, 0x12, 0xa9, 0x73, 0xe8, 0x72, 0x22, 0x42,
|
||||
0x5b, 0x4b, 0x8a, 0x6c, 0x9d, 0x43, 0x37, 0x52, 0xd9, 0xa3, 0x12, 0x14, 0xf9, 0xb0, 0xf9, 0x6f,
|
||||
0x39, 0x00, 0x61, 0xb1, 0x8d, 0x11, 0x5a, 0x81, 0xaa, 0xcf, 0xbf, 0x62, 0xfa, 0x7b, 0x53, 0xab,
|
||||
0x3f, 0x6e, 0xe8, 0x31, 0x6b, 0x4a, 0x20, 0x31, 0x71, 0x3f, 0x82, 0x4a, 0x44, 0x45, 0xaa, 0xf0,
|
||||
0xb2, 0x46, 0x85, 0x11, 0x85, 0xb2, 0x40, 0x20, 0x4a, 0xfc, 0x04, 0x2e, 0x46, 0xf8, 0x1a, 0x2d,
|
||||
0xbe, 0x75, 0x8c, 0x16, 0x23, 0x82, 0x17, 0x04, 0x05, 0x55, 0x8f, 0x8f, 0x15, 0xc1, 0xa4, 0x22,
|
||||
0x2f, 0x6b, 0x14, 0xc9, 0x80, 0x54, 0x4d, 0x46, 0x12, 0xc6, 0x54, 0x09, 0x24, 0xed, 0xb3, 0x71,
|
||||
0xf3, 0x2f, 0xc7, 0xa1, 0xb8, 0xec, 0x0d, 0x47, 0xb6, 0x4f, 0x36, 0x51, 0xc1, 0xc7, 0xc1, 0xfe,
|
||||
0x20, 0xa4, 0x0a, 0xac, 0x2e, 0x5e, 0x8f, 0xf3, 0xe0, 0x60, 0xe2, 0xaf, 0x45, 0x41, 0x2d, 0x8e,
|
||||
0x42, 0x90, 0x79, 0x96, 0xcf, 0x9d, 0x02, 0x99, 0xe7, 0x78, 0x8e, 0x22, 0x02, 0x42, 0x5e, 0x06,
|
||||
0x84, 0x06, 0x14, 0xf9, 0xf1, 0x8e, 0x05, 0xeb, 0x27, 0x63, 0x96, 0x18, 0x40, 0xef, 0xc1, 0x74,
|
||||
0x32, 0x15, 0x4e, 0x70, 0x98, 0x6a, 0x37, 0x9e, 0x39, 0xaf, 0x43, 0x25, 0x96, 0xa1, 0x0b, 0x1c,
|
||||
0xae, 0x3c, 0x54, 0xf2, 0xf2, 0x25, 0x11, 0xd6, 0xc9, 0xb1, 0xa2, 0xf2, 0x64, 0x4c, 0x04, 0xf6,
|
||||
0x6b, 0x22, 0xb0, 0x4f, 0xaa, 0x89, 0x96, 0xe8, 0x95, 0xc7, 0xf8, 0xb7, 0xd5, 0xa8, 0xf5, 0x75,
|
||||
0x82, 0x1c, 0x01, 0xc9, 0xf0, 0x65, 0x5a, 0x30, 0x15, 0x53, 0x19, 0xc9, 0x91, 0xed, 0x6f, 0x3c,
|
||||
0x6f, 0xad, 0xb1, 0x84, 0xfa, 0x98, 0xe6, 0x50, 0xab, 0x66, 0x90, 0x04, 0xbd, 0xd6, 0xde, 0xda,
|
||||
0xaa, 0xe5, 0xd0, 0x25, 0x28, 0xad, 0x6f, 0x74, 0xb6, 0x19, 0x54, 0xbe, 0x51, 0xfc, 0x63, 0x16,
|
||||
0x49, 0x64, 0x7e, 0xfe, 0x34, 0xa2, 0xc9, 0x53, 0xb4, 0x92, 0x99, 0xc7, 0x94, 0xcc, 0x6c, 0x88,
|
||||
0xcc, 0x9c, 0x93, 0x99, 0x39, 0x8f, 0x10, 0x4c, 0xac, 0xb5, 0x5b, 0x5b, 0x34, 0x49, 0x33, 0xd2,
|
||||
0x4b, 0xe9, 0x6c, 0xfd, 0xa8, 0x0a, 0x15, 0x66, 0x9e, 0xed, 0x7d, 0x97, 0x1c, 0x26, 0x7e, 0x6a,
|
||||
0x00, 0x48, 0x87, 0x45, 0x4d, 0x28, 0x76, 0x99, 0x08, 0x75, 0x83, 0x46, 0xc0, 0x8b, 0x5a, 0x8b,
|
||||
0x5b, 0x02, 0x0a, 0xdd, 0x83, 0x62, 0xb0, 0xdf, 0xed, 0xe2, 0x40, 0x64, 0xee, 0x37, 0x92, 0x41,
|
||||
0x98, 0x07, 0x44, 0x4b, 0xc0, 0x11, 0x94, 0x57, 0xb6, 0x33, 0xd8, 0xa7, 0x79, 0xfc, 0x78, 0x14,
|
||||
0x0e, 0x27, 0x63, 0xec, 0x9f, 0x19, 0x50, 0x56, 0xdc, 0xe2, 0xe7, 0x4c, 0x01, 0x57, 0xa0, 0x44,
|
||||
0x85, 0xc1, 0x3d, 0x9e, 0x04, 0x26, 0x2d, 0x39, 0x80, 0xbe, 0x06, 0x25, 0xe1, 0x49, 0x22, 0x0f,
|
||||
0xd4, 0xf5, 0x64, 0x37, 0x46, 0x96, 0x04, 0x95, 0x42, 0x76, 0x60, 0x86, 0xea, 0xa9, 0x4b, 0x6e,
|
||||
0x1f, 0x42, 0xb3, 0xea, 0xb1, 0xdc, 0x48, 0x1c, 0xcb, 0x1b, 0x30, 0x39, 0xda, 0x3d, 0x0a, 0x9c,
|
||||
0xae, 0x3d, 0xe0, 0xe2, 0x44, 0xdf, 0x92, 0xea, 0x16, 0x20, 0x95, 0xea, 0x59, 0x14, 0x20, 0x89,
|
||||
0x5e, 0x82, 0xf2, 0x13, 0x3b, 0xd8, 0xe5, 0x42, 0xca, 0xf1, 0xfb, 0x30, 0x45, 0xc6, 0x9f, 0xbe,
|
||||
0x38, 0x85, 0xf8, 0x02, 0x6b, 0xc9, 0xfc, 0x47, 0x03, 0xaa, 0x02, 0xed, 0x4c, 0x06, 0x42, 0x30,
|
||||
0xbe, 0x6b, 0x07, 0xbb, 0x54, 0x19, 0x53, 0x16, 0xfd, 0x8d, 0xde, 0x83, 0x5a, 0x97, 0xad, 0x7f,
|
||||
0x3b, 0x71, 0xef, 0x9a, 0xe6, 0xe3, 0x91, 0xef, 0xdf, 0x86, 0x29, 0x82, 0xb2, 0x1d, 0xbf, 0x07,
|
||||
0x09, 0x37, 0xfe, 0x9a, 0x55, 0xd9, 0xa5, 0x6b, 0x4e, 0x8a, 0x6f, 0x43, 0x85, 0x29, 0xe3, 0xbc,
|
||||
0x65, 0x97, 0x7a, 0x6d, 0xc0, 0xf4, 0x96, 0x6b, 0x8f, 0x82, 0x5d, 0x2f, 0x4c, 0xe8, 0x7c, 0xc9,
|
||||
0xfc, 0x5b, 0x03, 0x6a, 0x72, 0xf2, 0x4c, 0x32, 0xbc, 0x0b, 0xd3, 0x3e, 0x1e, 0xda, 0x8e, 0xeb,
|
||||
0xb8, 0xfd, 0xed, 0x9d, 0xa3, 0x10, 0x07, 0xfc, 0xfa, 0x5a, 0x8d, 0x86, 0x1f, 0x91, 0x51, 0x22,
|
||||
0xec, 0xce, 0xc0, 0xdb, 0xe1, 0x41, 0x9a, 0xfe, 0x46, 0x6f, 0xc5, 0xa3, 0x74, 0x49, 0xea, 0x4d,
|
||||
0x8c, 0x4b, 0x99, 0x7f, 0x92, 0x83, 0xca, 0x27, 0x76, 0xd8, 0x15, 0x3b, 0x08, 0xad, 0x42, 0x35,
|
||||
0x0a, 0xe3, 0x74, 0x84, 0xcb, 0x9d, 0x38, 0x70, 0x50, 0x1c, 0x71, 0xaf, 0x11, 0x07, 0x8e, 0xa9,
|
||||
0xae, 0x3a, 0x40, 0x49, 0xd9, 0x6e, 0x17, 0x0f, 0x22, 0x52, 0xb9, 0x6c, 0x52, 0x14, 0x50, 0x25,
|
||||
0xa5, 0x0e, 0xa0, 0x6f, 0x42, 0x6d, 0xe4, 0x7b, 0x7d, 0x1f, 0x07, 0x41, 0x44, 0x8c, 0xa5, 0x70,
|
||||
0x53, 0x43, 0x6c, 0x93, 0x83, 0x26, 0x4e, 0x31, 0xf7, 0x9f, 0x8c, 0x59, 0xd3, 0xa3, 0xf8, 0x9c,
|
||||
0x0c, 0xac, 0xd3, 0xf2, 0xbc, 0xc7, 0x22, 0xeb, 0x0f, 0xf3, 0x80, 0xd2, 0xcb, 0xfc, 0xb2, 0xc7,
|
||||
0xe4, 0x1b, 0x50, 0x0d, 0x42, 0xdb, 0x4f, 0xed, 0xf9, 0x29, 0x3a, 0x1a, 0xed, 0xf8, 0x77, 0x21,
|
||||
0x92, 0x6c, 0xdb, 0xf5, 0x42, 0xe7, 0xd5, 0x11, 0xbb, 0xa0, 0x58, 0x55, 0x31, 0xbc, 0x4e, 0x47,
|
||||
0xd1, 0x3a, 0x14, 0x5f, 0x39, 0x83, 0x10, 0xfb, 0x41, 0x7d, 0x62, 0x3e, 0x7f, 0xb3, 0xba, 0xf8,
|
||||
0xfe, 0x49, 0x86, 0x59, 0xf8, 0x98, 0xc2, 0x77, 0x8e, 0x46, 0xea, 0xe9, 0x97, 0x13, 0x51, 0x8f,
|
||||
0xf1, 0x05, 0xfd, 0x8d, 0xc8, 0x84, 0xc9, 0xd7, 0x84, 0xe8, 0xb6, 0xd3, 0xa3, 0xb9, 0x38, 0xf2,
|
||||
0xc3, 0xfb, 0x56, 0x91, 0x4e, 0xac, 0xf6, 0xd0, 0x75, 0x98, 0x7c, 0xe5, 0xdb, 0xfd, 0x21, 0x76,
|
||||
0x43, 0x76, 0xcb, 0x97, 0x30, 0xd1, 0x84, 0xb9, 0x00, 0x20, 0x45, 0x21, 0x99, 0x6f, 0x7d, 0x63,
|
||||
0xf3, 0x79, 0xa7, 0x36, 0x86, 0x2a, 0x30, 0xb9, 0xbe, 0xb1, 0xd2, 0x5e, 0x6b, 0x93, 0xdc, 0x28,
|
||||
0x72, 0xde, 0x3d, 0xe9, 0x74, 0x2d, 0x61, 0x88, 0xd8, 0x9e, 0x50, 0xe5, 0x32, 0xe2, 0x97, 0x6e,
|
||||
0x21, 0x97, 0x20, 0x71, 0xcf, 0xbc, 0x06, 0xb3, 0xba, 0xad, 0x21, 0x00, 0xee, 0x9b, 0xff, 0x92,
|
||||
0x83, 0x29, 0xee, 0x08, 0x67, 0xf2, 0xdc, 0xcb, 0x8a, 0x54, 0xfc, 0x7a, 0x22, 0x94, 0x54, 0x87,
|
||||
0x22, 0x73, 0x90, 0x1e, 0xbf, 0xff, 0x8a, 0x4f, 0x12, 0x9c, 0xd9, 0x7e, 0xc7, 0x3d, 0x6e, 0xf6,
|
||||
0xe8, 0x5b, 0x1b, 0x36, 0x27, 0x32, 0xc3, 0x66, 0xe4, 0x70, 0x76, 0xc0, 0x0f, 0x56, 0x25, 0x69,
|
||||
0x8a, 0x8a, 0x70, 0x2a, 0x32, 0x19, 0xb3, 0x59, 0x31, 0xc3, 0x66, 0xe8, 0x06, 0x14, 0xf0, 0x01,
|
||||
0x76, 0xc3, 0xa0, 0x5e, 0xa6, 0x89, 0x74, 0x4a, 0x5c, 0xa8, 0xda, 0x64, 0xd4, 0xe2, 0x93, 0xd2,
|
||||
0x54, 0x1f, 0xc1, 0x0c, 0xbd, 0xef, 0x3e, 0xf6, 0x6d, 0x57, 0xbd, 0xb3, 0x77, 0x3a, 0x6b, 0x3c,
|
||||
0xed, 0x90, 0x9f, 0xa8, 0x0a, 0xb9, 0xd5, 0x15, 0xae, 0x9f, 0xdc, 0xea, 0x8a, 0xc4, 0xff, 0x7d,
|
||||
0x03, 0x90, 0x4a, 0xe0, 0x4c, 0xb6, 0x48, 0x70, 0x11, 0x72, 0xe4, 0xa5, 0x1c, 0xb3, 0x30, 0x81,
|
||||
0x7d, 0xdf, 0xf3, 0x59, 0xa0, 0xb4, 0xd8, 0x87, 0x94, 0xe6, 0x0e, 0x17, 0xc6, 0xc2, 0x07, 0xde,
|
||||
0x5e, 0x14, 0x01, 0x18, 0x59, 0x23, 0x2d, 0x7c, 0x07, 0x2e, 0xc4, 0xc0, 0xcf, 0x27, 0xc5, 0x6f,
|
||||
0xc0, 0x34, 0xa5, 0xba, 0xbc, 0x8b, 0xbb, 0x7b, 0x23, 0xcf, 0x71, 0x53, 0x12, 0xa0, 0xeb, 0x24,
|
||||
0x76, 0x89, 0x74, 0x41, 0x96, 0xc8, 0xd6, 0x5c, 0x89, 0x06, 0x3b, 0x9d, 0x35, 0xb9, 0xd5, 0x77,
|
||||
0xe0, 0x52, 0x82, 0xa0, 0x58, 0xd9, 0xaf, 0x42, 0xb9, 0x1b, 0x0d, 0x06, 0xfc, 0x04, 0x79, 0x35,
|
||||
0x2e, 0x6e, 0x12, 0x55, 0xc5, 0x90, 0x3c, 0xbe, 0x09, 0x6f, 0xa4, 0x78, 0x9c, 0x87, 0x3a, 0xee,
|
||||
0x9b, 0x77, 0xe1, 0x22, 0xa5, 0xfc, 0x14, 0xe3, 0x51, 0x6b, 0xe0, 0x1c, 0x9c, 0x6c, 0x96, 0x23,
|
||||
0xbe, 0x5e, 0x05, 0xe3, 0xab, 0xdd, 0x56, 0x92, 0x75, 0x9b, 0xb3, 0xee, 0x38, 0x43, 0xdc, 0xf1,
|
||||
0xd6, 0xb2, 0xa5, 0x25, 0x89, 0x7c, 0x0f, 0x1f, 0x05, 0xfc, 0xf8, 0x48, 0x7f, 0xcb, 0xe8, 0xf5,
|
||||
0xd7, 0x06, 0x57, 0xa7, 0x4a, 0xe7, 0x2b, 0x76, 0x8d, 0x39, 0x80, 0x3e, 0xf1, 0x41, 0xdc, 0x23,
|
||||
0x13, 0xac, 0x36, 0xa7, 0x8c, 0x44, 0x02, 0x93, 0x2c, 0x54, 0x49, 0x0a, 0x7c, 0x95, 0x3b, 0x0e,
|
||||
0xfd, 0x4f, 0x90, 0x3a, 0x29, 0xbd, 0x03, 0x65, 0x3a, 0xb3, 0x15, 0xda, 0xe1, 0x7e, 0x90, 0x65,
|
||||
0xb9, 0x25, 0xf3, 0x87, 0x06, 0xf7, 0x28, 0x41, 0xe7, 0x4c, 0x6b, 0xbe, 0x07, 0x05, 0x7a, 0x43,
|
||||
0x14, 0x37, 0x9d, 0xcb, 0x9a, 0x8d, 0xcd, 0x24, 0xb2, 0x38, 0xa0, 0x72, 0x4e, 0x32, 0xa0, 0xf0,
|
||||
0x8c, 0x76, 0x0e, 0x14, 0x69, 0xc7, 0x85, 0xe5, 0x5c, 0x7b, 0xc8, 0xca, 0x8f, 0x25, 0x8b, 0xfe,
|
||||
0xa6, 0x17, 0x02, 0x8c, 0xfd, 0xe7, 0xd6, 0x1a, 0xbb, 0x81, 0x94, 0xac, 0xe8, 0x9b, 0x28, 0xb6,
|
||||
0x3b, 0x70, 0xb0, 0x1b, 0xd2, 0xd9, 0x71, 0x3a, 0xab, 0x8c, 0xa0, 0x1b, 0x50, 0x72, 0x82, 0x35,
|
||||
0x6c, 0xfb, 0x2e, 0x2f, 0xf1, 0x2b, 0x81, 0x59, 0xce, 0xc8, 0x3d, 0xf6, 0x2d, 0xa8, 0x31, 0xc9,
|
||||
0x5a, 0xbd, 0x9e, 0x72, 0xda, 0x8f, 0xf8, 0x1b, 0x09, 0xfe, 0x31, 0xfa, 0xb9, 0x93, 0xe9, 0xff,
|
||||
0x8d, 0x01, 0x33, 0x0a, 0x83, 0x33, 0x99, 0xe0, 0x36, 0x14, 0x58, 0xff, 0x85, 0x1f, 0x05, 0x67,
|
||||
0xe3, 0x58, 0x8c, 0x8d, 0xc5, 0x61, 0xd0, 0x02, 0x14, 0xd9, 0x2f, 0x71, 0x8d, 0xd3, 0x83, 0x0b,
|
||||
0x20, 0x29, 0xf2, 0x02, 0x5c, 0xe0, 0x73, 0x78, 0xe8, 0xe9, 0x7c, 0x6e, 0x3c, 0x1e, 0x21, 0x7e,
|
||||
0x60, 0xc0, 0x6c, 0x1c, 0xe1, 0x4c, 0xab, 0x54, 0xe4, 0xce, 0x7d, 0x29, 0xb9, 0x7f, 0x4d, 0xc8,
|
||||
0xfd, 0x7c, 0xd4, 0x53, 0x8e, 0x9c, 0xc9, 0x1d, 0xa7, 0x5a, 0x37, 0x17, 0xb7, 0xae, 0xa4, 0xf5,
|
||||
0xe3, 0x68, 0x4d, 0x82, 0xd8, 0x99, 0xd6, 0xf4, 0xc1, 0xa9, 0xd6, 0xa4, 0x1c, 0xc1, 0x52, 0x8b,
|
||||
0x5b, 0x15, 0xdb, 0x68, 0xcd, 0x09, 0xa2, 0x8c, 0xf3, 0x3e, 0x54, 0x06, 0x8e, 0x8b, 0x6d, 0x9f,
|
||||
0xf7, 0x90, 0x0c, 0x75, 0x3f, 0x3e, 0xb0, 0x62, 0x93, 0x92, 0xd4, 0x6f, 0x1b, 0x80, 0x54, 0x5a,
|
||||
0xbf, 0x18, 0x6b, 0x35, 0x85, 0x82, 0x37, 0x7d, 0x6f, 0xe8, 0x85, 0x27, 0x6d, 0xb3, 0xfb, 0xe6,
|
||||
0xef, 0x1a, 0x70, 0x31, 0x81, 0xf1, 0x8b, 0x90, 0xfc, 0xbe, 0x79, 0x05, 0x66, 0x56, 0xb0, 0x38,
|
||||
0xe3, 0xa5, 0x6a, 0x07, 0x5b, 0x80, 0xd4, 0xd9, 0xf3, 0x39, 0xc5, 0xfc, 0x12, 0xcc, 0x3c, 0xf3,
|
||||
0x0e, 0x48, 0x20, 0x27, 0xd3, 0x32, 0x4c, 0xb1, 0x62, 0x56, 0xa4, 0xaf, 0xe8, 0x5b, 0x86, 0xde,
|
||||
0x2d, 0x40, 0x2a, 0xe6, 0x79, 0x88, 0xb3, 0x64, 0xfe, 0xb7, 0x01, 0x95, 0xd6, 0xc0, 0xf6, 0x87,
|
||||
0x42, 0x94, 0x8f, 0xa0, 0xc0, 0x2a, 0x33, 0xbc, 0xcc, 0xfa, 0x4e, 0x9c, 0x9e, 0x0a, 0xcb, 0x3e,
|
||||
0x5a, 0xac, 0x8e, 0xc3, 0xb1, 0xc8, 0x52, 0x78, 0x67, 0x79, 0x25, 0xd1, 0x69, 0x5e, 0x41, 0x77,
|
||||
0x60, 0xc2, 0x26, 0x28, 0x34, 0xbd, 0x56, 0x93, 0xe5, 0x32, 0x4a, 0x8d, 0x5c, 0x89, 0x2c, 0x06,
|
||||
0x65, 0x7e, 0x08, 0x65, 0x85, 0x03, 0x2a, 0x42, 0xfe, 0x71, 0x9b, 0x5f, 0x93, 0x5a, 0xcb, 0x9d,
|
||||
0xd5, 0x17, 0xac, 0x84, 0x58, 0x05, 0x58, 0x69, 0x47, 0xdf, 0x39, 0x4d, 0x63, 0xcf, 0xe6, 0x74,
|
||||
0x78, 0xde, 0x52, 0x25, 0x34, 0xb2, 0x24, 0xcc, 0x9d, 0x46, 0x42, 0xc9, 0xe2, 0xb7, 0x0c, 0x98,
|
||||
0xe2, 0xaa, 0x39, 0x6b, 0x6a, 0xa6, 0x94, 0x33, 0x52, 0xb3, 0xb2, 0x0c, 0x8b, 0x03, 0x4a, 0x19,
|
||||
0xfe, 0xc9, 0x80, 0xda, 0x8a, 0xf7, 0xda, 0xed, 0xfb, 0x76, 0x2f, 0xf2, 0xc1, 0x8f, 0x13, 0xe6,
|
||||
0x5c, 0x48, 0x54, 0xfa, 0x13, 0xf0, 0x72, 0x20, 0x61, 0xd6, 0xba, 0xac, 0xa5, 0xb0, 0xfc, 0x2e,
|
||||
0x3e, 0xcd, 0xaf, 0xc3, 0x74, 0x02, 0x89, 0x18, 0xe8, 0x45, 0x6b, 0x6d, 0x75, 0x85, 0x18, 0x84,
|
||||
0xd6, 0x7b, 0xdb, 0xeb, 0xad, 0x47, 0x6b, 0x6d, 0xde, 0x95, 0x6d, 0xad, 0x2f, 0xb7, 0xd7, 0xa4,
|
||||
0xa1, 0x1e, 0x88, 0x15, 0x3c, 0x30, 0x07, 0x30, 0xa3, 0x08, 0x74, 0xd6, 0xe6, 0x98, 0x5e, 0x5e,
|
||||
0xc9, 0xad, 0x0e, 0x53, 0xfc, 0x94, 0x93, 0x74, 0xfc, 0x9f, 0xe6, 0xa1, 0x2a, 0xa6, 0xbe, 0x1a,
|
||||
0x29, 0xd0, 0x25, 0x28, 0xf4, 0x76, 0xb6, 0x9c, 0xcf, 0x44, 0x5f, 0x96, 0x7f, 0x91, 0xf1, 0x01,
|
||||
0xe3, 0xc3, 0x5e, 0x5b, 0xf0, 0x2f, 0x74, 0x85, 0x3d, 0xc4, 0x58, 0x75, 0x7b, 0xf8, 0x90, 0x1e,
|
||||
0x86, 0xc6, 0x2d, 0x39, 0x40, 0x8b, 0x9a, 0xfc, 0x55, 0x06, 0xbd, 0xeb, 0x2a, 0xaf, 0x34, 0xd0,
|
||||
0x12, 0xd4, 0xc8, 0xef, 0xd6, 0x68, 0x34, 0x70, 0x70, 0x8f, 0x11, 0x20, 0xd7, 0xdc, 0x71, 0x79,
|
||||
0xda, 0x49, 0x01, 0xa0, 0x6b, 0x50, 0xa0, 0x57, 0xc0, 0xa0, 0x3e, 0x49, 0xf2, 0xaa, 0x04, 0xe5,
|
||||
0xc3, 0xe8, 0x3d, 0x28, 0x33, 0x89, 0x57, 0xdd, 0xe7, 0x01, 0xa6, 0x6f, 0x16, 0x94, 0x7a, 0x88,
|
||||
0x3a, 0x17, 0x3f, 0x67, 0x41, 0xd6, 0x39, 0x0b, 0x35, 0xa1, 0x1a, 0x84, 0x9e, 0x6f, 0xf7, 0xf1,
|
||||
0x0b, 0xae, 0xb2, 0x72, 0xbc, 0x68, 0x97, 0x98, 0x96, 0xe6, 0xba, 0x02, 0x33, 0xad, 0xfd, 0x70,
|
||||
0xb7, 0xed, 0x92, 0xe4, 0x98, 0x32, 0xe6, 0x55, 0x40, 0x64, 0x76, 0xc5, 0x09, 0xb4, 0xd3, 0x1c,
|
||||
0x59, 0xbb, 0x13, 0x1e, 0x98, 0xeb, 0x70, 0x81, 0xcc, 0x62, 0x37, 0x74, 0xba, 0xca, 0x41, 0x44,
|
||||
0x1c, 0x75, 0x8d, 0xc4, 0x51, 0xd7, 0x0e, 0x82, 0xd7, 0x9e, 0xdf, 0xe3, 0xc6, 0x8e, 0xbe, 0x25,
|
||||
0xb7, 0xbf, 0x37, 0x98, 0x34, 0xcf, 0x83, 0xd8, 0x31, 0xf5, 0x4b, 0xd2, 0x43, 0xbf, 0x0c, 0x45,
|
||||
0xfe, 0x3c, 0x88, 0x57, 0xff, 0x2e, 0x2d, 0xb0, 0x47, 0x49, 0x0b, 0x9c, 0xf0, 0x06, 0x9b, 0x55,
|
||||
0x2a, 0x54, 0x1c, 0x9e, 0xa8, 0x79, 0xd7, 0x0e, 0x76, 0x71, 0x6f, 0x53, 0x10, 0x8f, 0xd5, 0x46,
|
||||
0x1f, 0x58, 0x89, 0x69, 0x29, 0xfb, 0x3d, 0x29, 0xfa, 0x63, 0x1c, 0x1e, 0x23, 0xba, 0x5a, 0x7d,
|
||||
0xbf, 0x28, 0x50, 0x78, 0xd3, 0xf0, 0x34, 0x58, 0x3f, 0x32, 0xe0, 0xaa, 0x40, 0x5b, 0xde, 0xb5,
|
||||
0xdd, 0x3e, 0x16, 0xc2, 0xfc, 0xbc, 0xfa, 0x4a, 0x2f, 0x3a, 0x7f, 0xca, 0x45, 0x3f, 0x85, 0x7a,
|
||||
0xb4, 0x68, 0x5a, 0x89, 0xf1, 0x06, 0xea, 0x22, 0xf6, 0x03, 0x1e, 0x11, 0x4a, 0x16, 0xfd, 0x4d,
|
||||
0xc6, 0x7c, 0x6f, 0x10, 0x5d, 0x82, 0xc8, 0x6f, 0x49, 0x6c, 0x0d, 0x2e, 0x0b, 0x62, 0xbc, 0x34,
|
||||
0x12, 0xa7, 0x96, 0x5a, 0xd3, 0xb1, 0xd4, 0xb8, 0x3d, 0x08, 0x8d, 0xe3, 0xb7, 0x92, 0x16, 0x25,
|
||||
0x6e, 0x42, 0xca, 0xc5, 0xd0, 0x71, 0x99, 0x63, 0x1e, 0x40, 0x64, 0x56, 0xce, 0xab, 0xa9, 0x79,
|
||||
0x42, 0x52, 0x3b, 0xcf, 0xb7, 0x00, 0x99, 0x4f, 0x6d, 0x81, 0x6c, 0xae, 0x18, 0xe6, 0x22, 0x41,
|
||||
0x89, 0xda, 0x37, 0xb1, 0x3f, 0x74, 0x82, 0x40, 0x69, 0x43, 0xe9, 0xd4, 0xf5, 0x0e, 0x8c, 0x8f,
|
||||
0x30, 0x4f, 0xde, 0xe5, 0x45, 0x24, 0x7c, 0x42, 0x41, 0xa6, 0xf3, 0x92, 0xcd, 0x10, 0xae, 0x09,
|
||||
0x36, 0xcc, 0x20, 0x5a, 0x3e, 0x49, 0x31, 0x45, 0xe9, 0x3b, 0x97, 0x51, 0xfa, 0xce, 0xc7, 0x4b,
|
||||
0xdf, 0xb1, 0x03, 0xa5, 0x1a, 0xa8, 0xce, 0xe7, 0x40, 0xd9, 0x61, 0x06, 0x88, 0xe2, 0xdb, 0xf9,
|
||||
0x50, 0xfd, 0x03, 0x1e, 0xa8, 0xce, 0x2b, 0x0d, 0x62, 0xba, 0x66, 0xd1, 0xa4, 0x14, 0x9f, 0xc8,
|
||||
0x84, 0x0a, 0x31, 0x92, 0xa5, 0xf6, 0x04, 0xc6, 0xad, 0xd8, 0x98, 0x0c, 0xc6, 0x7b, 0x30, 0x1b,
|
||||
0x0f, 0xc6, 0x67, 0x12, 0x6a, 0x16, 0x26, 0x42, 0x6f, 0x0f, 0x8b, 0xcc, 0xcc, 0x3e, 0x52, 0x6a,
|
||||
0x8d, 0x02, 0xf5, 0xf9, 0xa8, 0xf5, 0xdb, 0x92, 0x2a, 0x75, 0xc0, 0xb3, 0xae, 0x80, 0x6c, 0x47,
|
||||
0x71, 0xf7, 0x65, 0x1f, 0x92, 0xd7, 0x27, 0x70, 0x29, 0x19, 0x7c, 0xcf, 0x67, 0x11, 0xdb, 0xcc,
|
||||
0x39, 0x75, 0xe1, 0xf9, 0x7c, 0x18, 0xbc, 0x94, 0x71, 0x52, 0x09, 0xba, 0xe7, 0x43, 0xfb, 0xd7,
|
||||
0xa1, 0xa1, 0x8b, 0xc1, 0xe7, 0xea, 0x8b, 0x51, 0x48, 0x3e, 0x1f, 0xaa, 0x3f, 0x30, 0x24, 0x59,
|
||||
0x75, 0xd7, 0x7c, 0xf8, 0x65, 0xc8, 0x8a, 0x5c, 0x77, 0x37, 0xda, 0x3e, 0xcd, 0x28, 0x5a, 0xe6,
|
||||
0xf5, 0xd1, 0x52, 0xa2, 0x50, 0x40, 0xe1, 0x7f, 0x32, 0xd4, 0x7f, 0x95, 0xbb, 0x97, 0x33, 0x93,
|
||||
0x79, 0xe7, 0xac, 0xcc, 0x48, 0x7a, 0x8e, 0x98, 0xd1, 0x8f, 0x94, 0xab, 0xa8, 0x49, 0xea, 0x7c,
|
||||
0x4c, 0xf7, 0x1b, 0x32, 0xc1, 0xa4, 0xf2, 0xd8, 0xf9, 0x70, 0xb0, 0x61, 0x3e, 0x3b, 0x85, 0x9d,
|
||||
0x0b, 0x8b, 0x5b, 0x2d, 0x28, 0x45, 0x37, 0x5f, 0xe5, 0x9d, 0x6e, 0x19, 0x8a, 0xeb, 0x1b, 0x5b,
|
||||
0x9b, 0xad, 0x65, 0x72, 0xb1, 0x9b, 0x85, 0xe2, 0xf2, 0x86, 0x65, 0x3d, 0xdf, 0xec, 0x90, 0x9b,
|
||||
0x5d, 0xf2, 0xd9, 0xce, 0xe2, 0xcf, 0xf2, 0x90, 0x7b, 0xfa, 0x02, 0x7d, 0x0a, 0x13, 0xec, 0xd9,
|
||||
0xd8, 0x31, 0xaf, 0x07, 0x1b, 0xc7, 0xbd, 0x8c, 0x33, 0xdf, 0xf8, 0xfe, 0x7f, 0xfe, 0xec, 0x0f,
|
||||
0x73, 0x33, 0x66, 0xa5, 0x79, 0xb0, 0xd4, 0xdc, 0x3b, 0x68, 0xd2, 0x24, 0xfb, 0xd0, 0xb8, 0x85,
|
||||
0xbe, 0x01, 0xf9, 0xcd, 0xfd, 0x10, 0x65, 0xbe, 0x2a, 0x6c, 0x64, 0x3f, 0x96, 0x33, 0x2f, 0x52,
|
||||
0xa2, 0xd3, 0x26, 0x70, 0xa2, 0xa3, 0xfd, 0x90, 0x90, 0xfc, 0x0e, 0x94, 0xd5, 0xa7, 0x6e, 0x27,
|
||||
0x3e, 0x35, 0x6c, 0x9c, 0xfc, 0x8c, 0xce, 0xbc, 0x4a, 0x59, 0xbd, 0x61, 0x22, 0xce, 0x8a, 0x3d,
|
||||
0xc6, 0x53, 0x57, 0xd1, 0x39, 0x74, 0x51, 0xe6, 0x43, 0xc4, 0x46, 0xf6, 0xcb, 0xba, 0xd4, 0x2a,
|
||||
0xc2, 0x43, 0x97, 0x90, 0xfc, 0x36, 0x7f, 0x42, 0xd7, 0x0d, 0xd1, 0x35, 0xcd, 0x1b, 0x28, 0xf5,
|
||||
0x6d, 0x4f, 0x63, 0x3e, 0x1b, 0x80, 0x33, 0xb9, 0x42, 0x99, 0x5c, 0x32, 0x67, 0x38, 0x93, 0x6e,
|
||||
0x04, 0xf2, 0xd0, 0xb8, 0xb5, 0xd8, 0x85, 0x09, 0xda, 0x3b, 0x46, 0x2f, 0xc5, 0x8f, 0x86, 0xa6,
|
||||
0x2b, 0x9f, 0x61, 0xe8, 0x58, 0xd7, 0xd9, 0x9c, 0xa5, 0x8c, 0xaa, 0x66, 0x89, 0x30, 0xa2, 0x9d,
|
||||
0xe3, 0x87, 0xc6, 0xad, 0x9b, 0xc6, 0x5d, 0x63, 0xf1, 0xaf, 0x26, 0x60, 0x82, 0xf6, 0x28, 0xd0,
|
||||
0x1e, 0x80, 0xec, 0x91, 0x26, 0x57, 0x97, 0x6a, 0xbf, 0x26, 0x57, 0x97, 0x6e, 0xaf, 0x9a, 0x0d,
|
||||
0xca, 0x74, 0xd6, 0x9c, 0x26, 0x4c, 0x69, 0xeb, 0xa3, 0x49, 0x3b, 0x3d, 0x44, 0x8f, 0x3f, 0x32,
|
||||
0x78, 0xb3, 0x86, 0xb9, 0x19, 0xd2, 0x51, 0x8b, 0xf5, 0x47, 0x93, 0xdb, 0x41, 0xd3, 0x12, 0x35,
|
||||
0x1f, 0x50, 0x86, 0x4d, 0xb3, 0x26, 0x19, 0xfa, 0x14, 0xe2, 0xa1, 0x71, 0xeb, 0x65, 0xdd, 0xbc,
|
||||
0xc0, 0xb5, 0x9c, 0x98, 0x41, 0xdf, 0x85, 0x6a, 0xbc, 0x93, 0x87, 0xae, 0x6b, 0x78, 0x25, 0x3b,
|
||||
0x83, 0x8d, 0xb7, 0x8f, 0x07, 0xe2, 0x32, 0xcd, 0x51, 0x99, 0x38, 0x73, 0xc6, 0x79, 0x0f, 0xe3,
|
||||
0x91, 0x4d, 0x80, 0xb8, 0x0d, 0xd0, 0x9f, 0x1a, 0xbc, 0x19, 0x2b, 0x1b, 0x71, 0x48, 0x47, 0x3d,
|
||||
0xd5, 0xef, 0x6b, 0xdc, 0x38, 0x01, 0x8a, 0x0b, 0xf1, 0x21, 0x15, 0xe2, 0x03, 0x73, 0x56, 0x0a,
|
||||
0x11, 0x3a, 0x43, 0x1c, 0x7a, 0x5c, 0x8a, 0x97, 0x57, 0xcc, 0x37, 0x62, 0xca, 0x89, 0xcd, 0x4a,
|
||||
0x63, 0xb1, 0x86, 0x99, 0xd6, 0x58, 0xb1, 0x9e, 0x9c, 0xd6, 0x58, 0xf1, 0x6e, 0x9b, 0xce, 0x58,
|
||||
0xbc, 0x3d, 0xa6, 0x31, 0x56, 0x34, 0xb3, 0xf8, 0xbf, 0xe3, 0x50, 0x5c, 0x66, 0xff, 0x2b, 0x0e,
|
||||
0xf2, 0xa0, 0x14, 0xb5, 0x90, 0xd0, 0x9c, 0xae, 0x4a, 0x2d, 0xaf, 0x72, 0x8d, 0x6b, 0x99, 0xf3,
|
||||
0x5c, 0xa0, 0xb7, 0xa8, 0x40, 0x6f, 0x9a, 0x97, 0x08, 0x67, 0xfe, 0x7f, 0xfb, 0x34, 0x59, 0x2d,
|
||||
0xb3, 0x69, 0xf7, 0x7a, 0x44, 0x11, 0xbf, 0x09, 0x15, 0xb5, 0xa1, 0x83, 0xde, 0xd2, 0x56, 0xc6,
|
||||
0xd5, 0xee, 0x50, 0xc3, 0x3c, 0x0e, 0x84, 0x73, 0x7e, 0x9b, 0x72, 0x9e, 0x33, 0x2f, 0x6b, 0x38,
|
||||
0xfb, 0x14, 0x34, 0xc6, 0x9c, 0x75, 0x5e, 0xf4, 0xcc, 0x63, 0x2d, 0x1e, 0x3d, 0xf3, 0x78, 0xe3,
|
||||
0xe6, 0x58, 0xe6, 0xfb, 0x14, 0x94, 0x30, 0x0f, 0x00, 0x64, 0x6b, 0x04, 0x69, 0x75, 0xa9, 0x5c,
|
||||
0x58, 0x93, 0xc1, 0x21, 0xdd, 0x55, 0x31, 0x4d, 0xca, 0x96, 0xef, 0xbb, 0x04, 0xdb, 0x81, 0x13,
|
||||
0x84, 0xcc, 0x31, 0xa7, 0x62, 0x8d, 0x0d, 0xa4, 0x5d, 0x4f, 0xbc, 0x4f, 0xd2, 0xb8, 0x7e, 0x2c,
|
||||
0x0c, 0xe7, 0x7e, 0x83, 0x72, 0xbf, 0x66, 0x36, 0x34, 0xdc, 0x47, 0x0c, 0x96, 0x6c, 0xb6, 0xff,
|
||||
0x2b, 0x40, 0xf9, 0x99, 0xed, 0xb8, 0x21, 0x76, 0x6d, 0xb7, 0x8b, 0xd1, 0x0e, 0x4c, 0xd0, 0xdc,
|
||||
0x9d, 0x0c, 0xc4, 0x6a, 0x1d, 0x3f, 0x19, 0x88, 0x63, 0x85, 0x6c, 0x73, 0x9e, 0x32, 0x6e, 0x98,
|
||||
0x17, 0x09, 0xe3, 0xa1, 0x24, 0xdd, 0x64, 0x25, 0x70, 0xe3, 0x16, 0x7a, 0x05, 0x05, 0xde, 0xc0,
|
||||
0x4e, 0x10, 0x8a, 0x15, 0xd5, 0x1a, 0x57, 0xf4, 0x93, 0xba, 0xbd, 0xac, 0xb2, 0x09, 0x28, 0x1c,
|
||||
0xe1, 0x73, 0x00, 0x20, 0xfb, 0x31, 0x49, 0x8b, 0xa6, 0xfa, 0x38, 0x8d, 0xf9, 0x6c, 0x00, 0x9d,
|
||||
0x4e, 0x55, 0x9e, 0xbd, 0x08, 0x96, 0xf0, 0xfd, 0x16, 0x8c, 0x3f, 0xb1, 0x83, 0x5d, 0x94, 0xc8,
|
||||
0xbd, 0xca, 0x7b, 0xd3, 0x46, 0x43, 0x37, 0xc5, 0xb9, 0x5c, 0xa3, 0x5c, 0x2e, 0xb3, 0x50, 0xa6,
|
||||
0x72, 0xa1, 0x2f, 0x2a, 0x8d, 0x5b, 0xa8, 0x07, 0x05, 0xf6, 0xd8, 0x34, 0xa9, 0xbf, 0xd8, 0xcb,
|
||||
0xd5, 0xa4, 0xfe, 0xe2, 0xef, 0x53, 0x4f, 0xe6, 0x32, 0x82, 0x49, 0xf1, 0x28, 0x13, 0x25, 0x9e,
|
||||
0xb2, 0x24, 0x5e, 0x72, 0x36, 0xe6, 0xb2, 0xa6, 0x39, 0xaf, 0xeb, 0x94, 0xd7, 0x55, 0xb3, 0x9e,
|
||||
0xb2, 0x15, 0x87, 0x7c, 0x68, 0xdc, 0xba, 0x6b, 0xa0, 0xef, 0x02, 0xc8, 0x86, 0x55, 0xca, 0x03,
|
||||
0x93, 0x4d, 0xb0, 0x94, 0x07, 0xa6, 0x7a, 0x5d, 0xe6, 0x02, 0xe5, 0x7b, 0xd3, 0xbc, 0x9e, 0xe4,
|
||||
0x1b, 0xfa, 0xb6, 0x1b, 0xbc, 0xc2, 0xfe, 0x1d, 0x56, 0x2d, 0x0f, 0x76, 0x9d, 0x11, 0x59, 0xb2,
|
||||
0x0f, 0xa5, 0xa8, 0x9f, 0x90, 0x8c, 0xb6, 0xc9, 0xce, 0x47, 0x32, 0xda, 0xa6, 0x1a, 0x11, 0xf1,
|
||||
0xb0, 0x13, 0xdb, 0x2d, 0x02, 0x94, 0x38, 0xe0, 0x5f, 0xd4, 0x60, 0x9c, 0x1c, 0xc8, 0xc9, 0xe1,
|
||||
0x44, 0x16, 0x7b, 0x92, 0xab, 0x4f, 0xd5, 0xab, 0x93, 0xab, 0x4f, 0xd7, 0x89, 0xe2, 0x87, 0x13,
|
||||
0x72, 0x59, 0x6b, 0xb2, 0x2a, 0x0a, 0x59, 0xa9, 0x07, 0x65, 0xa5, 0x08, 0x84, 0x34, 0xc4, 0xe2,
|
||||
0xf5, 0xef, 0x64, 0xba, 0xd3, 0x54, 0x90, 0xcc, 0x37, 0x29, 0xbf, 0x8b, 0x2c, 0xdd, 0x51, 0x7e,
|
||||
0x3d, 0x06, 0x41, 0x18, 0xf2, 0xd5, 0x71, 0xbf, 0xd7, 0xac, 0x2e, 0xee, 0xfb, 0xf3, 0xd9, 0x00,
|
||||
0x99, 0xab, 0x93, 0x8e, 0xff, 0x1a, 0x2a, 0x6a, 0xe1, 0x07, 0x69, 0x84, 0x4f, 0x54, 0xe8, 0x93,
|
||||
0x79, 0x44, 0x57, 0x37, 0x8a, 0x47, 0x36, 0xca, 0xd2, 0x56, 0xc0, 0x08, 0xe3, 0x01, 0x14, 0x79,
|
||||
0x01, 0x48, 0xa7, 0xd2, 0x78, 0x11, 0x5f, 0xa7, 0xd2, 0x44, 0xf5, 0x28, 0x7e, 0x7a, 0xa6, 0x1c,
|
||||
0xc9, 0x45, 0x54, 0xe4, 0x6a, 0xce, 0xed, 0x31, 0x0e, 0xb3, 0xb8, 0xc9, 0xa2, 0x6d, 0x16, 0x37,
|
||||
0xa5, 0x3e, 0x90, 0xc5, 0xad, 0x8f, 0x43, 0x1e, 0x0f, 0xc4, 0xe5, 0x1a, 0x65, 0x10, 0x53, 0xf3,
|
||||
0xa3, 0x79, 0x1c, 0x88, 0xee, 0x72, 0x23, 0x19, 0x8a, 0xe4, 0x78, 0x08, 0x20, 0x8b, 0x51, 0xc9,
|
||||
0x13, 0xab, 0xb6, 0x4f, 0x90, 0x3c, 0xb1, 0xea, 0xeb, 0x59, 0xf1, 0xd8, 0x27, 0xf9, 0xb2, 0xbb,
|
||||
0x15, 0xe1, 0xfc, 0xb9, 0x01, 0x28, 0x5d, 0xae, 0x42, 0xef, 0xeb, 0xa9, 0x6b, 0x7b, 0x0e, 0x8d,
|
||||
0xdb, 0xa7, 0x03, 0xd6, 0xa5, 0x33, 0x29, 0x52, 0x97, 0x42, 0x8f, 0x5e, 0x13, 0xa1, 0xbe, 0x67,
|
||||
0xc0, 0x54, 0xac, 0xc4, 0x85, 0xde, 0xc9, 0xb0, 0x69, 0xa2, 0xf1, 0xd0, 0x78, 0xf7, 0x44, 0x38,
|
||||
0xdd, 0x51, 0x5e, 0xd9, 0x01, 0xe2, 0x4e, 0xf3, 0x3b, 0x06, 0x54, 0xe3, 0x95, 0x30, 0x94, 0x41,
|
||||
0x3b, 0xd5, 0xaf, 0x68, 0xdc, 0x3c, 0x19, 0xf0, 0x78, 0xf3, 0xc8, 0xeb, 0xcc, 0x00, 0x8a, 0xbc,
|
||||
0x64, 0xa6, 0xdb, 0xf8, 0xf1, 0x06, 0x87, 0x6e, 0xe3, 0x27, 0xea, 0x6d, 0x9a, 0x8d, 0xef, 0x7b,
|
||||
0x03, 0xac, 0xb8, 0x19, 0xaf, 0xa4, 0x65, 0x71, 0x3b, 0xde, 0xcd, 0x12, 0x65, 0xb8, 0x2c, 0x6e,
|
||||
0xd2, 0xcd, 0x44, 0xc1, 0x0c, 0x65, 0x10, 0x3b, 0xc1, 0xcd, 0x92, 0xf5, 0x36, 0x8d, 0x9b, 0x51,
|
||||
0x86, 0x8a, 0x9b, 0xc9, 0x42, 0x96, 0xce, 0xcd, 0x52, 0xbd, 0x18, 0x9d, 0x9b, 0xa5, 0x6b, 0x61,
|
||||
0x1a, 0x3b, 0x52, 0xbe, 0x31, 0x37, 0xbb, 0xa0, 0x29, 0x75, 0xa1, 0xdb, 0x19, 0x4a, 0xd4, 0x76,
|
||||
0x76, 0x1a, 0x77, 0x4e, 0x09, 0x9d, 0xb9, 0xc7, 0x99, 0xfa, 0xc5, 0x1e, 0xff, 0x23, 0x03, 0x66,
|
||||
0x75, 0xd5, 0x31, 0x94, 0xc1, 0x27, 0xa3, 0x11, 0xd4, 0x58, 0x38, 0x2d, 0xf8, 0xf1, 0xda, 0x8a,
|
||||
0x76, 0xfd, 0xa3, 0x47, 0x9f, 0xb7, 0x9a, 0x2f, 0xaf, 0xc1, 0x55, 0x28, 0xb4, 0x46, 0xce, 0x53,
|
||||
0x7c, 0x84, 0x2e, 0x4c, 0xe6, 0x1a, 0x53, 0x84, 0xae, 0xe7, 0x3b, 0x9f, 0xd1, 0x7f, 0xf1, 0x61,
|
||||
0x3e, 0xb7, 0x53, 0x01, 0x88, 0x00, 0xc6, 0xfe, 0xf5, 0x8b, 0x39, 0xe3, 0x3f, 0xbe, 0x98, 0x33,
|
||||
0xfe, 0xeb, 0x8b, 0x39, 0xe3, 0x27, 0xff, 0x33, 0x37, 0xb6, 0x53, 0xa0, 0xff, 0x22, 0xc4, 0xd2,
|
||||
0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x98, 0x43, 0xdf, 0xe6, 0x42, 0x00, 0x00,
|
||||
0x5a, 0xee, 0x19, 0xcf, 0x8c, 0xe7, 0x9b, 0xf1, 0x78, 0x5c, 0x71, 0xb2, 0x93, 0xd9, 0xc4, 0xf1,
|
||||
0x76, 0x36, 0xbb, 0xd9, 0xec, 0xae, 0x9d, 0xd8, 0xc9, 0x2d, 0x04, 0xed, 0x72, 0x13, 0x7b, 0x36,
|
||||
0x31, 0x71, 0x6c, 0x5f, 0x7b, 0x92, 0xbd, 0x5d, 0xa4, 0x1b, 0xda, 0x33, 0x15, 0xbb, 0xcf, 0x33,
|
||||
0xdd, 0x73, 0xdd, 0x3d, 0x8e, 0x7d, 0x3c, 0xdc, 0x71, 0x70, 0x9c, 0x0e, 0xa4, 0x93, 0x38, 0x24,
|
||||
0x74, 0x42, 0xf0, 0x82, 0x90, 0xe0, 0xe1, 0x40, 0xf0, 0xc0, 0x03, 0x02, 0x89, 0x07, 0x78, 0x80,
|
||||
0x07, 0x24, 0x24, 0xfe, 0x01, 0x58, 0xee, 0x89, 0x3f, 0x02, 0xa1, 0xfa, 0xd5, 0x55, 0xdd, 0x5d,
|
||||
0x6d, 0x7b, 0xcf, 0x5e, 0xdd, 0xcb, 0x66, 0xba, 0xea, 0xfb, 0x55, 0xdf, 0x57, 0xdf, 0xf7, 0x55,
|
||||
0x7d, 0x5f, 0x79, 0xa1, 0xec, 0x8f, 0x7a, 0x8b, 0x23, 0xdf, 0x0b, 0x3d, 0x54, 0xc5, 0x61, 0xaf,
|
||||
0x1f, 0x60, 0xff, 0x10, 0xfb, 0xa3, 0xdd, 0xe6, 0xdc, 0x9e, 0xb7, 0xe7, 0xd1, 0x89, 0x25, 0xf2,
|
||||
0x8b, 0xc1, 0x34, 0x1b, 0x04, 0x66, 0xc9, 0x1e, 0x39, 0x4b, 0xc3, 0xc3, 0x5e, 0x6f, 0xb4, 0xbb,
|
||||
0x74, 0x70, 0xc8, 0x67, 0x9a, 0xd1, 0x8c, 0x3d, 0x0e, 0xf7, 0x47, 0xbb, 0xf4, 0x1f, 0x3e, 0xb7,
|
||||
0x10, 0xcd, 0x1d, 0x62, 0x3f, 0x70, 0x3c, 0x77, 0xb4, 0x2b, 0x7e, 0x71, 0x88, 0x6b, 0x7b, 0x9e,
|
||||
0xb7, 0x37, 0xc0, 0x0c, 0xdf, 0x75, 0xbd, 0xd0, 0x0e, 0x1d, 0xcf, 0x0d, 0xd8, 0xac, 0xf9, 0x23,
|
||||
0x03, 0x6a, 0x16, 0x0e, 0x46, 0x9e, 0x1b, 0xe0, 0x27, 0xd8, 0xee, 0x63, 0x1f, 0x5d, 0x07, 0xe8,
|
||||
0x0d, 0xc6, 0x41, 0x88, 0xfd, 0xae, 0xd3, 0x6f, 0x18, 0x0b, 0xc6, 0xed, 0x49, 0xab, 0xcc, 0x47,
|
||||
0xd6, 0xfb, 0xe8, 0x75, 0x28, 0x0f, 0xf1, 0x70, 0x97, 0xcd, 0xe6, 0xe8, 0xec, 0x14, 0x1b, 0x58,
|
||||
0xef, 0xa3, 0x26, 0x4c, 0xf9, 0xf8, 0xd0, 0x21, 0xec, 0x1b, 0xf9, 0x05, 0xe3, 0x76, 0xde, 0x8a,
|
||||
0xbe, 0x09, 0xa2, 0x6f, 0xbf, 0x0c, 0xbb, 0x21, 0xf6, 0x87, 0x8d, 0x49, 0x86, 0x48, 0x06, 0x3a,
|
||||
0xd8, 0x1f, 0x3e, 0x2c, 0x7d, 0xef, 0xef, 0x1a, 0xf9, 0x95, 0xc5, 0xbb, 0xe6, 0x3f, 0x17, 0xa0,
|
||||
0x6a, 0xd9, 0xee, 0x1e, 0xb6, 0xf0, 0xb7, 0xc6, 0x38, 0x08, 0x51, 0x1d, 0xf2, 0x07, 0xf8, 0x98,
|
||||
0xca, 0x51, 0xb5, 0xc8, 0x4f, 0x46, 0xc8, 0xdd, 0xc3, 0x5d, 0xec, 0x32, 0x09, 0xaa, 0x84, 0x90,
|
||||
0xbb, 0x87, 0xdb, 0x6e, 0x1f, 0xcd, 0x41, 0x61, 0xe0, 0x0c, 0x9d, 0x90, 0xb3, 0x67, 0x1f, 0x31,
|
||||
0xb9, 0x26, 0x13, 0x72, 0xad, 0x02, 0x04, 0x9e, 0x1f, 0x76, 0x3d, 0xbf, 0x8f, 0xfd, 0x46, 0x61,
|
||||
0xc1, 0xb8, 0x5d, 0x5b, 0x7e, 0x73, 0x51, 0xb5, 0xd8, 0xa2, 0x2a, 0xd0, 0xe2, 0x8e, 0xe7, 0x87,
|
||||
0x5b, 0x04, 0xd6, 0x2a, 0x07, 0xe2, 0x27, 0xfa, 0x18, 0x2a, 0x94, 0x48, 0x68, 0xfb, 0x7b, 0x38,
|
||||
0x6c, 0x14, 0x29, 0x95, 0x5b, 0xa7, 0x50, 0xe9, 0x50, 0x60, 0x8b, 0xb2, 0x67, 0xbf, 0x91, 0x09,
|
||||
0xd5, 0x00, 0xfb, 0x8e, 0x3d, 0x70, 0xbe, 0x6d, 0xef, 0x0e, 0x70, 0xa3, 0xb4, 0x60, 0xdc, 0x9e,
|
||||
0xb2, 0x62, 0x63, 0x64, 0xfd, 0x07, 0xf8, 0x38, 0xe8, 0x7a, 0xee, 0xe0, 0xb8, 0x31, 0x45, 0x01,
|
||||
0xa6, 0xc8, 0xc0, 0x96, 0x3b, 0x38, 0xa6, 0xd6, 0xf3, 0xc6, 0x6e, 0xc8, 0x66, 0xcb, 0x74, 0xb6,
|
||||
0x4c, 0x47, 0xe8, 0xf4, 0x3d, 0xa8, 0x0f, 0x1d, 0xb7, 0x3b, 0xf4, 0xfa, 0xdd, 0x48, 0x21, 0x40,
|
||||
0x14, 0xf2, 0xa8, 0xf4, 0x7b, 0xd4, 0x02, 0xf7, 0xac, 0xda, 0xd0, 0x71, 0x9f, 0x79, 0x7d, 0x4b,
|
||||
0xe8, 0x87, 0xa0, 0xd8, 0x47, 0x71, 0x94, 0x4a, 0x12, 0xc5, 0x3e, 0x52, 0x51, 0x3e, 0x80, 0x4b,
|
||||
0x84, 0x4b, 0xcf, 0xc7, 0x76, 0x88, 0x25, 0x56, 0x35, 0x8e, 0x35, 0x3b, 0x74, 0xdc, 0x55, 0x0a,
|
||||
0x12, 0x43, 0xb4, 0x8f, 0x52, 0x88, 0xd3, 0x49, 0x44, 0xfb, 0x28, 0x8e, 0x68, 0x7e, 0x00, 0xe5,
|
||||
0xc8, 0x2e, 0x68, 0x0a, 0x26, 0x37, 0xb7, 0x36, 0xdb, 0xf5, 0x09, 0x04, 0x50, 0x6c, 0xed, 0xac,
|
||||
0xb6, 0x37, 0xd7, 0xea, 0x06, 0xaa, 0x40, 0x69, 0xad, 0xcd, 0x3e, 0x72, 0xcd, 0xd2, 0x8f, 0xf9,
|
||||
0x7e, 0x7b, 0x0a, 0x20, 0x4d, 0x81, 0x4a, 0x90, 0x7f, 0xda, 0xfe, 0xb4, 0x3e, 0x41, 0x80, 0x5f,
|
||||
0xb4, 0xad, 0x9d, 0xf5, 0xad, 0xcd, 0xba, 0x41, 0xa8, 0xac, 0x5a, 0xed, 0x56, 0xa7, 0x5d, 0xcf,
|
||||
0x11, 0x88, 0x67, 0x5b, 0x6b, 0xf5, 0x3c, 0x2a, 0x43, 0xe1, 0x45, 0x6b, 0xe3, 0x79, 0xbb, 0x3e,
|
||||
0x19, 0x11, 0x93, 0xbb, 0xf8, 0x4f, 0x0c, 0x98, 0xe6, 0xe6, 0x66, 0xbe, 0x85, 0xee, 0x43, 0x71,
|
||||
0x9f, 0xfa, 0x17, 0xdd, 0xc9, 0x95, 0xe5, 0x6b, 0x89, 0xbd, 0x11, 0xf3, 0x41, 0x8b, 0xc3, 0x22,
|
||||
0x13, 0xf2, 0x07, 0x87, 0x41, 0x23, 0xb7, 0x90, 0xbf, 0x5d, 0x59, 0xae, 0x2f, 0xb2, 0xc8, 0xb0,
|
||||
0xf8, 0x14, 0x1f, 0xbf, 0xb0, 0x07, 0x63, 0x6c, 0x91, 0x49, 0x84, 0x60, 0x72, 0xe8, 0xf9, 0x98,
|
||||
0x6e, 0xf8, 0x29, 0x8b, 0xfe, 0x26, 0x5e, 0x40, 0x6d, 0xce, 0x37, 0x3b, 0xfb, 0x90, 0xe2, 0xfd,
|
||||
0xbb, 0x01, 0xb0, 0x3d, 0x0e, 0xb3, 0x5d, 0x6c, 0x0e, 0x0a, 0x87, 0x84, 0x03, 0x77, 0x2f, 0xf6,
|
||||
0x41, 0x7d, 0x0b, 0xdb, 0x01, 0x8e, 0x7c, 0x8b, 0x7c, 0xa0, 0x05, 0x28, 0x8d, 0x7c, 0x7c, 0xd8,
|
||||
0x3d, 0x38, 0xa4, 0xdc, 0xa6, 0xa4, 0x9d, 0x8a, 0x64, 0xfc, 0xe9, 0x21, 0xba, 0x03, 0x55, 0x67,
|
||||
0xcf, 0xf5, 0x7c, 0xdc, 0x65, 0x44, 0x0b, 0x2a, 0xd8, 0xb2, 0x55, 0x61, 0x93, 0x74, 0x49, 0x0a,
|
||||
0x2c, 0x63, 0x55, 0xd4, 0xc2, 0x6e, 0x90, 0x39, 0xb9, 0x9e, 0xef, 0x1a, 0x50, 0xa1, 0xeb, 0x39,
|
||||
0x97, 0xb2, 0x97, 0xe5, 0x42, 0x72, 0x14, 0x2d, 0xa5, 0xf0, 0xd4, 0xd2, 0xa4, 0x08, 0x2e, 0xa0,
|
||||
0x35, 0x3c, 0xc0, 0x21, 0x3e, 0x4f, 0xf0, 0x52, 0x54, 0x99, 0xd7, 0xaa, 0x52, 0xf2, 0xfb, 0x73,
|
||||
0x03, 0x2e, 0xc5, 0x18, 0x9e, 0x6b, 0xe9, 0x0d, 0x28, 0xf5, 0x29, 0x31, 0x26, 0x53, 0xde, 0x12,
|
||||
0x9f, 0xe8, 0x3e, 0x4c, 0x71, 0x91, 0x82, 0x46, 0x5e, 0xbf, 0x0d, 0xa5, 0x94, 0x25, 0x26, 0x65,
|
||||
0x20, 0xc5, 0xfc, 0x87, 0x1c, 0x94, 0xb9, 0x32, 0xb6, 0x46, 0xa8, 0x05, 0xd3, 0x3e, 0xfb, 0xe8,
|
||||
0xd2, 0x35, 0x73, 0x19, 0x9b, 0xd9, 0x71, 0xf2, 0xc9, 0x84, 0x55, 0xe5, 0x28, 0x74, 0x18, 0xfd,
|
||||
0x0a, 0x54, 0x04, 0x89, 0xd1, 0x38, 0xe4, 0x86, 0x6a, 0xc4, 0x09, 0xc8, 0xad, 0xfd, 0x64, 0xc2,
|
||||
0x02, 0x0e, 0xbe, 0x3d, 0x0e, 0x51, 0x07, 0xe6, 0x04, 0x32, 0x5b, 0x1f, 0x17, 0x23, 0x4f, 0xa9,
|
||||
0x2c, 0xc4, 0xa9, 0xa4, 0xcd, 0xf9, 0x64, 0xc2, 0x42, 0x1c, 0x5f, 0x99, 0x44, 0x6b, 0x52, 0xa4,
|
||||
0xf0, 0x88, 0xe5, 0x97, 0x94, 0x48, 0x9d, 0x23, 0x97, 0x13, 0x11, 0xda, 0x5a, 0x51, 0x64, 0xeb,
|
||||
0x1c, 0xb9, 0x91, 0xca, 0x1e, 0x95, 0xa1, 0xc4, 0x87, 0xcd, 0x7f, 0xcb, 0x01, 0x08, 0x8b, 0x6d,
|
||||
0x8d, 0xd0, 0x1a, 0xd4, 0x7c, 0xfe, 0x15, 0xd3, 0xdf, 0xeb, 0x5a, 0xfd, 0x71, 0x43, 0x4f, 0x58,
|
||||
0xd3, 0x02, 0x89, 0x89, 0xfb, 0x11, 0x54, 0x23, 0x2a, 0x52, 0x85, 0x57, 0x35, 0x2a, 0x8c, 0x28,
|
||||
0x54, 0x04, 0x02, 0x51, 0xe2, 0x27, 0x70, 0x39, 0xc2, 0xd7, 0x68, 0xf1, 0x8d, 0x13, 0xb4, 0x18,
|
||||
0x11, 0xbc, 0x24, 0x28, 0xa8, 0x7a, 0x7c, 0xac, 0x08, 0x26, 0x15, 0x79, 0x55, 0xa3, 0x48, 0x06,
|
||||
0xa4, 0x6a, 0x32, 0x92, 0x30, 0xa6, 0x4a, 0x20, 0x69, 0x9f, 0x8d, 0x9b, 0x7f, 0x39, 0x09, 0xa5,
|
||||
0x55, 0x6f, 0x38, 0xb2, 0x7d, 0xb2, 0x89, 0x8a, 0x3e, 0x0e, 0xc6, 0x83, 0x90, 0x2a, 0xb0, 0xb6,
|
||||
0x7c, 0x33, 0xce, 0x83, 0x83, 0x89, 0x7f, 0x2d, 0x0a, 0x6a, 0x71, 0x14, 0x82, 0xcc, 0xb3, 0x7c,
|
||||
0xee, 0x0c, 0xc8, 0x3c, 0xc7, 0x73, 0x14, 0x11, 0x10, 0xf2, 0x32, 0x20, 0x34, 0xa1, 0xc4, 0x0f,
|
||||
0x6c, 0x2c, 0x58, 0x3f, 0x99, 0xb0, 0xc4, 0x00, 0x7a, 0x07, 0x66, 0x92, 0xa9, 0xb0, 0xc0, 0x61,
|
||||
0x6a, 0xbd, 0x78, 0xe6, 0xbc, 0x09, 0xd5, 0x58, 0x86, 0x2e, 0x72, 0xb8, 0xca, 0x50, 0xc9, 0xcb,
|
||||
0x57, 0x44, 0x58, 0x27, 0xc7, 0x8a, 0xea, 0x93, 0x09, 0x11, 0xd8, 0x6f, 0x88, 0xc0, 0x3e, 0xa5,
|
||||
0x26, 0x5a, 0xa2, 0x57, 0x1e, 0xe3, 0xdf, 0x54, 0xa3, 0xd6, 0x57, 0x09, 0x72, 0x04, 0x24, 0xc3,
|
||||
0x97, 0x69, 0xc1, 0x74, 0x4c, 0x65, 0x24, 0x47, 0xb6, 0xbf, 0xf6, 0xbc, 0xb5, 0xc1, 0x12, 0xea,
|
||||
0x63, 0x9a, 0x43, 0xad, 0xba, 0x41, 0x12, 0xf4, 0x46, 0x7b, 0x67, 0xa7, 0x9e, 0x43, 0x57, 0xa0,
|
||||
0xbc, 0xb9, 0xd5, 0xe9, 0x32, 0xa8, 0x7c, 0xb3, 0xf4, 0xc7, 0x2c, 0x92, 0xc8, 0xfc, 0xfc, 0x69,
|
||||
0x44, 0x93, 0xa7, 0x68, 0x25, 0x33, 0x4f, 0x28, 0x99, 0xd9, 0x10, 0x99, 0x39, 0x27, 0x33, 0x73,
|
||||
0x1e, 0x21, 0x28, 0x6c, 0xb4, 0x5b, 0x3b, 0x34, 0x49, 0x33, 0xd2, 0x2b, 0xe9, 0x6c, 0xfd, 0xa8,
|
||||
0x06, 0x55, 0x66, 0x9e, 0xee, 0xd8, 0x25, 0x87, 0x89, 0x9f, 0x1a, 0x00, 0xd2, 0x61, 0xd1, 0x12,
|
||||
0x94, 0x7a, 0x4c, 0x84, 0x86, 0x41, 0x23, 0xe0, 0x65, 0xad, 0xc5, 0x2d, 0x01, 0x85, 0xee, 0x41,
|
||||
0x29, 0x18, 0xf7, 0x7a, 0x38, 0x10, 0x99, 0xfb, 0xb5, 0x64, 0x10, 0xe6, 0x01, 0xd1, 0x12, 0x70,
|
||||
0x04, 0xe5, 0xa5, 0xed, 0x0c, 0xc6, 0x34, 0x8f, 0x9f, 0x8c, 0xc2, 0xe1, 0x64, 0x8c, 0xfd, 0x33,
|
||||
0x03, 0x2a, 0x8a, 0x5b, 0xfc, 0x9c, 0x29, 0xe0, 0x1a, 0x94, 0xa9, 0x30, 0xb8, 0xcf, 0x93, 0xc0,
|
||||
0x94, 0x25, 0x07, 0xd0, 0x57, 0xa0, 0x2c, 0x3c, 0x49, 0xe4, 0x81, 0x86, 0x9e, 0xec, 0xd6, 0xc8,
|
||||
0x92, 0xa0, 0x52, 0xc8, 0x0e, 0xcc, 0x52, 0x3d, 0xf5, 0xc8, 0xed, 0x43, 0x68, 0x56, 0x3d, 0x96,
|
||||
0x1b, 0x89, 0x63, 0x79, 0x13, 0xa6, 0x46, 0xfb, 0xc7, 0x81, 0xd3, 0xb3, 0x07, 0x5c, 0x9c, 0xe8,
|
||||
0x5b, 0x52, 0xdd, 0x01, 0xa4, 0x52, 0x3d, 0x8f, 0x02, 0x24, 0xd1, 0x2b, 0x50, 0x79, 0x62, 0x07,
|
||||
0xfb, 0x5c, 0x48, 0x39, 0x7e, 0x1f, 0xa6, 0xc9, 0xf8, 0xd3, 0x17, 0x67, 0x10, 0x5f, 0x60, 0xad,
|
||||
0x98, 0xff, 0x68, 0x40, 0x4d, 0xa0, 0x9d, 0xcb, 0x40, 0x08, 0x26, 0xf7, 0xed, 0x60, 0x9f, 0x2a,
|
||||
0x63, 0xda, 0xa2, 0xbf, 0xd1, 0x3b, 0x50, 0xef, 0xb1, 0xf5, 0x77, 0x13, 0xf7, 0xae, 0x19, 0x3e,
|
||||
0x1e, 0xf9, 0xfe, 0x7b, 0x30, 0x4d, 0x50, 0xba, 0xf1, 0x7b, 0x90, 0x70, 0xe3, 0xaf, 0x58, 0xd5,
|
||||
0x7d, 0xba, 0xe6, 0xa4, 0xf8, 0x36, 0x54, 0x99, 0x32, 0x2e, 0x5a, 0x76, 0xa9, 0xd7, 0x26, 0xcc,
|
||||
0xec, 0xb8, 0xf6, 0x28, 0xd8, 0xf7, 0xc2, 0x84, 0xce, 0x57, 0xcc, 0xbf, 0x35, 0xa0, 0x2e, 0x27,
|
||||
0xcf, 0x25, 0xc3, 0xdb, 0x30, 0xe3, 0xe3, 0xa1, 0xed, 0xb8, 0x8e, 0xbb, 0xd7, 0xdd, 0x3d, 0x0e,
|
||||
0x71, 0xc0, 0xaf, 0xaf, 0xb5, 0x68, 0xf8, 0x11, 0x19, 0x25, 0xc2, 0xee, 0x0e, 0xbc, 0x5d, 0x1e,
|
||||
0xa4, 0xe9, 0x6f, 0xf4, 0x46, 0x3c, 0x4a, 0x97, 0xa5, 0xde, 0xc4, 0xb8, 0x94, 0xf9, 0x27, 0x39,
|
||||
0xa8, 0x7e, 0x62, 0x87, 0x3d, 0xb1, 0x83, 0xd0, 0x3a, 0xd4, 0xa2, 0x30, 0x4e, 0x47, 0xb8, 0xdc,
|
||||
0x89, 0x03, 0x07, 0xc5, 0x11, 0xf7, 0x1a, 0x71, 0xe0, 0x98, 0xee, 0xa9, 0x03, 0x94, 0x94, 0xed,
|
||||
0xf6, 0xf0, 0x20, 0x22, 0x95, 0xcb, 0x26, 0x45, 0x01, 0x55, 0x52, 0xea, 0x00, 0xfa, 0x3a, 0xd4,
|
||||
0x47, 0xbe, 0xb7, 0xe7, 0xe3, 0x20, 0x88, 0x88, 0xb1, 0x14, 0x6e, 0x6a, 0x88, 0x6d, 0x73, 0xd0,
|
||||
0xc4, 0x29, 0xe6, 0xfe, 0x93, 0x09, 0x6b, 0x66, 0x14, 0x9f, 0x93, 0x81, 0x75, 0x46, 0x9e, 0xf7,
|
||||
0x58, 0x64, 0xfd, 0x41, 0x1e, 0x50, 0x7a, 0x99, 0x5f, 0xf4, 0x98, 0x7c, 0x0b, 0x6a, 0x41, 0x68,
|
||||
0xfb, 0xa9, 0x3d, 0x3f, 0x4d, 0x47, 0xa3, 0x1d, 0xff, 0x36, 0x44, 0x92, 0x75, 0x5d, 0x2f, 0x74,
|
||||
0x5e, 0x1e, 0xb3, 0x0b, 0x8a, 0x55, 0x13, 0xc3, 0x9b, 0x74, 0x14, 0x6d, 0x42, 0xe9, 0xa5, 0x33,
|
||||
0x08, 0xb1, 0x1f, 0x34, 0x0a, 0x0b, 0xf9, 0xdb, 0xb5, 0xe5, 0x77, 0x4f, 0x33, 0xcc, 0xe2, 0xc7,
|
||||
0x14, 0xbe, 0x73, 0x3c, 0x52, 0x4f, 0xbf, 0x9c, 0x88, 0x7a, 0x8c, 0x2f, 0xea, 0x6f, 0x44, 0x26,
|
||||
0x4c, 0xbd, 0x22, 0x44, 0xbb, 0x4e, 0x9f, 0xe6, 0xe2, 0xc8, 0x0f, 0xef, 0x5b, 0x25, 0x3a, 0xb1,
|
||||
0xde, 0x47, 0x37, 0x61, 0xea, 0xa5, 0x6f, 0xef, 0x0d, 0xb1, 0x1b, 0xb2, 0x5b, 0xbe, 0x84, 0x89,
|
||||
0x26, 0xcc, 0x45, 0x00, 0x29, 0x0a, 0xc9, 0x7c, 0x9b, 0x5b, 0xdb, 0xcf, 0x3b, 0xf5, 0x09, 0x54,
|
||||
0x85, 0xa9, 0xcd, 0xad, 0xb5, 0xf6, 0x46, 0x9b, 0xe4, 0x46, 0x91, 0xf3, 0xee, 0x49, 0xa7, 0x6b,
|
||||
0x09, 0x43, 0xc4, 0xf6, 0x84, 0x2a, 0x97, 0x11, 0xbf, 0x74, 0x0b, 0xb9, 0x04, 0x89, 0x7b, 0xe6,
|
||||
0x0d, 0x98, 0xd3, 0x6d, 0x0d, 0x01, 0x70, 0xdf, 0xfc, 0x97, 0x1c, 0x4c, 0x73, 0x47, 0x38, 0x97,
|
||||
0xe7, 0x5e, 0x55, 0xa4, 0xe2, 0xd7, 0x13, 0xa1, 0xa4, 0x06, 0x94, 0x98, 0x83, 0xf4, 0xf9, 0xfd,
|
||||
0x57, 0x7c, 0x92, 0xe0, 0xcc, 0xf6, 0x3b, 0xee, 0x73, 0xb3, 0x47, 0xdf, 0xda, 0xb0, 0x59, 0xc8,
|
||||
0x0c, 0x9b, 0x91, 0xc3, 0xd9, 0x01, 0x3f, 0x58, 0x95, 0xa5, 0x29, 0xaa, 0xc2, 0xa9, 0xc8, 0x64,
|
||||
0xcc, 0x66, 0xa5, 0x0c, 0x9b, 0xa1, 0x5b, 0x50, 0xc4, 0x87, 0xd8, 0x0d, 0x83, 0x46, 0x85, 0x26,
|
||||
0xd2, 0x69, 0x71, 0xa1, 0x6a, 0x93, 0x51, 0x8b, 0x4f, 0x4a, 0x53, 0x7d, 0x04, 0xb3, 0xf4, 0xbe,
|
||||
0xfb, 0xd8, 0xb7, 0x5d, 0xf5, 0xce, 0xde, 0xe9, 0x6c, 0xf0, 0xb4, 0x43, 0x7e, 0xa2, 0x1a, 0xe4,
|
||||
0xd6, 0xd7, 0xb8, 0x7e, 0x72, 0xeb, 0x6b, 0x12, 0xff, 0xf7, 0x0d, 0x40, 0x2a, 0x81, 0x73, 0xd9,
|
||||
0x22, 0xc1, 0x45, 0xc8, 0x91, 0x97, 0x72, 0xcc, 0x41, 0x01, 0xfb, 0xbe, 0xe7, 0xb3, 0x40, 0x69,
|
||||
0xb1, 0x0f, 0x29, 0xcd, 0xfb, 0x5c, 0x18, 0x0b, 0x1f, 0x7a, 0x07, 0x51, 0x04, 0x60, 0x64, 0x8d,
|
||||
0xb4, 0xf0, 0x1d, 0xb8, 0x14, 0x03, 0xbf, 0x98, 0x14, 0xbf, 0x05, 0x33, 0x94, 0xea, 0xea, 0x3e,
|
||||
0xee, 0x1d, 0x8c, 0x3c, 0xc7, 0x4d, 0x49, 0x80, 0x6e, 0x92, 0xd8, 0x25, 0xd2, 0x05, 0x59, 0x22,
|
||||
0x5b, 0x73, 0x35, 0x1a, 0xec, 0x74, 0x36, 0xe4, 0x56, 0xdf, 0x85, 0x2b, 0x09, 0x82, 0x62, 0x65,
|
||||
0xbf, 0x0a, 0x95, 0x5e, 0x34, 0x18, 0xf0, 0x13, 0xe4, 0xf5, 0xb8, 0xb8, 0x49, 0x54, 0x15, 0x43,
|
||||
0xf2, 0xf8, 0x3a, 0xbc, 0x96, 0xe2, 0x71, 0x11, 0xea, 0xb8, 0x6f, 0xde, 0x85, 0xcb, 0x94, 0xf2,
|
||||
0x53, 0x8c, 0x47, 0xad, 0x81, 0x73, 0x78, 0xba, 0x59, 0x8e, 0xf9, 0x7a, 0x15, 0x8c, 0x2f, 0x77,
|
||||
0x5b, 0x49, 0xd6, 0x6d, 0xce, 0xba, 0xe3, 0x0c, 0x71, 0xc7, 0xdb, 0xc8, 0x96, 0x96, 0x24, 0xf2,
|
||||
0x03, 0x7c, 0x1c, 0xf0, 0xe3, 0x23, 0xfd, 0x2d, 0xa3, 0xd7, 0x5f, 0x1b, 0x5c, 0x9d, 0x2a, 0x9d,
|
||||
0x2f, 0xd9, 0x35, 0xe6, 0x01, 0xf6, 0x88, 0x0f, 0xe2, 0x3e, 0x99, 0x60, 0xb5, 0x39, 0x65, 0x24,
|
||||
0x12, 0x98, 0x64, 0xa1, 0x6a, 0x52, 0xe0, 0xeb, 0xdc, 0x71, 0xe8, 0x7f, 0x82, 0xd4, 0x49, 0xe9,
|
||||
0x2d, 0xa8, 0xd0, 0x99, 0x9d, 0xd0, 0x0e, 0xc7, 0x41, 0x96, 0xe5, 0x56, 0xcc, 0x1f, 0x18, 0xdc,
|
||||
0xa3, 0x04, 0x9d, 0x73, 0xad, 0xf9, 0x1e, 0x14, 0xe9, 0x0d, 0x51, 0xdc, 0x74, 0xae, 0x6a, 0x36,
|
||||
0x36, 0x93, 0xc8, 0xe2, 0x80, 0xca, 0x39, 0xc9, 0x80, 0xe2, 0x33, 0xda, 0x39, 0x50, 0xa4, 0x9d,
|
||||
0x14, 0x96, 0x73, 0xed, 0x21, 0x2b, 0x3f, 0x96, 0x2d, 0xfa, 0x9b, 0x5e, 0x08, 0x30, 0xf6, 0x9f,
|
||||
0x5b, 0x1b, 0xec, 0x06, 0x52, 0xb6, 0xa2, 0x6f, 0xa2, 0xd8, 0xde, 0xc0, 0xc1, 0x6e, 0x48, 0x67,
|
||||
0x27, 0xe9, 0xac, 0x32, 0x82, 0x6e, 0x41, 0xd9, 0x09, 0x36, 0xb0, 0xed, 0xbb, 0xbc, 0xc4, 0xaf,
|
||||
0x04, 0x66, 0x39, 0x23, 0xf7, 0xd8, 0x37, 0xa0, 0xce, 0x24, 0x6b, 0xf5, 0xfb, 0xca, 0x69, 0x3f,
|
||||
0xe2, 0x6f, 0x24, 0xf8, 0xc7, 0xe8, 0xe7, 0x4e, 0xa7, 0xff, 0x37, 0x06, 0xcc, 0x2a, 0x0c, 0xce,
|
||||
0x65, 0x82, 0xf7, 0xa0, 0xc8, 0xfa, 0x2f, 0xfc, 0x28, 0x38, 0x17, 0xc7, 0x62, 0x6c, 0x2c, 0x0e,
|
||||
0x83, 0x16, 0xa1, 0xc4, 0x7e, 0x89, 0x6b, 0x9c, 0x1e, 0x5c, 0x00, 0x49, 0x91, 0x17, 0xe1, 0x12,
|
||||
0x9f, 0xc3, 0x43, 0x4f, 0xe7, 0x73, 0x93, 0xf1, 0x08, 0xf1, 0x7d, 0x03, 0xe6, 0xe2, 0x08, 0xe7,
|
||||
0x5a, 0xa5, 0x22, 0x77, 0xee, 0x0b, 0xc9, 0xfd, 0x6b, 0x42, 0xee, 0xe7, 0xa3, 0xbe, 0x72, 0xe4,
|
||||
0x4c, 0xee, 0x38, 0xd5, 0xba, 0xb9, 0xb8, 0x75, 0x25, 0xad, 0x1f, 0x45, 0x6b, 0x12, 0xc4, 0xce,
|
||||
0xb5, 0xa6, 0x0f, 0xce, 0xb4, 0x26, 0xe5, 0x08, 0x96, 0x5a, 0xdc, 0xba, 0xd8, 0x46, 0x1b, 0x4e,
|
||||
0x10, 0x65, 0x9c, 0x77, 0xa1, 0x3a, 0x70, 0x5c, 0x6c, 0xfb, 0xbc, 0x87, 0x64, 0xa8, 0xfb, 0xf1,
|
||||
0x81, 0x15, 0x9b, 0x94, 0xa4, 0x7e, 0xdb, 0x00, 0xa4, 0xd2, 0xfa, 0xc5, 0x58, 0x6b, 0x49, 0x28,
|
||||
0x78, 0xdb, 0xf7, 0x86, 0x5e, 0x78, 0xda, 0x36, 0xbb, 0x6f, 0xfe, 0xae, 0x01, 0x97, 0x13, 0x18,
|
||||
0xbf, 0x08, 0xc9, 0xef, 0x9b, 0xd7, 0x60, 0x76, 0x0d, 0x8b, 0x33, 0x5e, 0xaa, 0x76, 0xb0, 0x03,
|
||||
0x48, 0x9d, 0xbd, 0x98, 0x53, 0xcc, 0x2f, 0xc1, 0xec, 0x33, 0xef, 0x90, 0x04, 0x72, 0x32, 0x2d,
|
||||
0xc3, 0x14, 0x2b, 0x66, 0x45, 0xfa, 0x8a, 0xbe, 0x65, 0xe8, 0xdd, 0x01, 0xa4, 0x62, 0x5e, 0x84,
|
||||
0x38, 0x2b, 0xe6, 0x7f, 0x1b, 0x50, 0x6d, 0x0d, 0x6c, 0x7f, 0x28, 0x44, 0xf9, 0x08, 0x8a, 0xac,
|
||||
0x32, 0xc3, 0xcb, 0xac, 0x6f, 0xc5, 0xe9, 0xa9, 0xb0, 0xec, 0xa3, 0xc5, 0xea, 0x38, 0x1c, 0x8b,
|
||||
0x2c, 0x85, 0x77, 0x96, 0xd7, 0x12, 0x9d, 0xe6, 0x35, 0xf4, 0x3e, 0x14, 0x6c, 0x82, 0x42, 0xd3,
|
||||
0x6b, 0x2d, 0x59, 0x2e, 0xa3, 0xd4, 0xc8, 0x95, 0xc8, 0x62, 0x50, 0xe6, 0x87, 0x50, 0x51, 0x38,
|
||||
0xa0, 0x12, 0xe4, 0x1f, 0xb7, 0xf9, 0x35, 0xa9, 0xb5, 0xda, 0x59, 0x7f, 0xc1, 0x4a, 0x88, 0x35,
|
||||
0x80, 0xb5, 0x76, 0xf4, 0x9d, 0xd3, 0x34, 0xf6, 0x6c, 0x4e, 0x87, 0xe7, 0x2d, 0x55, 0x42, 0x23,
|
||||
0x4b, 0xc2, 0xdc, 0x59, 0x24, 0x94, 0x2c, 0x7e, 0xcb, 0x80, 0x69, 0xae, 0x9a, 0xf3, 0xa6, 0x66,
|
||||
0x4a, 0x39, 0x23, 0x35, 0x2b, 0xcb, 0xb0, 0x38, 0xa0, 0x94, 0xe1, 0x9f, 0x0c, 0xa8, 0xaf, 0x79,
|
||||
0xaf, 0xdc, 0x3d, 0xdf, 0xee, 0x47, 0x3e, 0xf8, 0x71, 0xc2, 0x9c, 0x8b, 0x89, 0x4a, 0x7f, 0x02,
|
||||
0x5e, 0x0e, 0x24, 0xcc, 0xda, 0x90, 0xb5, 0x14, 0x96, 0xdf, 0xc5, 0xa7, 0xf9, 0x55, 0x98, 0x49,
|
||||
0x20, 0x11, 0x03, 0xbd, 0x68, 0x6d, 0xac, 0xaf, 0x11, 0x83, 0xd0, 0x7a, 0x6f, 0x7b, 0xb3, 0xf5,
|
||||
0x68, 0xa3, 0xcd, 0xbb, 0xb2, 0xad, 0xcd, 0xd5, 0xf6, 0x86, 0x34, 0xd4, 0x03, 0xb1, 0x82, 0x07,
|
||||
0xe6, 0x00, 0x66, 0x15, 0x81, 0xce, 0xdb, 0x1c, 0xd3, 0xcb, 0x2b, 0xb9, 0x35, 0x60, 0x9a, 0x9f,
|
||||
0x72, 0x92, 0x8e, 0xff, 0xd3, 0x3c, 0xd4, 0xc4, 0xd4, 0x97, 0x23, 0x05, 0xba, 0x02, 0xc5, 0xfe,
|
||||
0xee, 0x8e, 0xf3, 0x6d, 0xd1, 0x97, 0xe5, 0x5f, 0x64, 0x7c, 0xc0, 0xf8, 0xb0, 0xd7, 0x16, 0xfc,
|
||||
0x0b, 0x5d, 0x63, 0x0f, 0x31, 0xd6, 0xdd, 0x3e, 0x3e, 0xa2, 0x87, 0xa1, 0x49, 0x4b, 0x0e, 0xd0,
|
||||
0xa2, 0x26, 0x7f, 0x95, 0x41, 0xef, 0xba, 0xca, 0x2b, 0x0d, 0xb4, 0x02, 0x75, 0xf2, 0xbb, 0x35,
|
||||
0x1a, 0x0d, 0x1c, 0xdc, 0x67, 0x04, 0xc8, 0x35, 0x77, 0x52, 0x9e, 0x76, 0x52, 0x00, 0xe8, 0x06,
|
||||
0x14, 0xe9, 0x15, 0x30, 0x68, 0x4c, 0x91, 0xbc, 0x2a, 0x41, 0xf9, 0x30, 0x7a, 0x07, 0x2a, 0x4c,
|
||||
0xe2, 0x75, 0xf7, 0x79, 0x80, 0xe9, 0x9b, 0x05, 0xa5, 0x1e, 0xa2, 0xce, 0xc5, 0xcf, 0x59, 0x90,
|
||||
0x75, 0xce, 0x42, 0x4b, 0x50, 0x0b, 0x42, 0xcf, 0xb7, 0xf7, 0xf0, 0x0b, 0xae, 0xb2, 0x4a, 0xbc,
|
||||
0x68, 0x97, 0x98, 0x96, 0xe6, 0xba, 0x06, 0xb3, 0xad, 0x71, 0xb8, 0xdf, 0x76, 0x49, 0x72, 0x4c,
|
||||
0x19, 0xf3, 0x3a, 0x20, 0x32, 0xbb, 0xe6, 0x04, 0xda, 0x69, 0x8e, 0xac, 0xdd, 0x09, 0x0f, 0xcc,
|
||||
0x4d, 0xb8, 0x44, 0x66, 0xb1, 0x1b, 0x3a, 0x3d, 0xe5, 0x20, 0x22, 0x8e, 0xba, 0x46, 0xe2, 0xa8,
|
||||
0x6b, 0x07, 0xc1, 0x2b, 0xcf, 0xef, 0x73, 0x63, 0x47, 0xdf, 0x92, 0xdb, 0xdf, 0x1b, 0x4c, 0x9a,
|
||||
0xe7, 0x41, 0xec, 0x98, 0xfa, 0x05, 0xe9, 0xa1, 0x5f, 0x86, 0x92, 0x37, 0xa2, 0x4f, 0x82, 0x78,
|
||||
0xf5, 0xef, 0xca, 0x22, 0x7b, 0x66, 0xb4, 0xc8, 0x09, 0x6f, 0xb1, 0x59, 0xa5, 0x42, 0xc5, 0xe1,
|
||||
0x89, 0x9a, 0xf7, 0xed, 0x60, 0x1f, 0xf7, 0xb7, 0x05, 0xf1, 0x58, 0x6d, 0xf4, 0x81, 0x95, 0x98,
|
||||
0x96, 0xb2, 0xdf, 0x93, 0xa2, 0x3f, 0xc6, 0xe1, 0x09, 0xa2, 0xab, 0xd5, 0xf7, 0xcb, 0x02, 0x85,
|
||||
0x37, 0x0d, 0xcf, 0x82, 0xf5, 0x43, 0x03, 0xae, 0x0b, 0xb4, 0xd5, 0x7d, 0xdb, 0xdd, 0xc3, 0x42,
|
||||
0x98, 0x9f, 0x57, 0x5f, 0xe9, 0x45, 0xe7, 0xcf, 0xb8, 0xe8, 0xa7, 0xd0, 0x88, 0x16, 0x4d, 0x2b,
|
||||
0x31, 0xde, 0x40, 0x5d, 0xc4, 0x38, 0xe0, 0x11, 0xa1, 0x6c, 0xd1, 0xdf, 0x64, 0xcc, 0xf7, 0x06,
|
||||
0xd1, 0x25, 0x88, 0xfc, 0x96, 0xc4, 0x36, 0xe0, 0xaa, 0x20, 0xc6, 0x4b, 0x23, 0x71, 0x6a, 0xa9,
|
||||
0x35, 0x9d, 0x48, 0x8d, 0xdb, 0x83, 0xd0, 0x38, 0x79, 0x2b, 0x69, 0x51, 0xe2, 0x26, 0xa4, 0x5c,
|
||||
0x0c, 0x1d, 0x97, 0x79, 0xe6, 0x01, 0x44, 0x66, 0xe5, 0xbc, 0x9a, 0x9a, 0x27, 0x24, 0xb5, 0xf3,
|
||||
0x7c, 0x0b, 0x90, 0xf9, 0xd4, 0x16, 0xc8, 0xe6, 0x8a, 0x61, 0x3e, 0x12, 0x94, 0xa8, 0x7d, 0x1b,
|
||||
0xfb, 0x43, 0x27, 0x08, 0x94, 0x36, 0x94, 0x4e, 0x5d, 0x6f, 0xc1, 0xe4, 0x08, 0xf3, 0xe4, 0x5d,
|
||||
0x59, 0x46, 0xc2, 0x27, 0x14, 0x64, 0x3a, 0x2f, 0xd9, 0x0c, 0xe1, 0x86, 0x60, 0xc3, 0x0c, 0xa2,
|
||||
0xe5, 0x93, 0x14, 0x53, 0x94, 0xbe, 0x73, 0x19, 0xa5, 0xef, 0x7c, 0xbc, 0xf4, 0x1d, 0x3b, 0x50,
|
||||
0xaa, 0x81, 0xea, 0x62, 0x0e, 0x94, 0x1d, 0x66, 0x80, 0x28, 0xbe, 0x5d, 0x0c, 0xd5, 0x3f, 0xe0,
|
||||
0x81, 0xea, 0xa2, 0xd2, 0x20, 0xa6, 0x6b, 0x16, 0x4d, 0x4a, 0xf1, 0x89, 0x4c, 0xa8, 0x12, 0x23,
|
||||
0x59, 0x6a, 0x4f, 0x60, 0xd2, 0x8a, 0x8d, 0xc9, 0x60, 0x7c, 0x00, 0x73, 0xf1, 0x60, 0x7c, 0x2e,
|
||||
0xa1, 0xe6, 0xa0, 0x10, 0x7a, 0x07, 0x58, 0x64, 0x66, 0xf6, 0x91, 0x52, 0x6b, 0x14, 0xa8, 0x2f,
|
||||
0x46, 0xad, 0xdf, 0x94, 0x54, 0xa9, 0x03, 0x9e, 0x77, 0x05, 0x64, 0x3b, 0x8a, 0xbb, 0x2f, 0xfb,
|
||||
0x90, 0xbc, 0x3e, 0x81, 0x2b, 0xc9, 0xe0, 0x7b, 0x31, 0x8b, 0xe8, 0x32, 0xe7, 0xd4, 0x85, 0xe7,
|
||||
0x8b, 0x61, 0xf0, 0x99, 0x8c, 0x93, 0x4a, 0xd0, 0xbd, 0x18, 0xda, 0xbf, 0x0e, 0x4d, 0x5d, 0x0c,
|
||||
0xbe, 0x50, 0x5f, 0x8c, 0x42, 0xf2, 0xc5, 0x50, 0xfd, 0xbe, 0x21, 0xc9, 0xaa, 0xbb, 0xe6, 0xc3,
|
||||
0x2f, 0x42, 0x56, 0xe4, 0xba, 0xbb, 0xd1, 0xf6, 0x59, 0x8a, 0xa2, 0x65, 0x5e, 0x1f, 0x2d, 0x25,
|
||||
0x0a, 0x05, 0x14, 0xfe, 0x27, 0x43, 0xfd, 0x97, 0xb9, 0x7b, 0x39, 0x33, 0x99, 0x77, 0xce, 0xcb,
|
||||
0x8c, 0xa4, 0xe7, 0x88, 0x19, 0xfd, 0x48, 0xb9, 0x8a, 0x9a, 0xa4, 0x2e, 0xc6, 0x74, 0xbf, 0x21,
|
||||
0x13, 0x4c, 0x2a, 0x8f, 0x5d, 0x0c, 0x07, 0x1b, 0x16, 0xb2, 0x53, 0xd8, 0x85, 0xb0, 0xb8, 0xd3,
|
||||
0x82, 0x72, 0x74, 0xf3, 0x55, 0xde, 0xe9, 0x56, 0xa0, 0xb4, 0xb9, 0xb5, 0xb3, 0xdd, 0x5a, 0x25,
|
||||
0x17, 0xbb, 0x39, 0x28, 0xad, 0x6e, 0x59, 0xd6, 0xf3, 0xed, 0x0e, 0xb9, 0xd9, 0x25, 0x9f, 0xed,
|
||||
0x2c, 0xff, 0x2c, 0x0f, 0xb9, 0xa7, 0x2f, 0xd0, 0xa7, 0x50, 0x60, 0xcf, 0xc6, 0x4e, 0x78, 0x3d,
|
||||
0xd8, 0x3c, 0xe9, 0x65, 0x9c, 0xf9, 0xda, 0xf7, 0xfe, 0xf3, 0x67, 0x7f, 0x98, 0x9b, 0x35, 0xab,
|
||||
0x4b, 0x87, 0x2b, 0x4b, 0x07, 0x87, 0x4b, 0x34, 0xc9, 0x3e, 0x34, 0xee, 0xa0, 0xaf, 0x41, 0x7e,
|
||||
0x7b, 0x1c, 0xa2, 0xcc, 0x57, 0x85, 0xcd, 0xec, 0xc7, 0x72, 0xe6, 0x65, 0x4a, 0x74, 0xc6, 0x04,
|
||||
0x4e, 0x74, 0x34, 0x0e, 0x09, 0xc9, 0x6f, 0x41, 0x45, 0x7d, 0xea, 0x76, 0xea, 0x53, 0xc3, 0xe6,
|
||||
0xe9, 0xcf, 0xe8, 0xcc, 0xeb, 0x94, 0xd5, 0x6b, 0x26, 0xe2, 0xac, 0xd8, 0x63, 0x3c, 0x75, 0x15,
|
||||
0x9d, 0x23, 0x17, 0x65, 0x3e, 0x44, 0x6c, 0x66, 0xbf, 0xac, 0x4b, 0xad, 0x22, 0x3c, 0x72, 0x09,
|
||||
0xc9, 0x6f, 0xf2, 0x27, 0x74, 0xbd, 0x10, 0xdd, 0xd0, 0xbc, 0x81, 0x52, 0xdf, 0xf6, 0x34, 0x17,
|
||||
0xb2, 0x01, 0x38, 0x93, 0x6b, 0x94, 0xc9, 0x15, 0x73, 0x96, 0x33, 0xe9, 0x45, 0x20, 0x0f, 0x8d,
|
||||
0x3b, 0xcb, 0x3d, 0x28, 0xd0, 0xde, 0x31, 0xfa, 0x4c, 0xfc, 0x68, 0x6a, 0xba, 0xf2, 0x19, 0x86,
|
||||
0x8e, 0x75, 0x9d, 0xcd, 0x39, 0xca, 0xa8, 0x66, 0x96, 0x09, 0x23, 0xda, 0x39, 0x7e, 0x68, 0xdc,
|
||||
0xb9, 0x6d, 0xdc, 0x35, 0x96, 0xff, 0xaa, 0x00, 0x05, 0xda, 0xa3, 0x40, 0x07, 0x00, 0xb2, 0x47,
|
||||
0x9a, 0x5c, 0x5d, 0xaa, 0xfd, 0x9a, 0x5c, 0x5d, 0xba, 0xbd, 0x6a, 0x36, 0x29, 0xd3, 0x39, 0x73,
|
||||
0x86, 0x30, 0xa5, 0xad, 0x8f, 0x25, 0xda, 0xe9, 0x21, 0x7a, 0xfc, 0xa1, 0xc1, 0x9b, 0x35, 0xcc,
|
||||
0xcd, 0x90, 0x8e, 0x5a, 0xac, 0x3f, 0x9a, 0xdc, 0x0e, 0x9a, 0x96, 0xa8, 0xf9, 0x80, 0x32, 0x5c,
|
||||
0x32, 0xeb, 0x92, 0xa1, 0x4f, 0x21, 0x1e, 0x1a, 0x77, 0x3e, 0x6b, 0x98, 0x97, 0xb8, 0x96, 0x13,
|
||||
0x33, 0xe8, 0x3b, 0x50, 0x8b, 0x77, 0xf2, 0xd0, 0x4d, 0x0d, 0xaf, 0x64, 0x67, 0xb0, 0xf9, 0xe6,
|
||||
0xc9, 0x40, 0x5c, 0xa6, 0x79, 0x2a, 0x13, 0x67, 0xce, 0x38, 0x1f, 0x60, 0x3c, 0xb2, 0x09, 0x10,
|
||||
0xb7, 0x01, 0xfa, 0x53, 0x83, 0x37, 0x63, 0x65, 0x23, 0x0e, 0xe9, 0xa8, 0xa7, 0xfa, 0x7d, 0xcd,
|
||||
0x5b, 0xa7, 0x40, 0x71, 0x21, 0x3e, 0xa4, 0x42, 0x7c, 0x60, 0xce, 0x49, 0x21, 0x42, 0x67, 0x88,
|
||||
0x43, 0x8f, 0x4b, 0xf1, 0xd9, 0x35, 0xf3, 0xb5, 0x98, 0x72, 0x62, 0xb3, 0xd2, 0x58, 0xac, 0x61,
|
||||
0xa6, 0x35, 0x56, 0xac, 0x27, 0xa7, 0x35, 0x56, 0xbc, 0xdb, 0xa6, 0x33, 0x16, 0x6f, 0x8f, 0x69,
|
||||
0x8c, 0x15, 0xcd, 0x2c, 0xff, 0xef, 0x24, 0x94, 0x56, 0xd9, 0x9f, 0xe2, 0x20, 0x0f, 0xca, 0x51,
|
||||
0x0b, 0x09, 0xcd, 0xeb, 0xaa, 0xd4, 0xf2, 0x2a, 0xd7, 0xbc, 0x91, 0x39, 0xcf, 0x05, 0x7a, 0x83,
|
||||
0x0a, 0xf4, 0xba, 0x79, 0x85, 0x70, 0xe6, 0x7f, 0xed, 0xb3, 0xc4, 0x6a, 0x99, 0x4b, 0x76, 0xbf,
|
||||
0x4f, 0x14, 0xf1, 0x9b, 0x50, 0x55, 0x1b, 0x3a, 0xe8, 0x0d, 0x6d, 0x65, 0x5c, 0xed, 0x0e, 0x35,
|
||||
0xcd, 0x93, 0x40, 0x38, 0xe7, 0x37, 0x29, 0xe7, 0x79, 0xf3, 0xaa, 0x86, 0xb3, 0x4f, 0x41, 0x63,
|
||||
0xcc, 0x59, 0xe7, 0x45, 0xcf, 0x3c, 0xd6, 0xe2, 0xd1, 0x33, 0x8f, 0x37, 0x6e, 0x4e, 0x64, 0x3e,
|
||||
0xa6, 0xa0, 0x84, 0x79, 0x00, 0x20, 0x5b, 0x23, 0x48, 0xab, 0x4b, 0xe5, 0xc2, 0x9a, 0x0c, 0x0e,
|
||||
0xe9, 0xae, 0x8a, 0x69, 0x52, 0xb6, 0x7c, 0xdf, 0x25, 0xd8, 0x0e, 0x9c, 0x20, 0x64, 0x8e, 0x39,
|
||||
0x1d, 0x6b, 0x6c, 0x20, 0xed, 0x7a, 0xe2, 0x7d, 0x92, 0xe6, 0xcd, 0x13, 0x61, 0x38, 0xf7, 0x5b,
|
||||
0x94, 0xfb, 0x0d, 0xb3, 0xa9, 0xe1, 0x3e, 0x62, 0xb0, 0x64, 0xb3, 0xfd, 0x5f, 0x11, 0x2a, 0xcf,
|
||||
0x6c, 0xc7, 0x0d, 0xb1, 0x6b, 0xbb, 0x3d, 0x8c, 0x76, 0xa1, 0x40, 0x73, 0x77, 0x32, 0x10, 0xab,
|
||||
0x75, 0xfc, 0x64, 0x20, 0x8e, 0x15, 0xb2, 0xcd, 0x05, 0xca, 0xb8, 0x69, 0x5e, 0x26, 0x8c, 0x87,
|
||||
0x92, 0xf4, 0x12, 0x2b, 0x81, 0x1b, 0x77, 0xd0, 0x4b, 0x28, 0xf2, 0x06, 0x76, 0x82, 0x50, 0xac,
|
||||
0xa8, 0xd6, 0xbc, 0xa6, 0x9f, 0xd4, 0xed, 0x65, 0x95, 0x4d, 0x40, 0xe1, 0x08, 0x9f, 0x43, 0x00,
|
||||
0xd9, 0x8f, 0x49, 0x5a, 0x34, 0xd5, 0xc7, 0x69, 0x2e, 0x64, 0x03, 0xe8, 0x74, 0xaa, 0xf2, 0xec,
|
||||
0x47, 0xb0, 0x84, 0xef, 0x37, 0x60, 0xf2, 0x89, 0x1d, 0xec, 0xa3, 0x44, 0xee, 0x55, 0xde, 0x9b,
|
||||
0x36, 0x9b, 0xba, 0x29, 0xce, 0xe5, 0x06, 0xe5, 0x72, 0x95, 0x85, 0x32, 0x95, 0x0b, 0x7d, 0x51,
|
||||
0x69, 0xdc, 0x41, 0x7d, 0x28, 0xb2, 0xc7, 0xa6, 0x49, 0xfd, 0xc5, 0x5e, 0xae, 0x26, 0xf5, 0x17,
|
||||
0x7f, 0x9f, 0x7a, 0x3a, 0x97, 0x11, 0x4c, 0x89, 0x47, 0x99, 0x28, 0xf1, 0x94, 0x25, 0xf1, 0x92,
|
||||
0xb3, 0x39, 0x9f, 0x35, 0xcd, 0x79, 0xdd, 0xa4, 0xbc, 0xae, 0x9b, 0x8d, 0x94, 0xad, 0x38, 0xe4,
|
||||
0x43, 0xe3, 0xce, 0x5d, 0x03, 0x7d, 0x07, 0x40, 0x36, 0xac, 0x52, 0x1e, 0x98, 0x6c, 0x82, 0xa5,
|
||||
0x3c, 0x30, 0xd5, 0xeb, 0x32, 0x17, 0x29, 0xdf, 0xdb, 0xe6, 0xcd, 0x24, 0xdf, 0xd0, 0xb7, 0xdd,
|
||||
0xe0, 0x25, 0xf6, 0xdf, 0x67, 0xd5, 0xf2, 0x60, 0xdf, 0x19, 0x91, 0x25, 0xfb, 0x50, 0x8e, 0xfa,
|
||||
0x09, 0xc9, 0x68, 0x9b, 0xec, 0x7c, 0x24, 0xa3, 0x6d, 0xaa, 0x11, 0x11, 0x0f, 0x3b, 0xb1, 0xdd,
|
||||
0x22, 0x40, 0x89, 0x03, 0xfe, 0x45, 0x1d, 0x26, 0xc9, 0x81, 0x9c, 0x1c, 0x4e, 0x64, 0xb1, 0x27,
|
||||
0xb9, 0xfa, 0x54, 0xbd, 0x3a, 0xb9, 0xfa, 0x74, 0x9d, 0x28, 0x7e, 0x38, 0x21, 0x97, 0xb5, 0x25,
|
||||
0x56, 0x45, 0x21, 0x2b, 0xf5, 0xa0, 0xa2, 0x14, 0x81, 0x90, 0x86, 0x58, 0xbc, 0xfe, 0x9d, 0x4c,
|
||||
0x77, 0x9a, 0x0a, 0x92, 0xf9, 0x3a, 0xe5, 0x77, 0x99, 0xa5, 0x3b, 0xca, 0xaf, 0xcf, 0x20, 0x08,
|
||||
0x43, 0xbe, 0x3a, 0xee, 0xf7, 0x9a, 0xd5, 0xc5, 0x7d, 0x7f, 0x21, 0x1b, 0x20, 0x73, 0x75, 0xd2,
|
||||
0xf1, 0x5f, 0x41, 0x55, 0x2d, 0xfc, 0x20, 0x8d, 0xf0, 0x89, 0x0a, 0x7d, 0x32, 0x8f, 0xe8, 0xea,
|
||||
0x46, 0xf1, 0xc8, 0x46, 0x59, 0xda, 0x0a, 0x18, 0x61, 0x3c, 0x80, 0x12, 0x2f, 0x00, 0xe9, 0x54,
|
||||
0x1a, 0x2f, 0xe2, 0xeb, 0x54, 0x9a, 0xa8, 0x1e, 0xc5, 0x4f, 0xcf, 0x94, 0x23, 0xb9, 0x88, 0x8a,
|
||||
0x5c, 0xcd, 0xb9, 0x3d, 0xc6, 0x61, 0x16, 0x37, 0x59, 0xb4, 0xcd, 0xe2, 0xa6, 0xd4, 0x07, 0xb2,
|
||||
0xb8, 0xed, 0xe1, 0x90, 0xc7, 0x03, 0x71, 0xb9, 0x46, 0x19, 0xc4, 0xd4, 0xfc, 0x68, 0x9e, 0x04,
|
||||
0xa2, 0xbb, 0xdc, 0x48, 0x86, 0x22, 0x39, 0x1e, 0x01, 0xc8, 0x62, 0x54, 0xf2, 0xc4, 0xaa, 0xed,
|
||||
0x13, 0x24, 0x4f, 0xac, 0xfa, 0x7a, 0x56, 0x3c, 0xf6, 0x49, 0xbe, 0xec, 0x6e, 0x45, 0x38, 0xff,
|
||||
0xd8, 0x00, 0x94, 0x2e, 0x57, 0xa1, 0x77, 0xf5, 0xd4, 0xb5, 0x3d, 0x87, 0xe6, 0x7b, 0x67, 0x03,
|
||||
0xd6, 0xa5, 0x33, 0x29, 0x52, 0x8f, 0x42, 0x8f, 0x5e, 0x11, 0xa1, 0xbe, 0x6b, 0xc0, 0x74, 0xac,
|
||||
0xc4, 0x85, 0xde, 0xca, 0xb0, 0x69, 0xa2, 0xf1, 0xd0, 0x7c, 0xfb, 0x54, 0x38, 0xdd, 0x51, 0x5e,
|
||||
0xd9, 0x01, 0xe2, 0x4e, 0xf3, 0x3b, 0x06, 0xd4, 0xe2, 0x95, 0x30, 0x94, 0x41, 0x3b, 0xd5, 0xaf,
|
||||
0x68, 0xde, 0x3e, 0x1d, 0xf0, 0x64, 0xf3, 0xc8, 0xeb, 0xcc, 0x00, 0x4a, 0xbc, 0x64, 0xa6, 0xdb,
|
||||
0xf8, 0xf1, 0x06, 0x87, 0x6e, 0xe3, 0x27, 0xea, 0x6d, 0x9a, 0x8d, 0xef, 0x7b, 0x03, 0xac, 0xb8,
|
||||
0x19, 0xaf, 0xa4, 0x65, 0x71, 0x3b, 0xd9, 0xcd, 0x12, 0x65, 0xb8, 0x2c, 0x6e, 0xd2, 0xcd, 0x44,
|
||||
0xc1, 0x0c, 0x65, 0x10, 0x3b, 0xc5, 0xcd, 0x92, 0xf5, 0x36, 0x8d, 0x9b, 0x51, 0x86, 0x8a, 0x9b,
|
||||
0xc9, 0x42, 0x96, 0xce, 0xcd, 0x52, 0xbd, 0x18, 0x9d, 0x9b, 0xa5, 0x6b, 0x61, 0x1a, 0x3b, 0x52,
|
||||
0xbe, 0x31, 0x37, 0xbb, 0xa4, 0x29, 0x75, 0xa1, 0xf7, 0x32, 0x94, 0xa8, 0xed, 0xec, 0x34, 0xdf,
|
||||
0x3f, 0x23, 0x74, 0xe6, 0x1e, 0x67, 0xea, 0x17, 0x7b, 0xfc, 0x8f, 0x0c, 0x98, 0xd3, 0x55, 0xc7,
|
||||
0x50, 0x06, 0x9f, 0x8c, 0x46, 0x50, 0x73, 0xf1, 0xac, 0xe0, 0x27, 0x6b, 0x2b, 0xda, 0xf5, 0x8f,
|
||||
0xea, 0xff, 0xfa, 0xf9, 0xbc, 0xf1, 0x1f, 0x9f, 0xcf, 0x1b, 0xff, 0xf5, 0xf9, 0xbc, 0xf1, 0x93,
|
||||
0xff, 0x99, 0x9f, 0xd8, 0x2d, 0xd2, 0xff, 0xbf, 0xc3, 0xca, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff,
|
||||
0x48, 0x49, 0x02, 0x7c, 0x86, 0x42, 0x00, 0x00,
|
||||
}
|
||||
|
||||
// Reference imports to suppress errors if they are not otherwise used.
|
||||
|
|
|
@ -8,30 +8,10 @@ import "etcd/api/versionpb/version.proto";
|
|||
|
||||
// for grpc-gateway
|
||||
import "google/api/annotations.proto";
|
||||
import "protoc-gen-swagger/options/annotations.proto";
|
||||
|
||||
option (gogoproto.marshaler_all) = true;
|
||||
option (gogoproto.unmarshaler_all) = true;
|
||||
|
||||
option (grpc.gateway.protoc_gen_swagger.options.openapiv2_swagger) = {
|
||||
security_definitions: {
|
||||
security: {
|
||||
key: "ApiKey";
|
||||
value: {
|
||||
type: TYPE_API_KEY;
|
||||
in: IN_HEADER;
|
||||
name: "Authorization";
|
||||
}
|
||||
}
|
||||
}
|
||||
security: {
|
||||
security_requirement: {
|
||||
key: "ApiKey";
|
||||
value: {};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
service KV {
|
||||
// Range gets the keys in the range from the key-value store.
|
||||
rpc Range(RangeRequest) returns (RangeResponse) {
|
||||
|
|
|
@ -7,7 +7,7 @@ require (
|
|||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/golang/protobuf v1.5.3
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/stretchr/testify v1.8.2
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1
|
||||
google.golang.org/grpc v1.51.0
|
||||
)
|
||||
|
@ -15,9 +15,9 @@ require (
|
|||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
|
21
api/go.sum
21
api/go.sum
|
@ -58,9 +58,13 @@ 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/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.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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
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=
|
||||
github.com/yuin/goldmark v1.1.27/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=
|
||||
|
@ -84,8 +88,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-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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -102,14 +106,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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
@ -158,6 +162,7 @@ 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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
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/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/stretchr/testify v1.8.4 // indirect
|
||||
github.com/stretchr/testify v1.8.2 // indirect
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
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/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||
|
@ -9,11 +10,17 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/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.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 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
|
||||
|
|
|
@ -4,9 +4,9 @@ go 1.19
|
|||
|
||||
require (
|
||||
github.com/coreos/go-systemd/v22 v22.5.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/stretchr/testify v1.8.2
|
||||
go.uber.org/zap v1.24.0
|
||||
golang.org/x/sys v0.9.0
|
||||
golang.org/x/sys v0.7.0
|
||||
)
|
||||
|
||||
require (
|
||||
|
|
|
@ -10,9 +10,13 @@ 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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
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=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
|
||||
|
@ -20,9 +24,10 @@ 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/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
|
||||
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
|
||||
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.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/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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
package types
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 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) String() string {
|
||||
var b strings.Builder
|
||||
var b bytes.Buffer
|
||||
if p.Len() > 0 {
|
||||
b.WriteString(p[0].String())
|
||||
}
|
||||
|
|
|
@ -5,8 +5,8 @@ go 1.19
|
|||
require (
|
||||
github.com/dustin/go-humanize v1.0.1
|
||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
||||
github.com/prometheus/client_golang v1.15.1
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/prometheus/client_golang v1.15.0
|
||||
github.com/stretchr/testify v1.8.2
|
||||
go.etcd.io/etcd/api/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
|
||||
|
@ -23,18 +23,18 @@ require (
|
|||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // 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/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.43.0 // indirect
|
||||
github.com/prometheus/client_model v0.3.0 // indirect
|
||||
github.com/prometheus/common v0.42.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/multierr v1.11.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
|
|
|
@ -40,6 +40,7 @@ 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.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.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.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
|
@ -62,7 +63,6 @@ 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/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/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
|
@ -74,23 +74,28 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
||||
github.com/prometheus/client_golang v1.15.0/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.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
||||
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/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/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||
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.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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.7.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=
|
||||
github.com/yuin/goldmark v1.1.27/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=
|
||||
|
@ -121,8 +126,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-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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -139,14 +144,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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
@ -196,6 +201,7 @@ 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.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
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=
|
||||
|
|
|
@ -45,7 +45,7 @@ func hasChecksum(n int64) bool {
|
|||
// selected node, and saved snapshot is the point-in-time state of
|
||||
// the selected node.
|
||||
// Etcd <v3.6 will return "" as version.
|
||||
func SaveWithVersion(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath string) (string, error) {
|
||||
func SaveWithVersion(ctx context.Context, lg *zap.Logger, cfg clientv3.Config, dbPath string) (version string, err error) {
|
||||
cfg.Logger = lg.Named("client")
|
||||
if len(cfg.Endpoints) != 1 {
|
||||
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("size", humanize.Bytes(uint64(size))),
|
||||
zap.Duration("took", time.Since(start)),
|
||||
zap.String("etcd-version", resp.Version),
|
||||
zap.String("etcd-version", version),
|
||||
)
|
||||
|
||||
if err = os.Rename(partpath, dbPath); err != nil {
|
||||
|
|
25
codecov.yml
25
codecov.yml
|
@ -1,16 +1,17 @@
|
|||
---
|
||||
codecov:
|
||||
token: 6040de41-c073-4d6f-bbf8-d89256ef31e1
|
||||
token: "6040de41-c073-4d6f-bbf8-d89256ef31e1"
|
||||
disable_default_path_fixes: true
|
||||
|
||||
fixes:
|
||||
- go.etcd.io/etcd/api/v3/::api/
|
||||
- go.etcd.io/etcd/client/v3/::client/v3/
|
||||
- go.etcd.io/etcd/client/v2/::client/v2/
|
||||
- go.etcd.io/etcd/etcdctl/v3/::etcdctl/
|
||||
- go.etcd.io/etcd/pkg/v3/::pkg/
|
||||
- go.etcd.io/etcd/server/v3/::server/
|
||||
- "go.etcd.io/etcd/api/v3/::api/"
|
||||
- "go.etcd.io/etcd/client/v3/::client/v3/"
|
||||
- "go.etcd.io/etcd/client/v2/::client/v2/"
|
||||
- "go.etcd.io/etcd/etcdctl/v3/::etcdctl/"
|
||||
- "go.etcd.io/etcd/pkg/v3/::pkg/"
|
||||
- "go.etcd.io/etcd/server/v3/::server/"
|
||||
|
||||
ignore:
|
||||
- '**/*.pb.go'
|
||||
- '**/*.pb.gw.go'
|
||||
- tests/**/*
|
||||
- go.etcd.io/etcd/tests/**/*
|
||||
- "**/*.pb.go"
|
||||
- "**/*.pb.gw.go"
|
||||
- "tests/**/*"
|
||||
- "go.etcd.io/etcd/tests/**/*"
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
---
|
||||
rule_files: [manifests/etcd-prometheusRules.yaml]
|
||||
rule_files:
|
||||
- manifests/etcd-prometheusRules.yaml
|
||||
|
||||
evaluation_interval: 1m
|
||||
|
||||
tests:
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
- 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'
|
||||
- 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'
|
||||
- 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'
|
||||
alert_rule_test:
|
||||
- eval_time: 3m
|
||||
alertname: etcdInsufficientMembers
|
||||
|
@ -25,7 +27,7 @@ tests:
|
|||
severity: critical
|
||||
exp_annotations:
|
||||
description: 'etcd cluster "etcd": members are down (3).'
|
||||
summary: etcd cluster members are down.
|
||||
summary: 'etcd cluster members are down.'
|
||||
- eval_time: 7m
|
||||
alertname: etcdInsufficientMembers
|
||||
- eval_time: 11m
|
||||
|
@ -36,7 +38,7 @@ tests:
|
|||
severity: critical
|
||||
exp_annotations:
|
||||
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
|
||||
alertname: etcdInsufficientMembers
|
||||
exp_alerts:
|
||||
|
@ -45,15 +47,16 @@ tests:
|
|||
severity: critical
|
||||
exp_annotations:
|
||||
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
|
||||
input_series:
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
- 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'
|
||||
- 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'
|
||||
- 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'
|
||||
alert_rule_test:
|
||||
- eval_time: 14m
|
||||
alertname: etcdMembersDown
|
||||
|
@ -63,15 +66,16 @@ tests:
|
|||
severity: critical
|
||||
exp_annotations:
|
||||
description: 'etcd cluster "etcd": members are down (3).'
|
||||
summary: etcd cluster members are down.
|
||||
summary: 'etcd cluster members are down.'
|
||||
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
- 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'
|
||||
- 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'
|
||||
- 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'
|
||||
alert_rule_test:
|
||||
- eval_time: 13m
|
||||
alertname: etcdMembersDown
|
||||
|
@ -81,15 +85,16 @@ tests:
|
|||
severity: critical
|
||||
exp_annotations:
|
||||
description: 'etcd cluster "etcd": members are down (1).'
|
||||
summary: etcd cluster members are down.
|
||||
summary: 'etcd cluster members are down.'
|
||||
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
- 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'
|
||||
- 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'
|
||||
- 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'
|
||||
alert_rule_test:
|
||||
- eval_time: 10m
|
||||
alertname: etcdHighNumberOfLeaderChanges
|
||||
|
@ -99,59 +104,61 @@ tests:
|
|||
severity: warning
|
||||
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.'
|
||||
summary: etcd cluster has high number of leader changes.
|
||||
summary: 'etcd cluster has high number of leader changes.'
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
- 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'
|
||||
- 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'
|
||||
- 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'
|
||||
alert_rule_test:
|
||||
- eval_time: 10m
|
||||
alertname: etcdHighNumberOfLeaderChanges
|
||||
exp_alerts:
|
||||
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||
values: 0+8192x240
|
||||
- series: etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.0"}
|
||||
values: 524288+0x240
|
||||
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||
values: 0+1024x240
|
||||
- series: etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.1"}
|
||||
values: 524288+0x240
|
||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}'
|
||||
values: '0+8192x240'
|
||||
- series: 'etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.0"}'
|
||||
values: '524288+0x240'
|
||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}'
|
||||
values: '0+1024x240'
|
||||
- series: 'etcd_server_quota_backend_bytes{job="etcd",instance="10.10.10.1"}'
|
||||
values: '524288+0x240'
|
||||
alert_rule_test:
|
||||
- eval_time: 11m
|
||||
alertname: etcdExcessiveDatabaseGrowth
|
||||
exp_alerts:
|
||||
- exp_labels:
|
||||
instance: 10.10.10.0
|
||||
instance: '10.10.10.0'
|
||||
job: etcd
|
||||
severity: warning
|
||||
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.'
|
||||
summary: etcd cluster database growing very fast.
|
||||
summary: 'etcd cluster database growing very fast.'
|
||||
|
||||
- interval: 1m
|
||||
input_series:
|
||||
- series: etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||
values: 300000000+0x10
|
||||
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}
|
||||
values: 1000000000+0x10
|
||||
- series: etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||
values: 700000000+0x10
|
||||
- series: etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}
|
||||
values: 1000000000+0x10
|
||||
- series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.0"}'
|
||||
values: '300000000+0x10'
|
||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}'
|
||||
values: '1000000000+0x10'
|
||||
- series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.1"}'
|
||||
values: '700000000+0x10'
|
||||
- series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}'
|
||||
values: '1000000000+0x10'
|
||||
alert_rule_test:
|
||||
- eval_time: 11m
|
||||
alertname: etcdDatabaseHighFragmentationRatio
|
||||
exp_alerts:
|
||||
- exp_labels:
|
||||
instance: 10.10.10.0
|
||||
instance: '10.10.10.0'
|
||||
job: etcd
|
||||
severity: warning
|
||||
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.'
|
||||
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,7 +19,6 @@ import (
|
|||
"encoding/gob"
|
||||
"encoding/json"
|
||||
"log"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"go.etcd.io/etcd/server/v3/etcdserver/api/snap"
|
||||
|
@ -64,7 +63,7 @@ func (s *kvstore) Lookup(key string) (string, bool) {
|
|||
}
|
||||
|
||||
func (s *kvstore) Propose(k string, v string) {
|
||||
var buf strings.Builder
|
||||
var buf bytes.Buffer
|
||||
if err := gob.NewEncoder(&buf).Encode(kv{k, v}); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
|
|
@ -57,8 +57,7 @@ discovery-proxy:
|
|||
# DNS domain used to bootstrap initial cluster.
|
||||
discovery-srv:
|
||||
|
||||
# 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 configuration for bootstrapping.
|
||||
initial-cluster:
|
||||
|
||||
# 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",
|
||||
Run: epHashKVCommandFunc,
|
||||
}
|
||||
hc.PersistentFlags().Int64Var(&epHashKVRev, "rev", 0, "maximum revision to hash (default: latest revision)")
|
||||
hc.PersistentFlags().Int64Var(&epHashKVRev, "rev", 0, "maximum revision to hash (default: all revisions)")
|
||||
return hc
|
||||
}
|
||||
|
||||
|
|
|
@ -15,11 +15,11 @@
|
|||
package command
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
clientv3 "go.etcd.io/etcd/client/v3"
|
||||
)
|
||||
|
@ -58,7 +58,7 @@ func printJSON(v interface{}) {
|
|||
}
|
||||
|
||||
func printMemberListWithHexJSON(r clientv3.MemberListResponse) {
|
||||
var buffer strings.Builder
|
||||
var buffer bytes.Buffer
|
||||
var b []byte
|
||||
buffer.WriteString("{\"header\":{\"cluster_id\":\"")
|
||||
b = strconv.AppendUint(nil, r.Header.ClusterId, 16)
|
||||
|
|
|
@ -25,7 +25,6 @@ require (
|
|||
github.com/fatih/color v1.14.1 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // 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/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.17 // indirect
|
||||
|
@ -34,9 +33,9 @@ require (
|
|||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
)
|
||||
|
|
|
@ -67,7 +67,6 @@ 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/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/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
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/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
|
||||
|
@ -88,10 +87,10 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||
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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
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.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
|
||||
|
@ -106,7 +105,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/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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
github.com/yuin/goldmark v1.1.27/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=
|
||||
|
@ -137,8 +136,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-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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -156,14 +155,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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
|
|
@ -44,14 +44,13 @@ require (
|
|||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // 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/jonboulle/clockwork v0.4.0 // indirect
|
||||
github.com/mattn/go-runewidth v0.0.9 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/prometheus/client_golang v1.15.1 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.43.0 // indirect
|
||||
github.com/prometheus/client_golang v1.15.0 // indirect
|
||||
github.com/prometheus/client_model v0.3.0 // indirect
|
||||
github.com/prometheus/common v0.42.0 // indirect
|
||||
github.com/prometheus/procfs v0.9.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect
|
||||
|
@ -63,10 +62,10 @@ require (
|
|||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/goleak v1.1.12 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.10.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/crypto v0.8.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||
google.golang.org/grpc v1.51.0 // indirect
|
||||
|
|
|
@ -52,6 +52,7 @@ 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.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.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.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
|
@ -75,7 +76,6 @@ 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/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/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
|
||||
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/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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
||||
github.com/prometheus/client_golang v1.15.0/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.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
||||
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/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.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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
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/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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
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-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-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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
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.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
|
||||
golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
|
||||
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-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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
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/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/dustin/go-humanize v1.0.1
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/stretchr/testify v1.8.2
|
||||
go.etcd.io/bbolt v1.3.7
|
||||
go.etcd.io/etcd/api/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/olekukonko/tablewriter v0.0.5 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/prometheus/client_golang v1.15.1 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/common v0.43.0 // indirect
|
||||
github.com/prometheus/client_golang v1.15.0 // indirect
|
||||
github.com/prometheus/client_model v0.3.0 // indirect
|
||||
github.com/prometheus/common v0.42.0 // indirect
|
||||
github.com/prometheus/procfs v0.9.0 // indirect
|
||||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
github.com/sirupsen/logrus v1.8.1 // indirect
|
||||
|
@ -90,10 +90,10 @@ require (
|
|||
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/crypto v0.10.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/crypto v0.8.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||
github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM=
|
||||
github.com/prometheus/client_golang v1.15.0/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.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.43.0 h1:iq+BVjvYLei5f27wiuNiB1DN6DYQkp1c8Bx0Vykh5us=
|
||||
github.com/prometheus/common v0.43.0/go.mod h1:NCvr5cQIh3Y/gy73/RdVtC9r8xxrxwJnB+2lB3BxrFc=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
||||
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/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
|
||||
|
@ -257,14 +257,18 @@ 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/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.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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
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.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.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
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=
|
||||
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/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
|
||||
|
@ -318,8 +322,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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
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-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
|
@ -388,8 +392,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-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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
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-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
@ -402,7 +406,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-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.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
|
||||
golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
|
||||
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-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -414,7 +418,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-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.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
|
||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
@ -455,8 +459,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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
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.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
@ -465,8 +469,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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
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-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: etcd-client
|
||||
spec:
|
||||
ports:
|
||||
- name: etcd-client-port
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: etcd-client-port
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
selector:
|
||||
app: etcd
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
|
@ -21,33 +22,35 @@ metadata:
|
|||
name: etcd0
|
||||
spec:
|
||||
containers:
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd0
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd0:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd0:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd0
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd0
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd0:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd0:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd0
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
restartPolicy: Always
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
|
@ -56,17 +59,19 @@ metadata:
|
|||
name: etcd0
|
||||
spec:
|
||||
ports:
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
selector:
|
||||
etcd_node: etcd0
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
|
@ -76,33 +81,35 @@ metadata:
|
|||
name: etcd1
|
||||
spec:
|
||||
containers:
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd1
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd1:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd1:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd1
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd1
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd1:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd1:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd1
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
restartPolicy: Always
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
|
@ -111,17 +118,19 @@ metadata:
|
|||
name: etcd1
|
||||
spec:
|
||||
ports:
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
selector:
|
||||
etcd_node: etcd1
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
|
@ -131,33 +140,35 @@ metadata:
|
|||
name: etcd2
|
||||
spec:
|
||||
containers:
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd2
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd2:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd2:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd2
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
- command:
|
||||
- /usr/local/bin/etcd
|
||||
- --name
|
||||
- etcd2
|
||||
- --initial-advertise-peer-urls
|
||||
- http://etcd2:2380
|
||||
- --listen-peer-urls
|
||||
- http://0.0.0.0:2380
|
||||
- --listen-client-urls
|
||||
- http://0.0.0.0:2379
|
||||
- --advertise-client-urls
|
||||
- http://etcd2:2379
|
||||
- --initial-cluster
|
||||
- etcd0=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
|
||||
- --initial-cluster-state
|
||||
- new
|
||||
image: quay.io/coreos/etcd:latest
|
||||
name: etcd2
|
||||
ports:
|
||||
- containerPort: 2379
|
||||
name: client
|
||||
protocol: TCP
|
||||
- containerPort: 2380
|
||||
name: server
|
||||
protocol: TCP
|
||||
restartPolicy: Always
|
||||
|
||||
---
|
||||
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
|
@ -166,13 +177,13 @@ metadata:
|
|||
name: etcd2
|
||||
spec:
|
||||
ports:
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
- name: client
|
||||
port: 2379
|
||||
protocol: TCP
|
||||
targetPort: 2379
|
||||
- name: server
|
||||
port: 2380
|
||||
protocol: TCP
|
||||
targetPort: 2380
|
||||
selector:
|
||||
etcd_node: etcd2
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
---
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
|
@ -7,17 +6,17 @@ metadata:
|
|||
name: vulcand
|
||||
spec:
|
||||
containers:
|
||||
- command:
|
||||
- /go/bin/vulcand
|
||||
- -apiInterface=0.0.0.0
|
||||
- --etcd=http://etcd-client:2379
|
||||
image: mailgun/vulcand:v0.8.0-beta.2
|
||||
name: vulcand
|
||||
ports:
|
||||
- containerPort: 8081
|
||||
name: api
|
||||
protocol: TCP
|
||||
- containerPort: 8082
|
||||
name: server
|
||||
protocol: TCP
|
||||
- command:
|
||||
- /go/bin/vulcand
|
||||
- -apiInterface=0.0.0.0
|
||||
- --etcd=http://etcd-client:2379
|
||||
image: mailgun/vulcand:v0.8.0-beta.2
|
||||
name: vulcand
|
||||
ports:
|
||||
- containerPort: 8081
|
||||
name: api
|
||||
protocol: TCP
|
||||
- containerPort: 8082
|
||||
name: server
|
||||
protocol: TCP
|
||||
restartPolicy: Always
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 20 KiB |
|
@ -17,6 +17,7 @@
|
|||
package cobrautl
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
|
@ -102,7 +103,7 @@ GLOBAL OPTIONS:
|
|||
}
|
||||
|
||||
func etcdFlagUsages(flagSet *pflag.FlagSet) string {
|
||||
x := new(strings.Builder)
|
||||
x := new(bytes.Buffer)
|
||||
|
||||
flagSet.VisitAll(func(flag *pflag.Flag) {
|
||||
if len(flag.Deprecated) > 0 {
|
||||
|
|
|
@ -8,7 +8,7 @@ require (
|
|||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/spf13/cobra v1.7.0
|
||||
github.com/spf13/pflag v1.0.5
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/stretchr/testify v1.8.2
|
||||
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
|
||||
go.uber.org/zap v1.24.0
|
||||
google.golang.org/grpc v1.51.0
|
||||
|
@ -22,9 +22,9 @@ require (
|
|||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
go.uber.org/atomic v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/net v0.11.0 // indirect
|
||||
golang.org/x/sys v0.9.0 // indirect
|
||||
golang.org/x/text v0.10.0 // indirect
|
||||
golang.org/x/net v0.9.0 // indirect
|
||||
golang.org/x/sys v0.7.0 // indirect
|
||||
golang.org/x/text v0.9.0 // indirect
|
||||
google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect
|
||||
google.golang.org/protobuf v1.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
|
|
21
pkg/go.sum
21
pkg/go.sum
|
@ -69,10 +69,14 @@ 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/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.7.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=
|
||||
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/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
|
@ -95,8 +99,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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -110,14 +114,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-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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
|
@ -161,6 +165,7 @@ 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/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.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/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
|
|
|
@ -18,8 +18,6 @@ import (
|
|||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"strconv"
|
||||
"sync/atomic"
|
||||
|
||||
"google.golang.org/grpc"
|
||||
testpb "google.golang.org/grpc/test/grpc_testing"
|
||||
|
@ -95,16 +93,14 @@ func (ss *StubServer) Addr() string {
|
|||
|
||||
type dummyStubServer struct {
|
||||
testpb.UnimplementedTestServiceServer
|
||||
counter uint64
|
||||
body []byte
|
||||
}
|
||||
|
||||
func (d *dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
|
||||
newCount := atomic.AddUint64(&d.counter, 1)
|
||||
|
||||
func (d dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*testpb.SimpleResponse, error) {
|
||||
return &testpb.SimpleResponse{
|
||||
Payload: &testpb.Payload{
|
||||
Type: testpb.PayloadType_COMPRESSABLE,
|
||||
Body: []byte(strconv.FormatUint(newCount, 10)),
|
||||
Body: d.body,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
@ -112,5 +108,5 @@ func (d *dummyStubServer) UnaryCall(context.Context, *testpb.SimpleRequest) (*te
|
|||
// NewDummyStubServer creates a simple test server that serves Unary calls with
|
||||
// responses with the given payload.
|
||||
func NewDummyStubServer(body []byte) *StubServer {
|
||||
return New(&dummyStubServer{})
|
||||
return New(dummyStubServer{body: body})
|
||||
}
|
||||
|
|
|
@ -15,12 +15,12 @@
|
|||
package report
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/csv"
|
||||
"fmt"
|
||||
"log"
|
||||
"math"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
@ -119,7 +119,7 @@ func (sp *secondPoints) getTimeSeries() TimeSeries {
|
|||
}
|
||||
|
||||
func (t TimeSeries) String() string {
|
||||
buf := new(strings.Builder)
|
||||
buf := new(bytes.Buffer)
|
||||
wr := csv.NewWriter(buf)
|
||||
if err := wr.Write([]string{"UNIX-SECOND", "MIN-LATENCY-MS", "AVG-LATENCY-MS", "MAX-LATENCY-MS", "AVG-THROUGHPUT"}); err != nil {
|
||||
log.Fatal(err)
|
||||
|
|
|
@ -16,10 +16,10 @@
|
|||
package traceutil
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
@ -44,7 +44,7 @@ func writeFields(fields []Field) string {
|
|||
if len(fields) == 0 {
|
||||
return ""
|
||||
}
|
||||
var buf strings.Builder
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString("{")
|
||||
for _, f := range fields {
|
||||
buf.WriteString(f.format())
|
||||
|
|
|
@ -15,10 +15,10 @@ fi
|
|||
|
||||
ARCH=$(go env GOARCH)
|
||||
VERSION="${VERSION}-${ARCH}"
|
||||
DOCKERFILE="Dockerfile"
|
||||
DOCKERFILE="Dockerfile-release.${ARCH}"
|
||||
|
||||
if [ -z "${BINARYDIR:-}" ]; then
|
||||
RELEASE="etcd-${1}"-$(go env GOOS)-${ARCH}
|
||||
RELEASE="etcd-${1}"-$(go env GOOS)-$(go env GOARCH)
|
||||
BINARYDIR="${RELEASE}"
|
||||
TARFILE="${RELEASE}.tar.gz"
|
||||
TARURL="https://github.com/etcd-io/etcd/releases/download/${1}/${TARFILE}"
|
||||
|
@ -43,8 +43,8 @@ cat ./"${DOCKERFILE}" > "${IMAGEDIR}"/Dockerfile
|
|||
if [ -z "${TAG:-}" ]; then
|
||||
# Fix incorrect image "Architecture" using buildkit
|
||||
# From https://stackoverflow.com/q/72144329/
|
||||
DOCKER_BUILDKIT=1 docker build --build-arg="ARCH=${ARCH}" -t "gcr.io/etcd-development/etcd:${VERSION}" "${IMAGEDIR}"
|
||||
DOCKER_BUILDKIT=1 docker build --build-arg="ARCH=${ARCH}" -t "quay.io/coreos/etcd:${VERSION}" "${IMAGEDIR}"
|
||||
DOCKER_BUILDKIT=1 docker build -t "gcr.io/etcd-development/etcd:${VERSION}" "${IMAGEDIR}"
|
||||
DOCKER_BUILDKIT=1 docker build -t "quay.io/coreos/etcd:${VERSION}" "${IMAGEDIR}"
|
||||
else
|
||||
docker build -t "${TAG}:${VERSION}" "${IMAGEDIR}"
|
||||
fi
|
||||
|
|
|
@ -1,28 +0,0 @@
|
|||
#!/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,6 +8,8 @@ go mod tidy
|
|||
source ./scripts/test_lib.sh
|
||||
source ./scripts/updatebom.sh
|
||||
|
||||
ROOTDIR=$(pwd)
|
||||
|
||||
# To fix according to newer version of go:
|
||||
# go get golang.org/dl/gotip
|
||||
# gotip download
|
||||
|
@ -29,11 +31,20 @@ function bash_ws_fix {
|
|||
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"
|
||||
|
||||
run_for_modules mod_tidy_fix || exit 2
|
||||
run_for_modules run ${GO_CMD} fmt || 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
|
||||
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@ log_callout -e "\\nRunning gofast (gogo) proto generation..."
|
|||
for dir in ${DIRS}; do
|
||||
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" \
|
||||
-I"${GRPC_GATEWAY_ROOT}" \
|
||||
--plugin="${GOFAST_BIN}" ./**/*.proto
|
||||
|
||||
run sed -i.bak -E 's|"etcd/api/|"go.etcd.io/etcd/api/v3/|g' ./**/*.pb.go
|
||||
|
@ -65,7 +64,6 @@ for pb in api/etcdserverpb/rpc server/etcdserver/api/v3lock/v3lockpb/v3lock serv
|
|||
log_callout "grpc & swagger for: ${pb}.proto"
|
||||
run protoc -I. \
|
||||
-I"${GRPC_GATEWAY_ROOT}"/third_party/googleapis \
|
||||
-I"${GRPC_GATEWAY_ROOT}" \
|
||||
-I"${GOGOPROTO_PATH}" \
|
||||
-I"${ETCD_ROOT_DIR}/.." \
|
||||
-I"${RAFT_ROOT}" \
|
||||
|
@ -97,6 +95,10 @@ for pb in api/etcdserverpb/rpc server/etcdserver/api/v3lock/v3lockpb/v3lock serv
|
|||
Documentation/dev-guide/apispec/swagger/"${swaggerName}".swagger.json
|
||||
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
|
||||
log_callout "protodoc is auto-generating grpc API reference documentation..."
|
||||
|
||||
|
|
|
@ -112,10 +112,10 @@ main() {
|
|||
# Check go version.
|
||||
log_callout "Check go version"
|
||||
local go_version current_go_version
|
||||
go_version="go$(cat .go-version)"
|
||||
go_version="go$(grep -oP '(?<=GO_VERSION:\s")[^"]*' .github/workflows/go-version.yaml | tr -d ' ')"
|
||||
current_go_version=$(go version | awk '{ print $3 }')
|
||||
if [[ "${current_go_version}" != "${go_version}" ]]; then
|
||||
log_error "Current go version is ${current_go_version}, but etcd ${RELEASE_VERSION} requires ${go_version} (see .go-version)."
|
||||
log_error "Current go version is ${current_go_version}, but etcd ${RELEASE_VERSION} requires ${go_version} (see .github/workflows/build.yaml)."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
|
|
@ -26,9 +26,6 @@
|
|||
# $ 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
|
||||
#
|
||||
# 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
|
||||
# COVERDIR must either be a absolute path or a relative path to the etcd root
|
||||
|
@ -58,7 +55,6 @@ if [ -n "${OUTPUT_FILE}" ]; then
|
|||
fi
|
||||
|
||||
PASSES=${PASSES:-"gofmt bom dep build unit"}
|
||||
KEEP_GOING_SUITE=${KEEP_GOING_SUITE:-false}
|
||||
PKG=${PKG:-}
|
||||
SHELLCHECK_VERSION=${SHELLCHECK_VERSION:-"v0.8.0"}
|
||||
|
||||
|
@ -650,30 +646,16 @@ function run_pass {
|
|||
shift 1
|
||||
log_callout -e "\\n'${pass}' started at $(date)"
|
||||
if "${pass}_pass" "$@" ; then
|
||||
log_success "'${pass}' PASSED and completed at $(date)"
|
||||
return 0
|
||||
log_success "'${pass}' completed at $(date)"
|
||||
else
|
||||
log_error "FAIL: '${pass}' FAILED at $(date)"
|
||||
if [ "$KEEP_GOING_SUITE" = true ]; then
|
||||
return 2
|
||||
else
|
||||
exit 255
|
||||
fi
|
||||
log_error "FAIL: '${pass}' failed at $(date)"
|
||||
exit 255
|
||||
fi
|
||||
}
|
||||
|
||||
log_callout "Starting at: $(date)"
|
||||
fail_flag=false
|
||||
for pass in $PASSES; do
|
||||
if run_pass "${pass}" "${@}"; then
|
||||
continue
|
||||
else
|
||||
fail_flag=true
|
||||
fi
|
||||
run_pass "${pass}" "${@}"
|
||||
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"
|
||||
|
|
|
@ -203,25 +203,11 @@ function modules_exp() {
|
|||
# run given command across all modules and packages
|
||||
# (unless the set is limited using ${PKG} or / ${USERMOD})
|
||||
function run_for_modules {
|
||||
KEEP_GOING_MODULE=${KEEP_GOING_MODULE:-false}
|
||||
local pkg="${PKG:-./...}"
|
||||
local fail_mod=false
|
||||
if [ -z "${USERMOD:-}" ]; then
|
||||
for m in $(module_dirs); do
|
||||
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
|
||||
run_for_module "${m}" "$@" "${pkg}" || return "$?"
|
||||
done
|
||||
if [ "$fail_mod" = true ]; then
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
run_for_module "${USERMOD}" "$@" "${pkg}" || return "$?"
|
||||
fi
|
||||
|
@ -307,7 +293,7 @@ function go_test {
|
|||
junit_filename_prefix=$(junitFilenamePrefix)
|
||||
|
||||
if [ "${VERBOSE:-}" == "1" ]; then
|
||||
goTestFlags="-v "
|
||||
goTestFlags="-v"
|
||||
fi
|
||||
|
||||
# Expanding patterns (like ./...) into list of packages
|
||||
|
@ -322,10 +308,6 @@ function go_test {
|
|||
fi
|
||||
fi
|
||||
|
||||
if [ "${mode}" == "fail_fast" ]; then
|
||||
goTestFlags+="-failfast "
|
||||
fi
|
||||
|
||||
local failures=""
|
||||
|
||||
# execution of tests against packages:
|
||||
|
|
|
@ -68,7 +68,6 @@ const (
|
|||
DefaultGRPCKeepAliveTimeout = 20 * time.Second
|
||||
DefaultDowngradeCheckTime = 5 * time.Second
|
||||
DefaultWaitClusterReadyTimeout = 5 * time.Second
|
||||
DefaultAutoCompactionMode = "periodic"
|
||||
|
||||
DefaultDiscoveryDialTimeout = 2 * time.Second
|
||||
DefaultDiscoveryRequestTimeOut = 5 * time.Second
|
||||
|
@ -547,8 +546,6 @@ func NewConfig() *Config {
|
|||
Auth: &clientv3.AuthConfig{},
|
||||
},
|
||||
},
|
||||
|
||||
AutoCompactionMode: DefaultAutoCompactionMode,
|
||||
}
|
||||
cfg.InitialCluster = cfg.InitialClusterFromName(cfg.Name)
|
||||
return cfg
|
||||
|
@ -775,9 +772,8 @@ func (cfg *Config) Validate() error {
|
|||
}
|
||||
|
||||
switch cfg.AutoCompactionMode {
|
||||
case CompactorModeRevision, CompactorModePeriodic:
|
||||
case "":
|
||||
return errors.New("undefined auto-compaction-mode")
|
||||
case CompactorModeRevision, CompactorModePeriodic:
|
||||
default:
|
||||
return fmt.Errorf("unknown auto-compaction-mode %q", cfg.AutoCompactionMode)
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ import (
|
|||
"time"
|
||||
|
||||
"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/transport"
|
||||
|
@ -203,11 +202,6 @@ func TestAutoCompactionModeParse(t *testing.T) {
|
|||
// err mode
|
||||
{"errmode", "1", false, 0},
|
||||
{"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 {
|
||||
|
@ -513,10 +507,3 @@ func TestTLSVersionMinMax(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestUndefinedAutoCompactionModeValidate(t *testing.T) {
|
||||
cfg := *NewConfig()
|
||||
cfg.AutoCompactionMode = ""
|
||||
err := cfg.Validate()
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@ package embed
|
|||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
defaultLog "log"
|
||||
|
@ -630,10 +629,10 @@ func configureClientListeners(cfg *Config) (sctxs map[string]*serveCtx, err erro
|
|||
for _, u := range append(cfg.ListenClientUrls, cfg.ListenClientHttpUrls...) {
|
||||
if u.Scheme == "http" || u.Scheme == "unix" {
|
||||
if !cfg.ClientTLSInfo.Empty() {
|
||||
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()))
|
||||
cfg.logger.Warn("scheme is HTTP while key and cert files are present; ignoring key and cert files", zap.String("client-url", u.String()))
|
||||
}
|
||||
if cfg.ClientTLSInfo.ClientCertAuth {
|
||||
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()))
|
||||
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()))
|
||||
}
|
||||
}
|
||||
if (u.Scheme == "https" || u.Scheme == "unixs") && cfg.ClientTLSInfo.Empty() {
|
||||
|
@ -888,8 +887,6 @@ func parseCompactionRetention(mode, retention string) (ret time.Duration, err er
|
|||
ret = time.Duration(int64(h))
|
||||
case CompactorModePeriodic:
|
||||
ret = time.Duration(int64(h)) * time.Hour
|
||||
case "":
|
||||
return 0, errors.New("--auto-compaction-mode is undefined")
|
||||
}
|
||||
} else {
|
||||
// periodic compaction
|
||||
|
|
|
@ -189,7 +189,8 @@ 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.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.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.Var(cfg.cf.clusterState, "initial-cluster-state", "Initial cluster state ('new' or 'existing').")
|
||||
|
||||
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.")
|
||||
|
|
|
@ -103,8 +103,7 @@ Clustering:
|
|||
--initial-cluster 'default=http://localhost:2380'
|
||||
Initial cluster configuration for bootstrapping.
|
||||
--initial-cluster-state 'new'
|
||||
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 state ('new' or 'existing').
|
||||
--initial-cluster-token 'etcd-cluster'
|
||||
Initial cluster token for the etcd cluster during bootstrap.
|
||||
Specifying this can protect you from unintended cross-cluster interaction when running multiple clusters.
|
||||
|
@ -256,10 +255,6 @@ Experimental feature:
|
|||
Enable to check data corruption before serving any client/peer traffic.
|
||||
--experimental-corrupt-check-time '0s'
|
||||
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'
|
||||
ExperimentalEnableLeaseCheckpoint enables primary lessor to persist lease remainingTTL to prevent indefinite auto-renewal of long lived leases.
|
||||
--experimental-compaction-batch-limit 1000
|
||||
|
|
|
@ -35,11 +35,13 @@ func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool, ser
|
|||
}
|
||||
endpoints := srvs.Endpoints
|
||||
|
||||
lg.Info(
|
||||
"discovered cluster from SRV",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
if lg != nil {
|
||||
lg.Info(
|
||||
"discovered cluster from SRV",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
}
|
||||
|
||||
if insecure {
|
||||
return *srvs
|
||||
|
@ -50,26 +52,32 @@ func discoverEndpoints(lg *zap.Logger, dns string, ca string, insecure bool, ser
|
|||
ServerName: dns,
|
||||
}
|
||||
|
||||
lg.Info(
|
||||
"validating discovered SRV endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
if lg != nil {
|
||||
lg.Info(
|
||||
"validating discovered SRV endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
}
|
||||
|
||||
endpoints, err = transport.ValidateSecureEndpoints(tlsInfo, endpoints)
|
||||
if err != nil {
|
||||
lg.Warn(
|
||||
"failed to validate discovered endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
zap.Error(err),
|
||||
)
|
||||
if lg != nil {
|
||||
lg.Warn(
|
||||
"failed to validate discovered endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
zap.Error(err),
|
||||
)
|
||||
}
|
||||
} else {
|
||||
lg.Info(
|
||||
"using validated discovered SRV endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
if lg != nil {
|
||||
lg.Info(
|
||||
"using validated discovered SRV endpoints",
|
||||
zap.String("srv-server", dns),
|
||||
zap.Strings("endpoints", endpoints),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// map endpoints back to SRVClients struct with SRV data
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
package membership
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/sha1"
|
||||
"encoding/binary"
|
||||
|
@ -214,7 +215,7 @@ func (c *RaftCluster) ClientURLs() []string {
|
|||
func (c *RaftCluster) String() string {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
b := &strings.Builder{}
|
||||
b := &bytes.Buffer{}
|
||||
fmt.Fprintf(b, "{ClusterID:%s ", c.cid)
|
||||
var ms []string
|
||||
for _, m := range c.members {
|
||||
|
|
|
@ -90,7 +90,7 @@ func (ms *maintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRe
|
|||
err := ms.bg.Backend().Defrag()
|
||||
if err != nil {
|
||||
ms.lg.Warn("failed to defragment", zap.Error(err))
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
ms.lg.Info("finished defragment")
|
||||
return &pb.DefragmentResponse{}, nil
|
||||
|
@ -279,7 +279,7 @@ type authMaintenanceServer struct {
|
|||
|
||||
func (ams *authMaintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRequest) (*pb.DefragmentResponse, error) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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 {
|
||||
if err := ams.isPermitted(srv.Context()); err != nil {
|
||||
return togRPCError(err)
|
||||
return err
|
||||
}
|
||||
|
||||
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) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
return ams.maintenanceServer.HashKV(ctx, r)
|
||||
}
|
||||
|
||||
func (ams *authMaintenanceServer) Status(ctx context.Context, ar *pb.StatusRequest) (*pb.StatusResponse, error) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
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) {
|
||||
if err := ams.isPermitted(ctx); err != nil {
|
||||
return nil, togRPCError(err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ams.maintenanceServer.Downgrade(ctx, r)
|
||||
|
|
|
@ -125,24 +125,13 @@ func (aa *authApplierV3) LeaseRevoke(lc *pb.LeaseRevokeRequest) (*pb.LeaseRevoke
|
|||
func (aa *authApplierV3) checkLeasePuts(leaseID lease.LeaseID) error {
|
||||
l := aa.lessor.Lookup(leaseID)
|
||||
if l != nil {
|
||||
return aa.checkLeasePutsKeys(l)
|
||||
}
|
||||
|
||||
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
|
||||
for _, key := range l.Keys() {
|
||||
if err := aa.as.IsPutPermitted(&aa.authInfo, []byte(key)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -1,124 +0,0 @@
|
|||
// 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)
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue