├── .github └── workflows │ ├── integration-tests-with-rev.yml │ ├── integration-tests.yml │ ├── unit-tests-with-rev.yml │ ├── unit-tests.yml │ ├── v118.yml │ ├── v119.yml │ └── v120.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── go.mod ├── go.sum ├── hack ├── build_kubernetes.sh ├── certs │ ├── ca.crt │ ├── ca.key │ ├── client.crt │ ├── client.csr │ ├── client.key │ ├── server.crt │ ├── server.csr │ └── server.key ├── get_kubernetes.sh └── testing_vars_doc ├── main.go ├── pkg ├── backend │ ├── compact.go │ ├── compact_test.go │ ├── consts │ │ └── const.go │ ├── delete.go │ ├── delete_test.go │ ├── filter │ │ ├── filter.go │ │ └── filter_test.go │ ├── get.go │ ├── get_test.go │ ├── insert.go │ ├── insert_test.go │ ├── leader_elect.go │ ├── leader_elect_test.go │ ├── lease.go │ ├── lease_test.go │ ├── list.go │ ├── list_test.go │ ├── retryable │ │ ├── retry.go │ │ └── retry_test.go │ ├── revision │ │ ├── revision.go │ │ └── revision_test.go │ ├── storageerrors │ │ └── storage_errors.go │ ├── store.go │ ├── storerecord │ │ ├── storerecord.go │ │ └── storerecord_test.go │ ├── update.go │ ├── update_test.go │ └── utils │ │ └── utils.go ├── config │ └── config.go ├── frontend │ ├── frontend.go │ ├── kv_service.go │ ├── lease_service.go │ ├── listmanager.go │ ├── listmanager_test.go │ └── watch_service.go └── types │ ├── leader_elect.go │ ├── lease.go │ └── record.go └── test ├── e2e ├── e2e_crud_test.go ├── e2e_leaderelect_test.go ├── e2e_test.go └── e2e_watch_test.go ├── integration ├── kv_test.go ├── lease_test.go └── watch_test.go └── utils ├── basic └── basic.go └── utils.go /.github/workflows/integration-tests-with-rev.yml: -------------------------------------------------------------------------------- 1 | name: Run Integration Tests w Rev Table 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | integration-tests-with-rev: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.18.0 23 | 24 | - name: Download go modules 25 | run: | 26 | go mod download 27 | 28 | - name: Generate test vars file 29 | env: 30 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 31 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 32 | TABLE_NAME: ${{ secrets.INTEGRATION_TEST_TABLE_NAME_WITH_REV }} 33 | REVISION_ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 34 | REVISION_ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 35 | REVISION_TABLE_NAME: ${{ secrets.INTEGRATION_TEST_TABLE_NAME_REV }} 36 | LISTEN_ADDRESS: tcp://localhost:2379 37 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 38 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 39 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 40 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 41 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 42 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 43 | run: | 44 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'\nREVISION_ACCOUNT_NAME '${REVISION_ACCOUNT_NAME}'\nREVISION_ACCOUNT_KEY '${REVISION_ACCOUNT_KEY}'\nREVISION_TABLE_NAME '${REVISION_TABLE_NAME//./}'\nUSE_REVISION_TABLE' | sudo tee --append hack/testing_vars > /dev/null 45 | 46 | - name: integration test 47 | run: | 48 | ADD_TEST_ARGS="-v" make integration-tests 49 | -------------------------------------------------------------------------------- /.github/workflows/integration-tests.yml: -------------------------------------------------------------------------------- 1 | name: Run Integration Tests 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | integration-tests: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.18.0 23 | 24 | - name: Download go modules 25 | run: | 26 | go mod download 27 | 28 | - name: Generate test vars file 29 | env: 30 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 31 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 32 | TABLE_NAME: ${{ secrets.INTEGRATION_TEST_TABLE_NAME }} 33 | LISTEN_ADDRESS: tcp://localhost:2379 34 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 35 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 36 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 37 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 38 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 39 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 40 | run: | 41 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'' | sudo tee --append hack/testing_vars > /dev/null 42 | 43 | - name: integration test 44 | run: | 45 | ADD_TEST_ARGS="-v" make integration-tests 46 | -------------------------------------------------------------------------------- /.github/workflows/unit-tests-with-rev.yml: -------------------------------------------------------------------------------- 1 | name: Run Unit Tests w Rev Table 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | unit-tests-with-rev: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.18.0 23 | 24 | - name: Download go modules 25 | run: | 26 | go mod download 27 | 28 | - name: Generate test vars file 29 | env: 30 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 31 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 32 | TABLE_NAME: ${{ secrets.UNIT_TEST_TABLE_WITH_REV }} 33 | REVISION_ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 34 | REVISION_ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 35 | REVISION_TABLE_NAME: ${{ secrets.UNIT_TEST_TABLE_REV }} 36 | LISTEN_ADDRESS: tcp://localhost:2379 37 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 38 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 39 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 40 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 41 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 42 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 43 | run: | 44 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'\nREVISION_ACCOUNT_NAME '${REVISION_ACCOUNT_NAME}'\nREVISION_ACCOUNT_KEY '${REVISION_ACCOUNT_KEY}'\nREVISION_TABLE_NAME '${REVISION_TABLE_NAME//./}'\nUSE_REVISION_TABLE' | sudo tee --append hack/testing_vars > /dev/null 45 | 46 | - name: Unit test 47 | run: | 48 | ADD_TEST_ARGS="-v" make unit-tests 49 | -------------------------------------------------------------------------------- /.github/workflows/unit-tests.yml: -------------------------------------------------------------------------------- 1 | name: Run Unit Tests 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | unit-tests: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.18.0 23 | 24 | - name: Download go modules 25 | run: | 26 | go mod download 27 | 28 | - name: Generate test vars file 29 | env: 30 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 31 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 32 | TABLE_NAME: ${{ secrets.UNIT_TEST_TABLE }} 33 | LISTEN_ADDRESS: tcp://localhost:2379 34 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 35 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 36 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 37 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 38 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 39 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 40 | run: | 41 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'' | sudo tee --append hack/testing_vars > /dev/null 42 | 43 | - name: Unit test 44 | run: | 45 | ADD_TEST_ARGS="-v" make unit-tests 46 | -------------------------------------------------------------------------------- /.github/workflows/v118.yml: -------------------------------------------------------------------------------- 1 | name: Run e2e v118 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | e2e-v118: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.18.0 23 | 24 | - name: Build Kubernetes release 25 | run: | 26 | make build-kubernetes KUBERNETES_VERSION=v1.18.0 27 | 28 | - name: Download go modules 29 | run: | 30 | go mod download 31 | 32 | - name: Generate test vars file 33 | env: 34 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 35 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 36 | TABLE_NAME: ${{ secrets.V118_TEST_TABLE }} 37 | LISTEN_ADDRESS: tcp://localhost:2379 38 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 39 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 40 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 41 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 42 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 43 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 44 | run: | 45 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'' | sudo tee --append hack/testing_vars > /dev/null 46 | 47 | - name: e2e test 48 | run: | 49 | ADD_TEST_ARGS="-v" make e2e-test 50 | -------------------------------------------------------------------------------- /.github/workflows/v119.yml: -------------------------------------------------------------------------------- 1 | name: Run e2e v119 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | e2e-v119: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.19.0 23 | 24 | - name: Build Kubernetes release 25 | run: | 26 | make build-kubernetes KUBERNETES_VERSION=v1.19.0 27 | 28 | - name: Download go modules 29 | run: | 30 | go mod download 31 | 32 | - name: Generate test vars file 33 | env: 34 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 35 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 36 | TABLE_NAME: ${{ secrets.V119_TEST_TABLE }} 37 | LISTEN_ADDRESS: tcp://localhost:2379 38 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 39 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 40 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 41 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 42 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 43 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 44 | run: | 45 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'' | sudo tee --append hack/testing_vars > /dev/null 46 | 47 | - name: e2e test 48 | run: | 49 | ADD_TEST_ARGS="-v" make e2e-test 50 | -------------------------------------------------------------------------------- /.github/workflows/v120.yml: -------------------------------------------------------------------------------- 1 | name: Run e2e v120 2 | on: 3 | pull_request: 4 | paths-ignore: 5 | - "**.md" 6 | 7 | jobs: 8 | e2e-v120: 9 | runs-on: ubuntu-latest 10 | timeout-minutes: 30 11 | steps: 12 | - name: Set up Go 1.15 13 | uses: actions/setup-go@v2 14 | with: 15 | go-version: 1.15 16 | 17 | - name: Checkout code into the Go module directory 18 | uses: actions/checkout@v2 19 | 20 | - name: Get Kubernetes release 21 | run: | 22 | make get-kubernetes KUBERNETES_VERSION=v1.20.0 23 | 24 | - name: Build Kubernetes release 25 | run: | 26 | make build-kubernetes KUBERNETES_VERSION=v1.20.0 27 | 28 | - name: Download go modules 29 | run: | 30 | go mod download 31 | 32 | - name: Generate test vars file 33 | env: 34 | ACCOUNT_NAME: ${{ secrets.ACCOUNT_NAME }} 35 | ACCOUNT_KEY: ${{ secrets.ACCOUNT_KEY }} 36 | TABLE_NAME: ${{ secrets.V120_TEST_TABLE }} 37 | LISTEN_ADDRESS: tcp://localhost:2379 38 | SERVER_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/server.crt 39 | SERVER_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/server.key 40 | CLIENT_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 41 | CLIENT_CERT_FILE_PATH: ${{ github.workspace }}/hack/certs/client.crt 42 | CLIENT_KEY_FILE_PATH: ${{ github.workspace }}/hack/certs/client.key 43 | SERVER_TRUSTED_CA_FILE_PATH: ${{ github.workspace }}/hack/certs/ca.crt 44 | run: | 45 | echo -e 'ACCOUNT_NAME '${ACCOUNT_NAME}'\nACCOUNT_KEY '${ACCOUNT_KEY}'\nTABLE_NAME '${TABLE_NAME//./}'\nLISTEN_ADDRESS '${LISTEN_ADDRESS}'\nUSE_TLS\nSERVER_CERT_FILE_PATH '${SERVER_CERT_FILE_PATH}'\nSERVER_KEY_FILE_PATH '${SERVER_KEY_FILE_PATH}'\nCLIENT_TRUSTED_CA_FILE_PATH '${CLIENT_TRUSTED_CA_FILE_PATH}'\nCLIENT_CERT_FILE_PATH '${CLIENT_CERT_FILE_PATH}'\nCLIENT_KEY_FILE_PATH '${CLIENT_KEY_FILE_PATH}'\nSERVER_TRUSTED_CA_FILE_PATH '${SERVER_TRUSTED_CA_FILE_PATH}'' | sudo tee --append hack/testing_vars > /dev/null 46 | 47 | - name: e2e test 48 | run: | 49 | ADD_TEST_ARGS="-v" make e2e-test 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | _output 17 | hack/testing_vars 18 | kubernetes_src 19 | london 20 | *.swp 21 | 22 | # Visual studio 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG BASEIMAGE="us.gcr.io/k8s-artifacts-prod/build-image/debian-base-amd64:buster-v1.4.0" 2 | FROM $BASEIMAGE 3 | 4 | COPY ./_output/london /bin/ 5 | 6 | ENTRYPOINT [ "/bin/london" ] 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Khaled Henidak (Kal) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | mkfile_path:=$(abspath $(lastword $(MAKEFILE_LIST))) 2 | mkfile_dirpath:=$(shell cd $(shell dirname $(mkfile_path)); pwd) 3 | 4 | binaryName:=london 5 | outputDir:=_output 6 | hackDir:=hack 7 | testingVarsFileName:="testing_vars" 8 | varFilePath:=$(mkfile_dirpath)/$(hackDir)/$(testingVarsFileName) 9 | kubernetes_testdir_name="kubernetes_src" 10 | 11 | ## version mgmt 12 | VERSION := $(shell git rev-parse --short HEAD) 13 | BUILDTIME := $(shell date -u '+%Y-%m-%dT%H:%M:%SZ') 14 | 15 | GOLDFLAGS += -X main.Version=$(VERSION) 16 | GOLDFLAGS += -X main.Buildtime=$(BUILDTIME) 17 | GOFLAGS = -ldflags "$(GOLDFLAGS)" 18 | 19 | # docker build variables 20 | REGISTRY ?= aramase 21 | IMAGE_NAME ?= london 22 | IMAGE_TAG ?= $(REGISTRY)/$(IMAGE_NAME):$(VERSION) 23 | 24 | # Test variables 25 | KUBERNETES_VERSION ?= "v1.20.0" 26 | 27 | help: ## show this help. 28 | @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' 29 | 30 | clean: ## cleans output 31 | @rm -r $(mkfile_dirpath)/$(outputDir) || exit 0 32 | 33 | prep-outputdir: ## creates output directory 34 | @mkdir -p $(mkfile_dirpath)/$(outputDir) 35 | 36 | #Depend on get-kubernetes? 37 | build-binary: prep-outputdir ## builds binary and drop it in output directory 38 | @echo "** building binary with version:$(VERSION)" 39 | @go build -o $(mkfile_dirpath)/$(outputDir)/$(binaryName) $(GOFLAGS) $(mkfile_dirpath)/. 40 | @echo "** built binary is at:$(mkfile_dirpath)/$(outputDir)/$(binaryName) " 41 | 42 | get-kubernetes: ## gets kubernetes source code 43 | @$(mkfile_dirpath)/$(hackDir)/get_kubernetes.sh "$(KUBERNETES_VERSION)" "$(mkfile_dirpath)/$(kubernetes_testdir_name)" $(mkfile_dirpath) 44 | 45 | build-kubernetes: get-kubernetes ## buils kubernetes source code for e2e tests 46 | @$(mkfile_dirpath)/$(hackDir)/build_kubernetes.sh "$(KUBERNETES_VERSION)" "$(mkfile_dirpath)/$(kubernetes_testdir_name)" $(mkfile_dirpath) 47 | 48 | e2e-test: build-kubernetes ## runs e2e tests against an in-proc kube-api-server 49 | @echo "** running e2e test @ $(mkfile_dirpath)/test/e2e" 50 | @echo "****************************************************************" 51 | @echo "* The following tests runs etcd api and api-server in proc" 52 | @echo "* expect long running tests..." 53 | @echo "****************************************************************" 54 | @LONDON_TESTING_VARS=$(varFilePath) KUBE_PANIC_WATCH_DECODE_ERROR=true go test $(mkfile_dirpath)/test/e2e -count=1 $(ADD_TEST_ARGS) 55 | 56 | integration-tests: get-kubernetes ## runs integeration test 57 | @echo "** running integration test @ $(mkfile_dirpath)/test/integration" 58 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/test/integration -count=1 $(ADD_TEST_ARGS) 59 | 60 | unit-tests:get-kubernetes ## runs unit tests 61 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/backend/storerecord" 62 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/backend/storerecord -count=1 $(ADD_TEST_ARGS) || exit 1 63 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/backend/revision" 64 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/backend/revision -count=1 $(ADD_TEST_ARGS) || exit 1 65 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/backend/filter" 66 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/backend/filter -count=1 $(ADD_TEST_ARGS) || exit 1 67 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/backend/retryable" 68 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/backend/retryable -count=1 $(ADD_TEST_ARGS) || exit 1 69 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/backend" 70 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/backend -count=1 $(ADD_TEST_ARGS) || exit 1 71 | @echo "** running unit test in @ $(mkfile_dirpath)/pkg/frontend" 72 | @LONDON_TESTING_VARS=$(varFilePath) go test $(mkfile_dirpath)/pkg/frontend -count=1 $(ADD_TEST_ARGS) || exit 1 73 | 74 | 75 | test: unit-tests integration-tests e2e-test ## runs all tests 76 | 77 | build-image: ## builds docker image using binary in _output directory 78 | @docker build -t $(IMAGE_TAG) . 79 | 80 | push-image: ## pushes the image to registry 81 | @docker push $(IMAGE_TAG) 82 | 83 | build-and-push-image: build-binary build-image push-image ## builds binary, image and pushes image 84 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project London 2 | Project London is an experimental implementation of etcd api on top of Azure Storage Table. The implementation is scoped 3 | to supporting kubernetes clusters. A full implementation of etcd api is not on the scope of this project. A full implementation 4 | of etcd api on top azure storage is also not possible due to way azure table perform transactions. 5 | 6 | > While the functional correctness has been validated, the project is still in alpha status and we are tracking a set of known issues. 7 | 8 | # How To Use 9 | ``` 10 | # clone the repo 11 | git clone https://github.com/khenidak/london.git 12 | 13 | cd london 14 | # build. drop will be ./_output 15 | make binary-build 16 | 17 | 18 | # run 19 | ./_output/london run \ 20 | --use-tls \ 21 | --cert-file= \ 22 | --key-file= \ 23 | --trusted-ca-file= \ 24 | --account-name= \ 25 | --table-name= \ 26 | --primary-account-key= 27 | 28 | ## kubernetes api-server can now connect to https://localhost:2379 or alternatively use --listen-address argument to change listening address 29 | ``` 30 | 31 | # Testing and Validation 32 | the repo contains a set of tests as the following 33 | 1. Unit tests `make unit-tests` validates functionality of data access layer. 34 | 2. Integration tests `make integration-tests` validates the functionality using etcd client apis. 35 | 3. E2E tests `make e2e-test` validates the functionality using an in-proc kubernets api-server backed by London. 36 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/khenidak/london 2 | 3 | // we use local copy of kubernetes (check the make file) and vendor it in our 4 | // e2e tests. kubernetes (except klog) is not used in the binary itself. 5 | 6 | go 1.15 7 | 8 | require ( 9 | github.com/Azure/azure-sdk-for-go v50.0.0+incompatible 10 | github.com/Azure/go-autorest/autorest v0.11.16 // indirect 11 | github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect 12 | github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect 13 | github.com/dnaeon/go-vcr v1.1.0 // indirect 14 | github.com/evanphx/json-patch v4.9.0+incompatible 15 | github.com/gogo/protobuf v1.3.2 // indirect 16 | github.com/google/uuid v1.1.4 // indirect 17 | github.com/urfave/cli v1.22.2 18 | go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 19 | go.uber.org/zap v1.16.0 // indirect 20 | golang.org/dl v0.0.0-20210220033039-562909534da3 // indirect 21 | google.golang.org/grpc v1.27.1 22 | k8s.io/api v0.0.0 23 | k8s.io/apimachinery v0.0.0 24 | k8s.io/client-go v0.0.0 25 | k8s.io/klog/v2 v2.4.0 26 | k8s.io/kubernetes v0.0.0 27 | ) 28 | 29 | replace ( 30 | go.etcd.io/etcd => go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 31 | 32 | k8s.io/api => ./kubernetes_src/kubernetes/staging/src/k8s.io/api 33 | k8s.io/apiextensions-apiserver => ./kubernetes_src/kubernetes/staging/src/k8s.io/apiextensions-apiserver 34 | k8s.io/apimachinery => ./kubernetes_src/kubernetes/staging/src/k8s.io/apimachinery 35 | k8s.io/apiserver => ./kubernetes_src/kubernetes/staging/src/k8s.io/apiserver 36 | k8s.io/cli-runtime => ./kubernetes_src/kubernetes/staging/src/k8s.io/cli-runtime 37 | k8s.io/client-go => ./kubernetes_src/kubernetes/staging/src/k8s.io/client-go 38 | k8s.io/cloud-provider => ./kubernetes_src/kubernetes/staging/src/k8s.io/cloud-provider 39 | k8s.io/cluster-bootstrap => ./kubernetes_src/kubernetes/staging/src/k8s.io/cluster-bootstrap 40 | k8s.io/code-generator => ./kubernetes_src/kubernetes/staging/src/k8s.io/code-generator 41 | k8s.io/component-base => ./kubernetes_src/kubernetes/staging/src/k8s.io/component-base 42 | k8s.io/component-helpers => ./kubernetes_src/kubernetes/staging/src/k8s.io/component-helpers 43 | k8s.io/controller-manager => ./kubernetes_src/kubernetes/staging/src/k8s.io/controller-manager 44 | k8s.io/cri-api => ./kubernetes_src/kubernetes/staging/src/k8s.io/cri-api 45 | k8s.io/csi-translation-lib => ./kubernetes_src/kubernetes/staging/src/k8s.io/csi-translation-lib 46 | k8s.io/kube-aggregator => ./kubernetes_src/kubernetes/staging/src/k8s.io/kube-aggregator 47 | k8s.io/kube-controller-manager => ./kubernetes_src/kubernetes/staging/src/k8s.io/kube-controller-manager 48 | k8s.io/kube-proxy => ./kubernetes_src/kubernetes/staging/src/k8s.io/kube-proxy 49 | k8s.io/kube-scheduler => ./kubernetes_src/kubernetes/staging/src/k8s.io/kube-scheduler 50 | k8s.io/kubectl => ./kubernetes_src/kubernetes/staging/src/k8s.io/kubectl 51 | k8s.io/kubelet => ./kubernetes_src/kubernetes/staging/src/k8s.io/kubelet 52 | k8s.io/kubernetes => ./kubernetes_src/kubernetes/ 53 | k8s.io/legacy-cloud-providers => ./kubernetes_src/kubernetes/staging/src/k8s.io/legacy-cloud-providers 54 | k8s.io/metrics => ./kubernetes_src/kubernetes/staging/src/k8s.io/metrics 55 | k8s.io/mount-utils => ./kubernetes_src/kubernetes/staging/src/k8s.io/mount-utils 56 | k8s.io/sample-apiserver => ./kubernetes_src/kubernetes/staging/src/k8s.io/sample-apiserver 57 | ) 58 | -------------------------------------------------------------------------------- /hack/build_kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | set -o pipefail 4 | 5 | 6 | TARGET_VER="$1" 7 | TARGET_PATH="$2" 8 | END_PATH="$3" 9 | 10 | set -u 11 | if [[ $TARGET_PATH == "" ]]; then 12 | echo "undefined target path expect it as