From b00a9f0d8564fcaea0af4a819fa3df29321c91a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Feb 2023 02:42:46 +0000 Subject: [PATCH 01/18] Bump github.com/prometheus/client_golang from 1.11.0 to 1.11.1 Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.11.0 to 1.11.1. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.11.0...v1.11.1) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 13 ++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index b952cf14..c336e202 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.11.0 // indirect + github.com/prometheus/client_golang v1.11.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.28.0 // indirect github.com/prometheus/procfs v0.6.0 // indirect diff --git a/go.sum b/go.sum index 097eeb2f..80f7d72d 100644 --- a/go.sum +++ b/go.sum @@ -79,7 +79,6 @@ github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnweb github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -160,7 +159,6 @@ github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -346,20 +344,16 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -378,8 +372,9 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -484,7 +479,6 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -581,7 +575,6 @@ 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.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -660,7 +653,6 @@ 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-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -750,7 +742,6 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= From c20a190989b89b1070d99a443e9a130b26ab2027 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Sat, 18 Feb 2023 20:06:15 +0530 Subject: [PATCH 02/18] update license --- LICENSE | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/LICENSE b/LICENSE index c468cae4..79e9f281 100644 --- a/LICENSE +++ b/LICENSE @@ -11,3 +11,17 @@ 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. +--- +Copyright 2023 Cloudnatively, Pvt Ltd. + +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. \ No newline at end of file From dab20730e0642c0f03876c606ecdbdba50abea6a Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Sat, 18 Feb 2023 20:06:40 +0530 Subject: [PATCH 03/18] update license --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 79e9f281..797cc250 100644 --- a/LICENSE +++ b/LICENSE @@ -12,7 +12,7 @@ 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. --- -Copyright 2023 Cloudnatively, Pvt Ltd. +Copyright 2023 Cloudnatively Services, Pvt Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 424c9c5dc34a5419e080f611a3da726f49a7bdb1 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Sat, 18 Feb 2023 20:17:29 +0530 Subject: [PATCH 04/18] update CI --- .github/workflows/docker-image.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 69f31776..3a4a8b4e 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -1,4 +1,4 @@ -name: Docker Image CI +name: Druid Operator on: push: @@ -19,4 +19,4 @@ jobs: - name: Run helm template run: make template - name: Build the Docker image - run: docker build . -t druidio/druid-operator:$(date +%s) + run: docker build . -t cloudnatively/druid-operator:$(date +%s) From 629dabf958ac3909e6aa5c068c8d7081b8e637d8 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Sat, 18 Feb 2023 20:35:22 +0530 Subject: [PATCH 05/18] update README badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f6bac157..da224140 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Kubernetes Operator for Apache Druid -![Build Status](https://github.com/druid-io/druid-operator/actions/workflows/docker-image.yml/badge.svg) ![Docker pull](https://img.shields.io/docker/pulls/druidio/druid-operator.svg) [![Latest Version](https://img.shields.io/github/tag/druid-io/druid-operator)](https://github.com/druid-io/druid-operator/releases) +![Build Status](https://github.com/cloudnativelyhq/druid-operator/actions/workflows/docker-image.yml/badge.svg) ![Docker pull](https://img.shields.io/docker/pulls/druidio/druid-operator.svg) [![Latest Version](https://img.shields.io/github/tag/druid-io/druid-operator)](https://github.com/druid-io/druid-operator/releases) - druid-operator provisions and manages [Apache Druid](https://druid.apache.org/) cluster on kubernetes. - druid-operator is designed to provision and manage [Apache Druid](https://druid.apache.org/) in distributed mode only. From a62d3086fdaeb5c7d4586f8ced9630f7ef12f930 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Sun, 19 Feb 2023 06:14:38 +0530 Subject: [PATCH 06/18] WIP e2e tests --- Makefile | 94 +++++++++++- e2e/druid-cr.yaml | 242 +++++++++++++++++++++++++++++++ e2e/kind.sh | 41 ++++++ e2e/minio-operator-override.yaml | 7 + e2e/minio-tenant-override.yaml | 6 + examples/tiny-cluster.yaml | 2 +- 6 files changed, 387 insertions(+), 5 deletions(-) create mode 100644 e2e/druid-cr.yaml create mode 100755 e2e/kind.sh create mode 100644 e2e/minio-operator-override.yaml create mode 100644 e2e/minio-tenant-override.yaml diff --git a/Makefile b/Makefile index b5eb3445..9d0c0237 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,18 @@ +# IMG TAG +IMG_TAG ?= "latest" # Image URL to use all building/pushing image targets -IMG ?= "druid-operator:latest" +IMG ?= "druid-operator" +# Local Image URL to be pushed to kind registery +IMG_KIND ?= "localhost:5001/druid-operator" +# NAMESPACE for druid operator e2e +NAMESPACE_DRUID_OPERATOR ?= "druid-operator" +# NAMESPACE for zk operator e2e +NAMESPACE_ZK_OPERATOR ?= "zk-operator" +# NAMESPACE for zk operator e2e +NAMESPACE_MINIO_OPERATOR ?= "minio-operator" +# NAMESPACE for druid app e2e +NAMESPACE_DRUID ?= "druid" + # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. ENVTEST_K8S_VERSION = 1.24.2 @@ -77,11 +90,11 @@ template: .PHONY: docker-build docker-build: test ## Build docker image with the manager. - docker build -t ${IMG} . + docker build -t ${IMG}:${IMG_TAG} . .PHONY: docker-push docker-push: ## Push docker image with the manager. - docker push ${IMG} + docker push ${IMG}:${IMG_TAG} ##@ Deployment @@ -99,7 +112,7 @@ uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified .PHONY: deploy deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. - cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}:${IMG_TAG} $(KUSTOMIZE) build config/default | kubectl apply -f - .PHONY: undeploy @@ -137,3 +150,76 @@ $(CONTROLLER_GEN): $(LOCALBIN) envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + +## e2e kind deployment +.PHONY: e2e +e2e: fmt vet test lint template kind docker-build-local docker-push-local helm-install-druid-operator helm-install-zk-operator helm-druid-install ## Run e2e. + +## Build Kind +.PHONY: kind +kind: ## Bootstrap Kind Locally + sh e2e/kind.sh + +## Make Docker build for kind registery +.PHONY: docker-build-local +docker-build-local: ## Build docker image with the manager. + docker build -t ${IMG_KIND}:${IMG_TAG} . + +## Make Docker push locally to kind registery +.PHONY: docker-push-local +docker-push-local: ## Build docker image with the manager. + docker push ${IMG_KIND}:${IMG_TAG} + +## Helm install to deploy the druid operator +.PHONY: helm-install-druid-operator +helm-install-druid-operator: ## helm upgrade/install + helm upgrade --install \ + --namespace ${NAMESPACE_DRUID_OPERATOR} \ + --create-namespace \ + ${NAMESPACE_DRUID_OPERATOR} chart/ \ + --set image.repository=${IMG_KIND} \ + --set image.tag=${IMG_TAG} + +## Helm deploy zk opeator +.PHONY: helm-install-zk-operator +helm-install-zk-operator: + helm repo add pravega https://charts.pravega.io + helm repo update pravega + helm upgrade --install \ + --namespace ${NAMESPACE_ZK_OPERATOR} \ + --create-namespace \ + ${NAMESPACE_ZK_OPERATOR} pravega/zookeeper-operator + +## Helm deploy zk and druid +.PHONY: helm-druid-install +helm-druid-install: + helm upgrade --install \ + --namespace ${NAMESPACE_DRUID} \ + --create-namespace \ + ${NAMESPACE_DRUID} pravega/zookeeper \ + --set replicas=1 + +## Helm deploy minio operator and minio +.PHONY: helm-minio-install +helm-minio-install: + helm repo add minio https://operator.min.io/ + helm repo update minio + helm upgrade --install \ + --namespace ${NAMESPACE_MINIO_OPERATOR} \ + --create-namespace \ + ${NAMESPACE_MINIO_OPERATOR} minio/operator \ + -f e2e/minio-operator-override.yaml + +## Helm deploy zk and druid +.PHONY: helm-druid-install +helm-druid-install: + helm upgrade --install \ + --namespace ${NAMESPACE_DRUID} \ + --create-namespace \ + ${NAMESPACE_DRUID}-minio minio/tenant \ + -f e2e/minio-tenant-override.yaml + helm upgrade --install \ + --namespace ${NAMESPACE_DRUID} \ + --create-namespace \ + ${NAMESPACE_DRUID}-zk pravega/zookeeper \ + --set replicas=1 diff --git a/e2e/druid-cr.yaml b/e2e/druid-cr.yaml new file mode 100644 index 00000000..8c12fd65 --- /dev/null +++ b/e2e/druid-cr.yaml @@ -0,0 +1,242 @@ +apiVersion: "druid.apache.org/v1alpha1" +kind: "Druid" +metadata: + name: tiny-cluster +spec: + image: apache/druid:25.0.0 + # Optionally specify image for all nodes. Can be specify on nodes also + # imagePullSecrets: + # - name: tutu + startScript: /druid.sh + podLabels: + environment: stage + release: alpha + podAnnotations: + dummy: k8s_extn_needs_atleast_one_annotation + readinessProbe: + httpGet: + path: /status/health + port: 8088 + securityContext: + fsGroup: 0 + runAsUser: 0 + runAsGroup: 0 + containerSecurityContext: + privileged: true + services: + - spec: + type: ClusterIP + clusterIP: None + commonConfigMountPath: "/opt/druid/conf/druid/cluster/_common" + jvm.options: |- + -server + -XX:MaxDirectMemorySize=10240g + -Duser.timezone=UTC + -Dfile.encoding=UTF-8 + -Dlog4j.debug + -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager + log4j.config: |- + + + + + + + + + + + + + + common.runtime.properties: | + # + # Zookeeper-less Druid Cluster + # + druid.zk.service.enabled=false + druid.discovery.type=k8s + druid.discovery.k8s.clusterIdentifier=druid-it + druid.serverview.type=http + druid.coordinator.loadqueuepeon.type=http + druid.indexer.runner.type=httpRemote + # Metadata Store + druid.metadata.storage.type=derby + druid.metadata.storage.connector.connectURI=jdbc:derby://localhost:1527/var/druid/metadata.db;create=true + druid.metadata.storage.connector.host=localhost + druid.metadata.storage.connector.port=1527 + druid.metadata.storage.connector.createTables=true + # Deep Storage + druid.storage.type=local + druid.storage.storageDirectory=/druid/data/deepstorage + # + # Extensions + # + druid.extensions.loadList=["druid-avro-extensions","druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-kubernetes-extensions"] + # + # Service discovery + # + druid.selectors.indexing.serviceName=druid/overlord + druid.selectors.coordinator.serviceName=druid/coordinator + druid.indexer.logs.type=file + druid.indexer.logs.directory=/druid/data/task-logs + druid.indexer.task.baseDir=/druid/data/task-base + druid.lookup.enableLookupSyncOnStartup=false + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + + nodes: + brokers: + # Optionally specify for running broker as Deployment + # kind: Deployment + nodeType: "broker" + # Optionally specify for broker nodes + # imagePullSecrets: + # - name: tutu + druid.port: 8088 + services: + - spec: + type: ClusterIP + clusterIP: None + nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/broker" + replicas: 1 + runtime.properties: | + druid.service=druid/broker + # HTTP server threads + druid.broker.http.numConnections=5 + druid.server.http.numThreads=40 + # Processing threads and buffers + druid.processing.buffer.sizeBytes=25000000 + druid.sql.enable=true + extra.jvm.options: |- + -Xmx512m + -Xms512m + + coordinators: + # Optionally specify for running coordinator as Deployment + # kind: Deployment + nodeType: "coordinator" + druid.port: 8088 + services: + - spec: + type: ClusterIP + clusterIP: None + nodeConfigMountPath: "/opt/druid/conf/druid/cluster/master/coordinator-overlord" + replicas: 1 + runtime.properties: | + druid.service=druid/coordinator + # HTTP server threads + druid.coordinator.startDelay=PT30S + druid.coordinator.period=PT30S + # Configure this coordinator to also run as Overlord + druid.coordinator.asOverlord.enabled=true + druid.coordinator.asOverlord.overlordService=druid/overlord + druid.indexer.queue.startDelay=PT30S + extra.jvm.options: |- + -Xmx800m + -Xms800m + resources: + requests: + memory: "1G" + limits: + memory: "1G" + + historicals: + nodeType: "historical" + druid.port: 8088 + services: + - spec: + type: ClusterIP + clusterIP: None + nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/historical" + replicas: 1 + runtime.properties: | + druid.service=druid/historical + druid.processing.buffer.sizeBytes=25000000 + druid.processing.numThreads=2 + # Segment storage + druid.segmentCache.locations=[{"path":"/druid/data/segments","maxSize":10737418240}] + druid.server.maxSize=10737418240 + extra.jvm.options: |- + -Xmx512m + -Xms512m + resources: + requests: + memory: "1G" + limits: + memory: "1G" + + routers: + nodeType: "router" + druid.port: 8088 + services: + - spec: + type: ClusterIP + clusterIP: None + nodeConfigMountPath: "/opt/druid/conf/druid/cluster/query/router" + replicas: 1 + runtime.properties: | + druid.service=druid/router + # HTTP proxy + druid.router.http.numConnections=50 + druid.router.http.readTimeout=PT5M + druid.router.http.numMaxThreads=100 + druid.server.http.numThreads=100 + # Service discovery + druid.router.defaultBrokerServiceName=druid/broker + druid.router.coordinatorServiceName=druid/coordinator + # Management proxy to coordinator / overlord: required for unified web console. + druid.router.managementProxy.enabled=true + + middlemanagers: + nodeType: "middleManager" + nodeConfigMountPath: "/opt/druid/conf/druid/cluster/data/middleManager" + druid.port: 8088 + services: + - spec: + type: ClusterIP + clusterIP: None + replicas: 1 + extra.jvm.options: |- + -Xmx512m + -Xms512m + runtime.properties: | + druid.service=druid/middleManager + druid.worker.capacity=2 + druid.indexer.runner.javaOpts=-server -Xms128m -Xmx128m -XX:MaxDirectMemorySize=256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/druid/data/tmp -XX:+ExitOnOutOfMemoryError -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager + druid.indexer.task.baseTaskDir=/druid/data/baseTaskDir + druid.server.http.numThreads=10 + druid.indexer.fork.property.druid.processing.buffer.sizeBytes=25000000 + druid.indexer.fork.property.druid.processing.numMergeBuffers=2 + druid.indexer.fork.property.druid.processing.numThreads=1 +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: druid-cluster +rules: +- apiGroups: + - "" + resources: + - pods + - configmaps + verbs: + - '*' +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: druid-cluster +subjects: +- kind: ServiceAccount + name: default +roleRef: + kind: Role + name: druid-cluster + apiGroup: rbac.authorization.k8s.io diff --git a/e2e/kind.sh b/e2e/kind.sh new file mode 100755 index 00000000..134c9900 --- /dev/null +++ b/e2e/kind.sh @@ -0,0 +1,41 @@ +#!/bin/bash +#!/bin/sh +set -o errexit + +# create registry container unless it already exists +reg_name='kind-registry' +reg_port='5001' +if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then + docker run \ + -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" \ + registry:2 +fi + +# create a cluster with the local registry enabled in containerd +cat < Date: Mon, 20 Feb 2023 01:04:47 +0530 Subject: [PATCH 07/18] update e2e with latest druid --- e2e/druid-cr.yaml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/e2e/druid-cr.yaml b/e2e/druid-cr.yaml index 8c12fd65..948ad55c 100644 --- a/e2e/druid-cr.yaml +++ b/e2e/druid-cr.yaml @@ -66,20 +66,28 @@ spec: druid.metadata.storage.connector.port=1527 druid.metadata.storage.connector.createTables=true # Deep Storage - druid.storage.type=local - druid.storage.storageDirectory=/druid/data/deepstorage + druid.storage.type=s3 + druid.storage.bucket=druid + druid.storage.baseKey=druid/segments + druid.s3.accessKey=minio + druid.s3.secretKey=minio123 + druid.s3.protocol=http + druid.s3.enabePathStyleAccess=true + druid.s3.endpoint.signingRegion=us-east-1 + druid.s3.enablePathStyleAccess=true + druid.s3.endpoint.url=http://minio1-hl.minio.svc.cluster.local:9000/ # # Extensions # - druid.extensions.loadList=["druid-avro-extensions","druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-kubernetes-extensions"] + druid.extensions.loadList=["druid-avro-extensions", "druid-s3-extensions", "druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-kubernetes-extensions"] # # Service discovery # druid.selectors.indexing.serviceName=druid/overlord druid.selectors.coordinator.serviceName=druid/coordinator - druid.indexer.logs.type=file - druid.indexer.logs.directory=/druid/data/task-logs - druid.indexer.task.baseDir=/druid/data/task-base + druid.indexer.logs.type=s3 + druid.indexer.logs.s3Bucket=druid + druid.indexer.logs.s3Prefix=druid/indexing-logs druid.lookup.enableLookupSyncOnStartup=false env: - name: POD_NAME From 6cc3fecc86f88389808081924c861f3b4165d07f Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 02:59:47 +0530 Subject: [PATCH 08/18] add e2e to ci --- .github/workflows/docker-image.yml | 4 +- Makefile | 38 +++---------------- e2e/{ => configs}/druid-cr.yaml | 16 ++------ .../minio-operator-override.yaml | 0 e2e/{ => configs}/minio-tenant-override.yaml | 0 e2e/e2e.sh | 37 ++++++++++++++++++ 6 files changed, 48 insertions(+), 47 deletions(-) rename e2e/{ => configs}/druid-cr.yaml (95%) rename e2e/{ => configs}/minio-operator-override.yaml (100%) rename e2e/{ => configs}/minio-tenant-override.yaml (100%) create mode 100755 e2e/e2e.sh diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 3a4a8b4e..2562217a 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -18,5 +18,5 @@ jobs: run: make lint - name: Run helm template run: make template - - name: Build the Docker image - run: docker build . -t cloudnatively/druid-operator:$(date +%s) + - name: Run e2e tests + run: make e2e \ No newline at end of file diff --git a/Makefile b/Makefile index 9d0c0237..24431081 100644 --- a/Makefile +++ b/Makefile @@ -151,9 +151,10 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest -## e2e kind deployment +## e2e deployment .PHONY: e2e -e2e: fmt vet test lint template kind docker-build-local docker-push-local helm-install-druid-operator helm-install-zk-operator helm-druid-install ## Run e2e. +e2e: + sh e2e/e2e.sh ## Build Kind .PHONY: kind @@ -180,25 +181,6 @@ helm-install-druid-operator: ## helm upgrade/install --set image.repository=${IMG_KIND} \ --set image.tag=${IMG_TAG} -## Helm deploy zk opeator -.PHONY: helm-install-zk-operator -helm-install-zk-operator: - helm repo add pravega https://charts.pravega.io - helm repo update pravega - helm upgrade --install \ - --namespace ${NAMESPACE_ZK_OPERATOR} \ - --create-namespace \ - ${NAMESPACE_ZK_OPERATOR} pravega/zookeeper-operator - -## Helm deploy zk and druid -.PHONY: helm-druid-install -helm-druid-install: - helm upgrade --install \ - --namespace ${NAMESPACE_DRUID} \ - --create-namespace \ - ${NAMESPACE_DRUID} pravega/zookeeper \ - --set replicas=1 - ## Helm deploy minio operator and minio .PHONY: helm-minio-install helm-minio-install: @@ -208,18 +190,10 @@ helm-minio-install: --namespace ${NAMESPACE_MINIO_OPERATOR} \ --create-namespace \ ${NAMESPACE_MINIO_OPERATOR} minio/operator \ - -f e2e/minio-operator-override.yaml - -## Helm deploy zk and druid -.PHONY: helm-druid-install -helm-druid-install: + -f e2e/configs/minio-operator-override.yaml helm upgrade --install \ --namespace ${NAMESPACE_DRUID} \ --create-namespace \ ${NAMESPACE_DRUID}-minio minio/tenant \ - -f e2e/minio-tenant-override.yaml - helm upgrade --install \ - --namespace ${NAMESPACE_DRUID} \ - --create-namespace \ - ${NAMESPACE_DRUID}-zk pravega/zookeeper \ - --set replicas=1 + -f e2e/configs/minio-tenant-override.yaml + diff --git a/e2e/druid-cr.yaml b/e2e/configs/druid-cr.yaml similarity index 95% rename from e2e/druid-cr.yaml rename to e2e/configs/druid-cr.yaml index 948ad55c..448e4cf5 100644 --- a/e2e/druid-cr.yaml +++ b/e2e/configs/druid-cr.yaml @@ -75,7 +75,7 @@ spec: druid.s3.enabePathStyleAccess=true druid.s3.endpoint.signingRegion=us-east-1 druid.s3.enablePathStyleAccess=true - druid.s3.endpoint.url=http://minio1-hl.minio.svc.cluster.local:9000/ + druid.s3.endpoint.url=http://minio1-hl.druid.svc.cluster.local:9000/ # # Extensions # @@ -149,11 +149,6 @@ spec: extra.jvm.options: |- -Xmx800m -Xms800m - resources: - requests: - memory: "1G" - limits: - memory: "1G" historicals: nodeType: "historical" @@ -174,11 +169,6 @@ spec: extra.jvm.options: |- -Xmx512m -Xms512m - resources: - requests: - memory: "1G" - limits: - memory: "1G" routers: nodeType: "router" @@ -216,10 +206,10 @@ spec: -Xms512m runtime.properties: | druid.service=druid/middleManager - druid.worker.capacity=2 + druid.worker.capacity=1 druid.indexer.runner.javaOpts=-server -Xms128m -Xmx128m -XX:MaxDirectMemorySize=256m -Duser.timezone=UTC -Dfile.encoding=UTF-8 -Djava.io.tmpdir=/druid/data/tmp -XX:+ExitOnOutOfMemoryError -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager druid.indexer.task.baseTaskDir=/druid/data/baseTaskDir - druid.server.http.numThreads=10 + druid.server.http.numThreads=1 druid.indexer.fork.property.druid.processing.buffer.sizeBytes=25000000 druid.indexer.fork.property.druid.processing.numMergeBuffers=2 druid.indexer.fork.property.druid.processing.numThreads=1 diff --git a/e2e/minio-operator-override.yaml b/e2e/configs/minio-operator-override.yaml similarity index 100% rename from e2e/minio-operator-override.yaml rename to e2e/configs/minio-operator-override.yaml diff --git a/e2e/minio-tenant-override.yaml b/e2e/configs/minio-tenant-override.yaml similarity index 100% rename from e2e/minio-tenant-override.yaml rename to e2e/configs/minio-tenant-override.yaml diff --git a/e2e/e2e.sh b/e2e/e2e.sh new file mode 100755 index 00000000..86ae80f2 --- /dev/null +++ b/e2e/e2e.sh @@ -0,0 +1,37 @@ +#!/bin/bash +#!/bin/sh +set -o errexit +# Get Kind +go install sigs.k8s.io/kind@v0.17.0 +# minio statefulset name +MINIO_STS_NAME=minio1-ss-0 +# druid namespace +NAMESPACE=druid +# fmt code +make fmt +# vet +make vet +# deploy kind +make kind +# build local docker druid operator image +make docker-build-local +# push to kind registery +make docker-push-local +# install druid-operator +make helm-install-druid-operator +# install minio-operator and tenant +make helm-minio-install +# hack for minio pod to get started +sleep 60 +# wait for minio pods +kubectl rollout status sts $MINIO_STS_NAME -n ${NAMESPACE} --timeout=60s +# output pods +kubectl get pods -n ${NAMESPACE} +# apply druid cr +kubectl apply -f e2e/configs/druid-cr.yaml -n ${NAMESPACE} +# wait for druid pods +sts=$(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)') +for sts in ${sts[@]}; do + echo $sts + kubectl rollout status sts $sts -n ${NAMESPACE} --timeout=60s +done From 525799e27669cc4c938fabf601939d981561debf Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 03:19:15 +0530 Subject: [PATCH 09/18] fix rollout --- e2e/e2e.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e/e2e.sh b/e2e/e2e.sh index 86ae80f2..9f582da2 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -30,8 +30,8 @@ kubectl get pods -n ${NAMESPACE} # apply druid cr kubectl apply -f e2e/configs/druid-cr.yaml -n ${NAMESPACE} # wait for druid pods -sts=$(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)') -for sts in ${sts[@]}; do - echo $sts - kubectl rollout status sts $sts -n ${NAMESPACE} --timeout=60s +declare -a sts=($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)')) +for s in ${sts[@]}; do + echo $s + kubectl rollout status sts $s -n ${NAMESPACE} --timeout=60s done From 0af89c08b8d0d98d931a51975db24895c7828e79 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 03:28:01 +0530 Subject: [PATCH 10/18] hack update --- e2e/e2e.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/e2e/e2e.sh b/e2e/e2e.sh index 9f582da2..bd891007 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -29,6 +29,8 @@ kubectl rollout status sts $MINIO_STS_NAME -n ${NAMESPACE} --timeout=60s kubectl get pods -n ${NAMESPACE} # apply druid cr kubectl apply -f e2e/configs/druid-cr.yaml -n ${NAMESPACE} +# hack for druid pods +sleep 30 # wait for druid pods declare -a sts=($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)')) for s in ${sts[@]}; do From 5c9dd34db1995453af714ca8843f9cf9fdc6a9f9 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 03:42:11 +0530 Subject: [PATCH 11/18] fix array --- e2e/e2e.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/e2e.sh b/e2e/e2e.sh index bd891007..a56d5754 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -32,7 +32,7 @@ kubectl apply -f e2e/configs/druid-cr.yaml -n ${NAMESPACE} # hack for druid pods sleep 30 # wait for druid pods -declare -a sts=($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)')) +declare -a sts=`($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)'))` for s in ${sts[@]}; do echo $s kubectl rollout status sts $s -n ${NAMESPACE} --timeout=60s From 6ebab3454ade5e6189791a26349dcfc9a65d32de Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 04:09:18 +0530 Subject: [PATCH 12/18] add e2e --- e2e/e2e.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/e2e.sh b/e2e/e2e.sh index a56d5754..bd891007 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -32,7 +32,7 @@ kubectl apply -f e2e/configs/druid-cr.yaml -n ${NAMESPACE} # hack for druid pods sleep 30 # wait for druid pods -declare -a sts=`($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)'))` +declare -a sts=($(kubectl get sts -n ${NAMESPACE} -l app=${NAMESPACE} | awk '{ print $1 }' | awk '(NR>1)')) for s in ${sts[@]}; do echo $s kubectl rollout status sts $s -n ${NAMESPACE} --timeout=60s From 8c5dca79ce283c15bda086a3d76cb40109afdf29 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 04:24:38 +0530 Subject: [PATCH 13/18] update e2e --- e2e/e2e.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/e2e.sh b/e2e/e2e.sh index bd891007..ca38f16b 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -1,6 +1,7 @@ #!/bin/bash #!/bin/sh set -o errexit +set -x # Get Kind go install sigs.k8s.io/kind@v0.17.0 # minio statefulset name From 0803f6da99f160b1c9cf7a9a696b04aa4eeb7af8 Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Mon, 20 Feb 2023 04:33:15 +0530 Subject: [PATCH 14/18] fix e2e --- Makefile | 2 +- e2e/e2e.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 24431081..69a67140 100644 --- a/Makefile +++ b/Makefile @@ -154,7 +154,7 @@ $(ENVTEST): $(LOCALBIN) ## e2e deployment .PHONY: e2e e2e: - sh e2e/e2e.sh + e2e/e2e.sh ## Build Kind .PHONY: kind diff --git a/e2e/e2e.sh b/e2e/e2e.sh index ca38f16b..43f10efa 100755 --- a/e2e/e2e.sh +++ b/e2e/e2e.sh @@ -1,5 +1,4 @@ #!/bin/bash -#!/bin/sh set -o errexit set -x # Get Kind From 497379294784ff704e1fe9d4b33234ae2d40acfd Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Tue, 21 Feb 2023 05:58:11 +0530 Subject: [PATCH 15/18] make nodeSelector consistent --- controllers/druid/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controllers/druid/handler.go b/controllers/druid/handler.go index 40d348b4..47f6eb18 100644 --- a/controllers/druid/handler.go +++ b/controllers/druid/handler.go @@ -1345,7 +1345,7 @@ func makePodSpec(nodeSpec *v1alpha1.DruidNodeSpec, m *v1alpha1.Druid, nodeSpecUn } spec := v1.PodSpec{ - NodeSelector: firstNonNilValue(m.Spec.NodeSelector, nodeSpec.NodeSelector).(map[string]string), + NodeSelector: firstNonNilValue(nodeSpec.NodeSelector, m.Spec.NodeSelector).(map[string]string), TopologySpreadConstraints: getTopologySpreadConstraints(nodeSpec), Tolerations: getTolerations(nodeSpec, m), Affinity: getAffinity(nodeSpec, m), From 8883ee763e1030824326636fa5b08afe9626ae3d Mon Sep 17 00:00:00 2001 From: AdheipSingh Date: Tue, 21 Feb 2023 07:27:42 +0530 Subject: [PATCH 16/18] remove functional dependency on empty objects --- controllers/druid/handler.go | 239 +++++------------------------------ 1 file changed, 29 insertions(+), 210 deletions(-) diff --git a/controllers/druid/handler.go b/controllers/druid/handler.go index 40d348b4..bca4a8ee 100644 --- a/controllers/druid/handler.go +++ b/controllers/druid/handler.go @@ -83,7 +83,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm if _, err := sdkCreateOrUpdateAsNeeded(sdk, func() (object, error) { return makeCommonConfigMap(m, ls) }, - func() object { return makeConfigMapEmptyObj() }, + func() object { return &v1.ConfigMap{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, configMapNames, emitEvents); err != nil { return err } @@ -142,7 +142,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm if _, err := sdkCreateOrUpdateAsNeeded(sdk, func() (object, error) { return nodeConfig, nil }, - func() object { return makeConfigMapEmptyObj() }, + func() object { return &v1.ConfigMap{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, configMapNames, emitEvents); err != nil { return err } @@ -153,7 +153,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm for _, svc := range services { if _, err := sdkCreateOrUpdateAsNeeded(sdk, func() (object, error) { return makeService(&svc, &nodeSpec, m, lm, nodeSpecUniqueStr) }, - func() object { return makeServiceEmptyObj() }, alwaysTrueIsEqualsFn, + func() object { return &v1.Service{} }, alwaysTrueIsEqualsFn, func(prev, curr object) { (curr.(*v1.Service)).Spec.ClusterIP = (prev.(*v1.Service)).Spec.ClusterIP }, m, serviceNames, emitEvents); err != nil { return err @@ -170,7 +170,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm func() (object, error) { return makeDeployment(&nodeSpec, m, lm, nodeSpecUniqueStr, fmt.Sprintf("%s-%s", commonConfigSHA, nodeConfigSHA), firstServiceName) }, - func() object { return makeDeploymentEmptyObj() }, + func() object { return &appsv1.Deployment{} }, deploymentIsEquals, noopUpdaterFn, m, deploymentNames, emitEvents); err != nil { return err } else if m.Spec.RollingDeploy { @@ -184,7 +184,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm // will be sequential. if m.Generation > 1 { // Check Deployment rolling update status, if in-progress then stop here - done, err := isObjFullyDeployed(sdk, nodeSpec, nodeSpecUniqueStr, m, func() object { return makeDeploymentEmptyObj() }, emitEvents) + done, err := isObjFullyDeployed(sdk, nodeSpec, nodeSpecUniqueStr, m, func() object { return &appsv1.Deployment{} }, emitEvents) if !done { return err } @@ -209,7 +209,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm func() (object, error) { return makeStatefulSet(&nodeSpec, m, lm, nodeSpecUniqueStr, fmt.Sprintf("%s-%s", commonConfigSHA, nodeConfigSHA), firstServiceName) }, - func() object { return makeStatefulSetEmptyObj() }, + func() object { return &appsv1.StatefulSet{} }, statefulSetIsEquals, noopUpdaterFn, m, statefulSetNames, emitEvents); err != nil { return err } else if m.Spec.RollingDeploy { @@ -227,7 +227,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm // will be sequential. if m.Generation > 1 { //Check StatefulSet rolling update status, if in-progress then stop here - done, err := isObjFullyDeployed(sdk, nodeSpec, nodeSpecUniqueStr, m, func() object { return makeStatefulSetEmptyObj() }, emitEvents) + done, err := isObjFullyDeployed(sdk, nodeSpec, nodeSpecUniqueStr, m, func() object { return &appsv1.StatefulSet{} }, emitEvents) if !done { return err } @@ -244,7 +244,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm func() (object, error) { return makeIngress(&nodeSpec, m, ls, nodeSpecUniqueStr) }, - func() object { return makeIngressEmptyObj() }, + func() object { return &networkingv1.Ingress{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, ingressNames, emitEvents); err != nil { return err } @@ -254,7 +254,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm if nodeSpec.PodDisruptionBudgetSpec != nil { if _, err := sdkCreateOrUpdateAsNeeded(sdk, func() (object, error) { return makePodDisruptionBudget(&nodeSpec, m, lm, nodeSpecUniqueStr) }, - func() object { return makePodDisruptionBudgetEmptyObj() }, + func() object { return &v1beta1.PodDisruptionBudget{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, podDisruptionBudgetNames, emitEvents); err != nil { return err } @@ -266,7 +266,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm func() (object, error) { return makeHorizontalPodAutoscaler(&nodeSpec, m, ls, nodeSpecUniqueStr) }, - func() object { return makeHorizontalPodAutoscalerEmptyObj() }, + func() object { return &autoscalev2beta2.HorizontalPodAutoscaler{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, hpaNames, emitEvents); err != nil { return err } @@ -276,7 +276,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm for _, pvc := range nodeSpec.PersistentVolumeClaim { if _, err := sdkCreateOrUpdateAsNeeded(sdk, func() (object, error) { return makePersistentVolumeClaim(&pvc, &nodeSpec, m, lm, nodeSpecUniqueStr) }, - func() object { return makePersistentVolumeClaimEmptyObj() }, alwaysTrueIsEqualsFn, + func() object { return &v1.PersistentVolumeClaim{} }, alwaysTrueIsEqualsFn, noopUpdaterFn, m, pvcNames, emitEvents); err != nil { return err @@ -296,7 +296,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm updatedStatus := v1alpha1.DruidClusterStatus{} updatedStatus.StatefulSets = deleteUnusedResources(sdk, m, statefulSetNames, ls, - func() objectList { return makeStatefulSetListEmptyObj() }, + func() objectList { return &appsv1.StatefulSetList{} }, func(listObj runtime.Object) []object { items := listObj.(*appsv1.StatefulSetList).Items result := make([]object, len(items)) @@ -308,7 +308,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.StatefulSets) updatedStatus.Deployments = deleteUnusedResources(sdk, m, deploymentNames, ls, - func() objectList { return makeDeloymentListEmptyObj() }, + func() objectList { return &appsv1.DeploymentList{} }, func(listObj runtime.Object) []object { items := listObj.(*appsv1.DeploymentList).Items result := make([]object, len(items)) @@ -320,7 +320,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.Deployments) updatedStatus.HPAutoScalers = deleteUnusedResources(sdk, m, hpaNames, ls, - func() objectList { return makeHorizontalPodAutoscalerListEmptyObj() }, + func() objectList { return &autoscalev2beta2.HorizontalPodAutoscalerList{} }, func(listObj runtime.Object) []object { items := listObj.(*autoscalev2beta2.HorizontalPodAutoscalerList).Items result := make([]object, len(items)) @@ -332,7 +332,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.HPAutoScalers) updatedStatus.Ingress = deleteUnusedResources(sdk, m, ingressNames, ls, - func() objectList { return makeIngressListEmptyObj() }, + func() objectList { return &networkingv1.IngressList{} }, func(listObj runtime.Object) []object { items := listObj.(*networkingv1.IngressList).Items result := make([]object, len(items)) @@ -344,7 +344,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.Ingress) updatedStatus.PodDisruptionBudgets = deleteUnusedResources(sdk, m, podDisruptionBudgetNames, ls, - func() objectList { return makePodDisruptionBudgetListEmptyObj() }, + func() objectList { return &v1beta1.PodDisruptionBudgetList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1beta1.PodDisruptionBudgetList).Items result := make([]object, len(items)) @@ -356,7 +356,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.PodDisruptionBudgets) updatedStatus.Services = deleteUnusedResources(sdk, m, serviceNames, ls, - func() objectList { return makeServiceListEmptyObj() }, + func() objectList { return &v1.ServiceList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.ServiceList).Items result := make([]object, len(items)) @@ -368,7 +368,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm sort.Strings(updatedStatus.Services) updatedStatus.ConfigMaps = deleteUnusedResources(sdk, m, configMapNames, ls, - func() objectList { return makeConfigMapListEmptyObj() }, + func() objectList { return &v1.ConfigMapList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.ConfigMapList).Items result := make([]object, len(items)) @@ -379,7 +379,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm }, emitEvents) sort.Strings(updatedStatus.ConfigMaps) - podList, _ := readers.List(context.TODO(), sdk, m, makeLabelsForDruid(m.Name), emitEvents, func() objectList { return makePodList() }, func(listObj runtime.Object) []object { + podList, _ := readers.List(context.TODO(), sdk, m, makeLabelsForDruid(m.Name), emitEvents, func() objectList { return &v1.PodList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PodList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -433,7 +433,7 @@ func deleteSTSAndPVC(sdk client.Client, drd *v1alpha1.Druid, stsList, pvcList [] } func checkIfCRExists(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEmitter) bool { - _, err := readers.Get(context.TODO(), sdk, m.Name, m, func() object { return makeDruidEmptyObj() }, emitEvents) + _, err := readers.Get(context.TODO(), sdk, m.Name, m, func() object { return &v1alpha1.Druid{} }, emitEvents) if err != nil { return false } else { @@ -443,7 +443,7 @@ func checkIfCRExists(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEmitt func deleteOrphanPVC(sdk client.Client, drd *v1alpha1.Druid, emitEvents EventEmitter) error { - podList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvents, func() objectList { return makePodList() }, func(listObj runtime.Object) []object { + podList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvents, func() objectList { return &v1.PodList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PodList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -459,7 +459,7 @@ func deleteOrphanPVC(sdk client.Client, drd *v1alpha1.Druid, emitEvents EventEmi "druid_cr": drd.Name, } - pvcList, err := readers.List(context.TODO(), sdk, drd, pvcLabels, emitEvents, func() objectList { return makePersistentVolumeClaimListEmptyObj() }, func(listObj runtime.Object) []object { + pvcList, err := readers.List(context.TODO(), sdk, drd, pvcLabels, emitEvents, func() objectList { return &v1.PersistentVolumeClaimList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PersistentVolumeClaimList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -521,7 +521,7 @@ func executeFinalizers(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEmi "druid_cr": m.Name, } - pvcList, err := readers.List(context.TODO(), sdk, m, pvcLabels, emitEvents, func() objectList { return makePersistentVolumeClaimListEmptyObj() }, func(listObj runtime.Object) []object { + pvcList, err := readers.List(context.TODO(), sdk, m, pvcLabels, emitEvents, func() objectList { return &v1.PersistentVolumeClaimList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PersistentVolumeClaimList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -533,7 +533,7 @@ func executeFinalizers(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEmi return err } - stsList, err := readers.List(context.TODO(), sdk, m, makeLabelsForDruid(m.Name), emitEvents, func() objectList { return makeStatefulSetListEmptyObj() }, func(listObj runtime.Object) []object { + stsList, err := readers.List(context.TODO(), sdk, m, makeLabelsForDruid(m.Name), emitEvents, func() objectList { return &appsv1.StatefulSetList{} }, func(listObj runtime.Object) []object { items := listObj.(*appsv1.StatefulSetList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -581,7 +581,7 @@ func execCheckCrashStatus(sdk client.Client, nodeSpec *v1alpha1.DruidNodeSpec, m func checkCrashStatus(sdk client.Client, drd *v1alpha1.Druid, emitEvents EventEmitter) error { - podList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvents, func() objectList { return makePodList() }, func(listObj runtime.Object) []object { + podList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvents, func() objectList { return &v1.PodList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PodList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -747,7 +747,7 @@ func isObjFullyDeployed(sdk client.Client, nodeSpec v1alpha1.DruidNodeSpec, node // NOTE: To be called only if generation > 1 func scalePVCForSts(sdk client.Client, nodeSpec *v1alpha1.DruidNodeSpec, nodeSpecUniqueStr string, drd *v1alpha1.Druid, emitEvent EventEmitter) error { - getSTSList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvent, func() objectList { return makeStatefulSetListEmptyObj() }, func(listObj runtime.Object) []object { + getSTSList, err := readers.List(context.TODO(), sdk, drd, makeLabelsForDruid(drd.Name), emitEvent, func() objectList { return &appsv1.StatefulSetList{} }, func(listObj runtime.Object) []object { items := listObj.(*appsv1.StatefulSetList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -770,7 +770,7 @@ func scalePVCForSts(sdk client.Client, nodeSpec *v1alpha1.DruidNodeSpec, nodeSpe // return nil, in case return err the program halts since sts would not be able // we would like the operator to create sts. - sts, err := readers.Get(context.TODO(), sdk, nodeSpecUniqueStr, drd, func() object { return makeStatefulSetEmptyObj() }, emitEvent) + sts, err := readers.Get(context.TODO(), sdk, nodeSpecUniqueStr, drd, func() object { return &appsv1.StatefulSet{} }, emitEvent) if err != nil { return nil } @@ -779,7 +779,7 @@ func scalePVCForSts(sdk client.Client, nodeSpec *v1alpha1.DruidNodeSpec, nodeSpe "component": nodeSpec.NodeType, } - pvcList, err := readers.List(context.TODO(), sdk, drd, pvcLabels, emitEvent, func() objectList { return makePersistentVolumeClaimListEmptyObj() }, func(listObj runtime.Object) []object { + pvcList, err := readers.List(context.TODO(), sdk, drd, pvcLabels, emitEvent, func() objectList { return &v1.PersistentVolumeClaimList{} }, func(listObj runtime.Object) []object { items := listObj.(*v1.PersistentVolumeClaimList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { @@ -878,7 +878,7 @@ func getVolumeClaimTemplateSizes(sts object, nodeSpec *v1alpha1.DruidNodeSpec, p func isVolumeExpansionEnabled(sdk client.Client, m *v1alpha1.Druid, nodeSpec *v1alpha1.DruidNodeSpec, emitEvent EventEmitter) bool { for _, nodeVCT := range nodeSpec.VolumeClaimTemplates { - sc, err := readers.Get(context.TODO(), sdk, *nodeVCT.Spec.StorageClassName, m, func() object { return makeStorageClassEmptyObj() }, emitEvent) + sc, err := readers.Get(context.TODO(), sdk, *nodeVCT.Spec.StorageClassName, m, func() object { return &storage.StorageClass{} }, emitEvent) if err != nil { return false } @@ -1502,187 +1502,6 @@ func asOwner(m *v1alpha1.Druid) metav1.OwnerReference { } } -// podList returns a v1.PodList object -func makePodList() *v1.PodList { - return &v1.PodList{ - TypeMeta: metav1.TypeMeta{ - Kind: "Pod", - APIVersion: "v1", - }, - } -} - -func makeDruidEmptyObj() *v1alpha1.Druid { - return &v1alpha1.Druid{ - TypeMeta: metav1.TypeMeta{ - Kind: "Druid", - APIVersion: "v1alpha1", - }, - } -} - -func makeStatefulSetListEmptyObj() *appsv1.StatefulSetList { - return &appsv1.StatefulSetList{ - TypeMeta: metav1.TypeMeta{ - Kind: "StatefulSet", - APIVersion: "apps/v1", - }, - } -} - -func makeDeloymentListEmptyObj() *appsv1.DeploymentList { - return &appsv1.DeploymentList{ - TypeMeta: metav1.TypeMeta{ - Kind: "Deployment", - APIVersion: "apps/v1", - }, - } -} - -func makePodDisruptionBudgetListEmptyObj() *v1beta1.PodDisruptionBudgetList { - return &v1beta1.PodDisruptionBudgetList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "policy/v1beta1", - Kind: "PodDisruptionBudget", - }, - } -} - -func makeHorizontalPodAutoscalerListEmptyObj() *autoscalev2beta2.HorizontalPodAutoscalerList { - return &autoscalev2beta2.HorizontalPodAutoscalerList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "autoscaling/v2beta1", - Kind: "HorizontalPodAutoscaler", - }, - } -} - -func makeIngressListEmptyObj() *networkingv1.IngressList { - return &networkingv1.IngressList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "networking.k8s.io/v1", - Kind: "Ingress", - }, - } -} - -func makeConfigMapListEmptyObj() *v1.ConfigMapList { - return &v1.ConfigMapList{ - TypeMeta: metav1.TypeMeta{ - Kind: "ConfigMap", - APIVersion: "v1", - }, - } -} - -func makeServiceListEmptyObj() *v1.ServiceList { - return &v1.ServiceList{ - TypeMeta: metav1.TypeMeta{ - Kind: "Service", - APIVersion: "v1", - }, - } -} - -func makePodEmptyObj() *v1.Pod { - return &v1.Pod{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "Pod", - }, - } -} - -func makeStatefulSetEmptyObj() *appsv1.StatefulSet { - return &appsv1.StatefulSet{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "apps/v1", - Kind: "StatefulSet", - }, - } -} - -func makeDeploymentEmptyObj() *appsv1.Deployment { - return &appsv1.Deployment{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "apps/v1", - Kind: "Deployment", - }, - } -} - -func makePodDisruptionBudgetEmptyObj() *v1beta1.PodDisruptionBudget { - return &v1beta1.PodDisruptionBudget{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "policy/v1beta1", - Kind: "PodDisruptionBudget", - }, - } -} - -func makeHorizontalPodAutoscalerEmptyObj() *autoscalev2beta2.HorizontalPodAutoscaler { - return &autoscalev2beta2.HorizontalPodAutoscaler{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "autoscaling/v2beta1", - Kind: "HorizontalPodAutoscaler", - }, - } -} - -func makePersistentVolumeClaimEmptyObj() *v1.PersistentVolumeClaim { - return &v1.PersistentVolumeClaim{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "PersistentVolumeClaim", - }, - } -} - -func makePersistentVolumeClaimListEmptyObj() *v1.PersistentVolumeClaimList { - return &v1.PersistentVolumeClaimList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "PersistentVolumeClaim", - }, - } -} - -func makeIngressEmptyObj() *networkingv1.Ingress { - return &networkingv1.Ingress{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "networking.k8s.io/v1", - Kind: "Ingress", - }, - } -} - -func makeServiceEmptyObj() *v1.Service { - return &v1.Service{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "Service", - }, - } -} - -func makeStorageClassEmptyObj() *storage.StorageClass { - return &storage.StorageClass{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "storage.k8s.io/v1", - Kind: "StorageClass", - }, - } -} - -func makeConfigMapEmptyObj() *v1.ConfigMap { - return &v1.ConfigMap{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "v1", - Kind: "ConfigMap", - }, - } -} - // getPodNames returns the pod names of the array of pods passed in func getPodNames(pods []object) []string { var podNames []string From c64e9c06303a5ed360ad633c46ca3845c989e8ed Mon Sep 17 00:00:00 2001 From: AdheipSingh <34169002+AdheipSingh@users.noreply.github.com> Date: Tue, 21 Feb 2023 09:24:03 +0530 Subject: [PATCH 17/18] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da224140..a4a204aa 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Kubernetes Operator for Apache Druid -![Build Status](https://github.com/cloudnativelyhq/druid-operator/actions/workflows/docker-image.yml/badge.svg) ![Docker pull](https://img.shields.io/docker/pulls/druidio/druid-operator.svg) [![Latest Version](https://img.shields.io/github/tag/druid-io/druid-operator)](https://github.com/druid-io/druid-operator/releases) +![Build Status](https://github.com/datainfrahq/druid-operator/actions/workflows/docker-image.yml/badge.svg) ![Docker pull](https://img.shields.io/docker/pulls/druidio/druid-operator.svg) [![Latest Version](https://img.shields.io/github/tag/druid-io/druid-operator)](https://github.com/druid-io/druid-operator/releases) - druid-operator provisions and manages [Apache Druid](https://druid.apache.org/) cluster on kubernetes. - druid-operator is designed to provision and manage [Apache Druid](https://druid.apache.org/) in distributed mode only. From 63e1ef6264e295816c96ac7dbba1c5e33e94a27d Mon Sep 17 00:00:00 2001 From: Jason Witkowski Date: Fri, 10 Feb 2023 14:34:04 -0500 Subject: [PATCH 18/18] feat: Move policy/v1beta1 to policy/v1 for K8s 1.25+ compatability --- Makefile | 2 +- README.md | 3 +- apis/druid/v1alpha1/druid_types.go | 4 +- apis/druid/v1alpha1/zz_generated.deepcopy.go | 4 +- controllers/druid/handler.go | 190 +++++++++++++++++- controllers/druid/handler_test.go | 4 +- .../broker-pod-disruption-budget.yaml | 2 +- 7 files changed, 196 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 69a67140..28670857 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ NAMESPACE_MINIO_OPERATOR ?= "minio-operator" NAMESPACE_DRUID ?= "druid" # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. -ENVTEST_K8S_VERSION = 1.24.2 +ENVTEST_K8S_VERSION = 1.25.0 # Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) ifeq (,$(shell go env GOBIN)) diff --git a/README.md b/README.md index a4a204aa..92eac69d 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,12 @@ - ```Druid``` CR belongs to api Group ```druid.apache.org``` and version ```v1alpha1``` ### Notifications -- Users may experience HPA issues with druid-operator with release 0.0.5, as described in the [issue]( https://github.com/druid-io/druid-operator/issues/160). +- Users may experience HPA issues with druid-operator with release 0.0.5, as described in the [issue]( https://github.com/druid-io/druid-operator/issues/160). - The latest release 0.0.6 has fixes for the above issue. - The operator has moved from HPA apiVersion autoscaling/v2beta1 to autoscaling/v2beta2 API users will need to update there HPA Specs according v2beta2 api in order to work with the latest druid-operator release. - Users may experience pvc deletion [issue](https://github.com/druid-io/druid-operator/issues/186) in release 0.0.6, this issue has been fixed in patch release 0.0.6.1. - druid-operator has moved Ingress apiVersion networking/v1beta1 to networking/v1. Users will need to update there Ingress Spec in the druid CR according networking/v1 syntax. In case users are using schema validated CRD, the CRD will also be needed to be updated. +- druid-operator has moved PodDisruptionBudget apiVersion policy/v1beta1 to policy/v1. Users will need to update there Kubernetes versions to 1.21+ to use druid-operator-0.0.10+. ### Note ApacheĀ®, [Apache Druid, DruidĀ®](https://druid.apache.org/) are either registered trademarks or trademarks of the Apache Software Foundation in the United States and/or other countries. This project, druid-operator, is not an Apache Software Foundation project. diff --git a/apis/druid/v1alpha1/druid_types.go b/apis/druid/v1alpha1/druid_types.go index 6adc5e4e..9d39315b 100644 --- a/apis/druid/v1alpha1/druid_types.go +++ b/apis/druid/v1alpha1/druid_types.go @@ -7,7 +7,7 @@ import ( autoscalev2beta2 "k8s.io/api/autoscaling/v2beta2" v1 "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" - "k8s.io/api/policy/v1beta1" + policyv1 "k8s.io/api/policy/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -208,7 +208,7 @@ type DruidNodeSpec struct { PodLabels map[string]string `json:"podLabels,omitempty"` // Optional - PodDisruptionBudgetSpec *v1beta1.PodDisruptionBudgetSpec `json:"podDisruptionBudgetSpec,omitempty"` + PodDisruptionBudgetSpec *policyv1.PodDisruptionBudgetSpec `json:"podDisruptionBudgetSpec,omitempty"` // Required RuntimeProperties string `json:"runtime.properties"` diff --git a/apis/druid/v1alpha1/zz_generated.deepcopy.go b/apis/druid/v1alpha1/zz_generated.deepcopy.go index 667ad696..d628c102 100644 --- a/apis/druid/v1alpha1/zz_generated.deepcopy.go +++ b/apis/druid/v1alpha1/zz_generated.deepcopy.go @@ -15,7 +15,7 @@ import ( "k8s.io/api/autoscaling/v2beta2" "k8s.io/api/core/v1" networkingv1 "k8s.io/api/networking/v1" - "k8s.io/api/policy/v1beta1" + policyv1 "k8s.io/api/policy/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -223,7 +223,7 @@ func (in *DruidNodeSpec) DeepCopyInto(out *DruidNodeSpec) { } if in.PodDisruptionBudgetSpec != nil { in, out := &in.PodDisruptionBudgetSpec, &out.PodDisruptionBudgetSpec - *out = new(v1beta1.PodDisruptionBudgetSpec) + *out = new(policyv1.PodDisruptionBudgetSpec) (*in).DeepCopyInto(*out) } if in.Services != nil { diff --git a/controllers/druid/handler.go b/controllers/druid/handler.go index 53a5e2d9..030a260d 100644 --- a/controllers/druid/handler.go +++ b/controllers/druid/handler.go @@ -17,6 +17,7 @@ import ( "github.com/druid-io/druid-operator/apis/druid/v1alpha1" appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" + policyv1 "k8s.io/api/policy/v1" "k8s.io/api/policy/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" @@ -346,7 +347,7 @@ func deployDruidCluster(sdk client.Client, m *v1alpha1.Druid, emitEvents EventEm updatedStatus.PodDisruptionBudgets = deleteUnusedResources(sdk, m, podDisruptionBudgetNames, ls, func() objectList { return &v1beta1.PodDisruptionBudgetList{} }, func(listObj runtime.Object) []object { - items := listObj.(*v1beta1.PodDisruptionBudgetList).Items + items := listObj.(*policyv1.PodDisruptionBudgetList).Items result := make([]object, len(items)) for i := 0; i < len(items); i++ { result[i] = &items[i] @@ -1366,13 +1367,13 @@ func updateDefaultPortInProbe(probe *v1.Probe, defaultPort int32) *v1.Probe { return probe } -func makePodDisruptionBudget(nodeSpec *v1alpha1.DruidNodeSpec, m *v1alpha1.Druid, ls map[string]string, nodeSpecUniqueStr string) (*v1beta1.PodDisruptionBudget, error) { +func makePodDisruptionBudget(nodeSpec *v1alpha1.DruidNodeSpec, m *v1alpha1.Druid, ls map[string]string, nodeSpecUniqueStr string) (*policyv1.PodDisruptionBudget, error) { pdbSpec := *nodeSpec.PodDisruptionBudgetSpec pdbSpec.Selector = &metav1.LabelSelector{MatchLabels: ls} - pdb := &v1beta1.PodDisruptionBudget{ + pdb := &policyv1.PodDisruptionBudget{ TypeMeta: metav1.TypeMeta{ - APIVersion: "policy/v1beta1", + APIVersion: "policy/v1", Kind: "PodDisruptionBudget", }, @@ -1502,6 +1503,187 @@ func asOwner(m *v1alpha1.Druid) metav1.OwnerReference { } } +// podList returns a v1.PodList object +func makePodList() *v1.PodList { + return &v1.PodList{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + } +} + +func makeDruidEmptyObj() *v1alpha1.Druid { + return &v1alpha1.Druid{ + TypeMeta: metav1.TypeMeta{ + Kind: "Druid", + APIVersion: "v1alpha1", + }, + } +} + +func makeStatefulSetListEmptyObj() *appsv1.StatefulSetList { + return &appsv1.StatefulSetList{ + TypeMeta: metav1.TypeMeta{ + Kind: "StatefulSet", + APIVersion: "apps/v1", + }, + } +} + +func makeDeloymentListEmptyObj() *appsv1.DeploymentList { + return &appsv1.DeploymentList{ + TypeMeta: metav1.TypeMeta{ + Kind: "Deployment", + APIVersion: "apps/v1", + }, + } +} + +func makePodDisruptionBudgetListEmptyObj() *policyv1.PodDisruptionBudgetList { + return &policyv1.PodDisruptionBudgetList{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "policy/v1", + Kind: "PodDisruptionBudget", + }, + } +} + +func makeHorizontalPodAutoscalerListEmptyObj() *autoscalev2beta2.HorizontalPodAutoscalerList { + return &autoscalev2beta2.HorizontalPodAutoscalerList{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "autoscaling/v2beta1", + Kind: "HorizontalPodAutoscaler", + }, + } +} + +func makeIngressListEmptyObj() *networkingv1.IngressList { + return &networkingv1.IngressList{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "networking.k8s.io/v1", + Kind: "Ingress", + }, + } +} + +func makeConfigMapListEmptyObj() *v1.ConfigMapList { + return &v1.ConfigMapList{ + TypeMeta: metav1.TypeMeta{ + Kind: "ConfigMap", + APIVersion: "v1", + }, + } +} + +func makeServiceListEmptyObj() *v1.ServiceList { + return &v1.ServiceList{ + TypeMeta: metav1.TypeMeta{ + Kind: "Service", + APIVersion: "v1", + }, + } +} + +func makePodEmptyObj() *v1.Pod { + return &v1.Pod{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Pod", + }, + } +} + +func makeStatefulSetEmptyObj() *appsv1.StatefulSet { + return &appsv1.StatefulSet{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "StatefulSet", + }, + } +} + +func makeDeploymentEmptyObj() *appsv1.Deployment { + return &appsv1.Deployment{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "apps/v1", + Kind: "Deployment", + }, + } +} + +func makePodDisruptionBudgetEmptyObj() *policyv1.PodDisruptionBudget { + return &policyv1.PodDisruptionBudget{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "policy/v1", + Kind: "PodDisruptionBudget", + }, + } +} + +func makeHorizontalPodAutoscalerEmptyObj() *autoscalev2beta2.HorizontalPodAutoscaler { + return &autoscalev2beta2.HorizontalPodAutoscaler{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "autoscaling/v2beta1", + Kind: "HorizontalPodAutoscaler", + }, + } +} + +func makePersistentVolumeClaimEmptyObj() *v1.PersistentVolumeClaim { + return &v1.PersistentVolumeClaim{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "PersistentVolumeClaim", + }, + } +} + +func makePersistentVolumeClaimListEmptyObj() *v1.PersistentVolumeClaimList { + return &v1.PersistentVolumeClaimList{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "PersistentVolumeClaim", + }, + } +} + +func makeIngressEmptyObj() *networkingv1.Ingress { + return &networkingv1.Ingress{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "networking.k8s.io/v1", + Kind: "Ingress", + }, + } +} + +func makeServiceEmptyObj() *v1.Service { + return &v1.Service{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "Service", + }, + } +} + +func makeStorageClassEmptyObj() *storage.StorageClass { + return &storage.StorageClass{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "storage.k8s.io/v1", + Kind: "StorageClass", + }, + } +} + +func makeConfigMapEmptyObj() *v1.ConfigMap { + return &v1.ConfigMap{ + TypeMeta: metav1.TypeMeta{ + APIVersion: "v1", + Kind: "ConfigMap", + }, + } +} + // getPodNames returns the pod names of the array of pods passed in func getPodNames(pods []object) []string { var podNames []string diff --git a/controllers/druid/handler_test.go b/controllers/druid/handler_test.go index 7774c8d7..ce51c75d 100644 --- a/controllers/druid/handler_test.go +++ b/controllers/druid/handler_test.go @@ -11,7 +11,7 @@ import ( "github.com/ghodss/yaml" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" - "k8s.io/api/policy/v1beta1" + policyv1 "k8s.io/api/policy/v1" ) func TestMakeStatefulSetForBroker(t *testing.T) { @@ -67,7 +67,7 @@ func TestMakePodDisruptionBudgetForBroker(t *testing.T) { actual, _ := makePodDisruptionBudget(&nodeSpec, clusterSpec, makeLabelsForNodeSpec(&nodeSpec, clusterSpec, clusterSpec.Name, nodeSpecUniqueStr), nodeSpecUniqueStr) addHashToObject(actual) - expected := new(v1beta1.PodDisruptionBudget) + expected := new(policyv1.PodDisruptionBudget) readAndUnmarshallResource("testdata/broker-pod-disruption-budget.yaml", &expected, t) assertEquals(expected, actual, t) diff --git a/controllers/druid/testdata/broker-pod-disruption-budget.yaml b/controllers/druid/testdata/broker-pod-disruption-budget.yaml index 9f2b1474..8d6ae8d6 100644 --- a/controllers/druid/testdata/broker-pod-disruption-budget.yaml +++ b/controllers/druid/testdata/broker-pod-disruption-budget.yaml @@ -1,4 +1,4 @@ -apiVersion: policy/v1beta1 +apiVersion: policy/v1 kind: PodDisruptionBudget metadata: labels: