Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reconcile the pyrra generated prometheusrule crs with azure prometheusrulegroups resources #1110

Draft
wants to merge 31 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
c87a612
scaffold the project
monteiro-renato Nov 13, 2024
63151d5
generate the dist folder
monteiro-renato Nov 13, 2024
7728238
create the controller
monteiro-renato Nov 13, 2024
28396c7
update the rbac permissions
monteiro-renato Nov 13, 2024
10e8438
update Dockerfile to include the Azure tool
monteiro-renato Nov 13, 2024
f3f6f2d
update the README
monteiro-renato Nov 13, 2024
a1d5ee2
examples of input and output of the conversion tool
monteiro-renato Nov 13, 2024
13fea12
add npm and az-prom-rules-converter as dependencies
monteiro-renato Nov 13, 2024
fa10f01
include the PrometheusRule CRD
monteiro-renato Nov 13, 2024
afd7fd8
add an example .env file
monteiro-renato Nov 13, 2024
48db0e5
setup the controller dependencies
monteiro-renato Nov 13, 2024
e0cf42a
only resources in the monitoring namespace
monteiro-renato Nov 13, 2024
50b824f
include the PrometheusRule CRD in the test suite
monteiro-renato Nov 13, 2024
f138a09
add a file with test utils
monteiro-renato Nov 13, 2024
04aac84
first implementation
monteiro-renato Nov 13, 2024
da40ae5
k8s deployment configs
monteiro-renato Nov 13, 2024
bd48b3b
add a prefix to the rule names to make them unique in the centralized…
monteiro-renato Nov 18, 2024
0e3a647
kubebuilder edit --plugins=go/v4,helm/v1-alpha
monteiro-renato Nov 26, 2024
1a2baa2
helm template
monteiro-renato Nov 26, 2024
730858b
add .env to gitignore
monteiro-renato Nov 26, 2024
ff46f57
update values.yaml
monteiro-renato Nov 26, 2024
a1377b7
Remove Dockerfile.bak
monteiro-renato Nov 28, 2024
c0066c9
return error as nil when RequeueAfter is configured
monteiro-renato Nov 28, 2024
3227610
simplify if condition
monteiro-renato Nov 28, 2024
6a25df2
log errors as errors and not as info
monteiro-renato Nov 28, 2024
c325b96
simplify if else block
monteiro-renato Nov 28, 2024
257877f
rename variable to logger to avoid confusion with the package name
monteiro-renato Nov 28, 2024
fd2b33c
try to delete the rest of the resources even if one deletion fails
monteiro-renato Nov 28, 2024
ad2cf3c
return false as soon as the first missing annotation is seen
monteiro-renato Nov 28, 2024
d164a3b
point to Azure repo now that the PRs have been merged
monteiro-renato Dec 9, 2024
b83adad
add new line at the end of the file
monteiro-renato Dec 10, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "Kubebuilder DevContainer",
"image": "golang:1.22",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/git:1": {}
},

"runArgs": ["--network=host"],

"customizations": {
"vscode": {
"settings": {
"terminal.integrated.shell.linux": "/bin/bash"
},
"extensions": [
"ms-kubernetes-tools.vscode-kubernetes-tools",
"ms-azuretools.vscode-docker"
]
}
},

"onCreateCommand": "bash .devcontainer/post-install.sh"
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#!/bin/bash
set -x

curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind

curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/linux/amd64
chmod +x kubebuilder
mv kubebuilder /usr/local/bin/

KUBECTL_VERSION=$(curl -L -s https://dl.k8s.io/release/stable.txt)
curl -LO "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/amd64/kubectl"
chmod +x kubectl
mv kubectl /usr/local/bin/kubectl

docker network create -d=bridge --subnet=172.19.0.0/24 kind

kind version
kubebuilder version
docker --version
go version
kubectl version --client
3 changes: 3 additions & 0 deletions services/dis-promrulegroups-operator/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# More info: https://docs.docker.com/engine/reference/builder/#dockerignore-file
# Ignore build and test binaries.
bin/
16 changes: 16 additions & 0 deletions services/dis-promrulegroups-operator/.env_example
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# The azure subscription where the resources are located.
AZ_SUBSCRIPTION_ID=
# The resource group name which contains the resources managed by this controller.
AZ_RESOURCE_GROUP_NAME=
# The location of the resource group which contains the resources managed by this controller.
AZ_RESOURCE_GROUP_LOCATION=
# TODO: remove me. The action group needs to be decided based on user config. TBD how (maybe an extra label on the CR)
AZ_ACTION_GROUP_ID=
# The azure monitor workspace that will be associated with the PrometheusRuleGroups
AZ_AZURE_MONITOR_WORKSPACE=
# # The 'clusterName' property must match the cluster label that is added to the metrics when scraped from a specific cluster. By default, this label is set to the last part (resource name) of the cluster ID.
AZ_CLUSTER_NAME=
# Path to node executable
NODE_PATH=
# Path to az-prom-rules-converter tool
AZ_PROM_RULES_CONVERTER_PATH=
23 changes: 23 additions & 0 deletions services/dis-promrulegroups-operator/.github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Lint

on:
push:
pull_request:

jobs:
lint:
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '~1.22'

- name: Run linter
uses: golangci/golangci-lint-action@v6
with:
version: v1.59
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Test Chart

on:
push:
pull_request:

jobs:
test-e2e:
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version-file: go.mod

- name: Install the latest version of kind
run: |
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

- name: Verify kind installation
run: kind version

- name: Create kind cluster
run: kind create cluster

- name: Prepare dis-promrulegroups-operator
run: |
go mod tidy
make docker-build IMG=dis-promrulegroups-operator:v0.1.0
kind load docker-image dis-promrulegroups-operator:v0.1.0

- name: Install Helm
run: |
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

- name: Verify Helm installation
run: helm version

- name: Lint Helm Chart
run: |
helm lint ./dist/chart

# TODO: Uncomment if cert-manager is enabled
# - name: Install cert-manager via Helm
# run: |
# helm repo add jetstack https://charts.jetstack.io
# helm repo update
# helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --set installCRDs=true
#
# - name: Wait for cert-manager to be ready
# run: |
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-cainjector
# kubectl wait --namespace cert-manager --for=condition=available --timeout=300s deployment/cert-manager-webhook

# TODO: Uncomment if Prometheus is enabled
# - name: Install Prometheus Operator CRDs
# run: |
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update
# helm install prometheus-crds prometheus-community/prometheus-operator-crds
#
# - name: Install Prometheus via Helm
# run: |
# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# helm repo update
# helm install prometheus prometheus-community/prometheus --namespace monitoring --create-namespace
#
# - name: Wait for Prometheus to be ready
# run: |
# kubectl wait --namespace monitoring --for=condition=available --timeout=300s deployment/prometheus-server

- name: Install Helm chart for project
run: |
helm install my-release ./dist/chart --create-namespace --namespace dis-promrulegroups-operator-system

- name: Check Helm release status
run: |
helm status my-release --namespace dis-promrulegroups-operator-system

# TODO: Uncomment if prometheus.enabled is set to true to confirm that the ServiceMonitor gets created
# - name: Check Presence of ServiceMonitor
# run: |
# kubectl wait --namespace dis-promrulegroups-operator-system --for=jsonpath='{.kind}'=ServiceMonitor servicemonitor/dis-promrulegroups-operator-controller-manager-metrics-monitor
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: E2E Tests

on:
push:
pull_request:

jobs:
test-e2e:
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '~1.22'

- name: Install the latest version of kind
run: |
curl -Lo ./kind https://kind.sigs.k8s.io/dl/latest/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

- name: Verify kind installation
run: kind version

- name: Create kind cluster
run: kind create cluster

- name: Running Test e2e
run: |
go mod tidy
make test-e2e
23 changes: 23 additions & 0 deletions services/dis-promrulegroups-operator/.github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Tests

on:
push:
pull_request:

jobs:
test:
name: Run on Ubuntu
runs-on: ubuntu-latest
steps:
- name: Clone the code
uses: actions/checkout@v4

- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: '~1.22'

- name: Running Tests
run: |
go mod tidy
make test
30 changes: 30 additions & 0 deletions services/dis-promrulegroups-operator/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/*
Dockerfile.cross

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Go workspace file
go.work

# Kubernetes Generated files - skip generated files, except for vendored files
!vendor/**/zz_generated.*

# editor and IDE paraphernalia
.idea
.vscode
*.swp
*.swo
*~

# Ignore .env
.env
47 changes: 47 additions & 0 deletions services/dis-promrulegroups-operator/.golangci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
run:
timeout: 5m
allow-parallel-runners: true

issues:
# don't skip warning about doc comments
# don't exclude the default set of lint
exclude-use-default: false
# restore some of the defaults
# (fill in the rest as needed)
exclude-rules:
- path: "api/*"
linters:
- lll
- path: "internal/*"
linters:
- dupl
- lll
linters:
disable-all: true
enable:
- dupl
- errcheck
- exportloopref
- ginkgolinter
- goconst
- gocyclo
- gofmt
- goimports
- gosimple
- govet
- ineffassign
- lll
- misspell
- nakedret
- prealloc
- revive
- staticcheck
- typecheck
- unconvert
- unparam
- unused

linters-settings:
revive:
rules:
- name: comment-spacings
41 changes: 41 additions & 0 deletions services/dis-promrulegroups-operator/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Build the manager binary
FROM golang:1.23 AS builder1
ARG TARGETOS
ARG TARGETARCH

WORKDIR /workspace
# Copy the Go Modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
RUN go mod download

# Copy the go source
COPY cmd/main.go cmd/main.go
COPY internal/ internal/

# Build
# the GOARCH has not a default value to allow the binary be built according to the host where the command
# was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO
# the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore,
# by leaving it empty we can ensure that the container and binary shipped on it will have the same platform.
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager cmd/main.go


FROM node:20 AS builder2
WORKDIR /tool
RUN npm i --omit=dev https://gitpkg.now.sh/Azure/prometheus-collector/tools/az-prom-rules-converter?main


# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
FROM gcr.io/distroless/nodejs22-debian12:nonroot
WORKDIR /
COPY --from=builder1 /workspace/manager .
COPY --from=builder2 /tool /tool/.
ENV PATH="$PATH:nodejs/bin/"
ENV ENVIRONMENT="prod"
USER 65532:65532

ENTRYPOINT ["/manager"]
Loading
Loading