diff --git a/.github/workflows/cd-pipeline.yml b/.github/workflows/cd-pipeline.yml index bf018d6bd..b550c9455 100644 --- a/.github/workflows/cd-pipeline.yml +++ b/.github/workflows/cd-pipeline.yml @@ -38,6 +38,7 @@ on: # rebuild any PRs and main branch changes - 'bitnami/keycloak/**' - 'bitnami/kibana/**' - 'bitnami/kong/**' + - 'bitnami/kube-prometheus/**' - 'bitnami/kubernetes-event-exporter/**' - 'bitnami/logstash/**' - 'bitnami/magento/**' diff --git a/.vib/kube-prometheus/cypress/cypress.env.json b/.vib/kube-prometheus/cypress/cypress.env.json new file mode 100644 index 000000000..782520cc5 --- /dev/null +++ b/.vib/kube-prometheus/cypress/cypress.env.json @@ -0,0 +1,41 @@ +{ + "deployments": { + "alertmanager": { + "query": "alertmanager_alerts" + }, + "kube-state-metrics": { + "query": "kube_deployment_created" + }, + "node-exporter": { + "query": "node_boot_time_seconds" + }, + "prometheus": { + "query": "prometheus_http_requests_total" + }, + "prometheus-operator": { + "query": "prometheus_operator_spec_replicas" + } + }, + "monitors": { + "kubelet": { + "query": "kubelet_node_name" + }, + "apiserver": { + "query": "apiserver_storage_objects" + } + }, + "targets": { + "alertmanager": { + "replicaCount": 2 + }, + "kube-state-metrics": { + "replicaCount": 1 + }, + "operator": { + "replicaCount": 1 + }, + "prometheus-prometheus": { + "replicaCount": 2 + } + } +} diff --git a/.vib/kube-prometheus/cypress/cypress.json b/.vib/kube-prometheus/cypress/cypress.json new file mode 100644 index 000000000..a1ed6a334 --- /dev/null +++ b/.vib/kube-prometheus/cypress/cypress.json @@ -0,0 +1,4 @@ +{ + "baseUrl": "http://localhost", + "defaultCommandTimeout": 30000 +} diff --git a/.vib/kube-prometheus/cypress/cypress/integration/kube_prometheus_spec.js b/.vib/kube-prometheus/cypress/cypress/integration/kube_prometheus_spec.js new file mode 100644 index 000000000..356edf164 --- /dev/null +++ b/.vib/kube-prometheus/cypress/cypress/integration/kube_prometheus_spec.js @@ -0,0 +1,38 @@ +/// + +it('allows executing a query and displaying response data for each deployment', () => { + const deployments = Cypress.env('deployments'); + + cy.visit(`/graph`); + Object.keys(deployments).forEach((podName, i) => { + const query = Object.values(deployments)[i].query; + + cy.get('[role="textbox"]').clear().type(query); + cy.contains('Execute').click({force: true}); + cy.contains('.data-table', `container="${podName}"`) + }) +}); + +it('allows executing a query and displaying response data for each service monitor', () => { + const monitors = Cypress.env('monitors'); + + cy.visit(`/graph`); + Object.keys(monitors).forEach((jobName, i) => { + const query = Object.values(monitors)[i].query; + + cy.get('[role="textbox"]').clear().type(query); + cy.contains('Execute').click(); + cy.contains('.data-table', `job="${jobName}"`) + }) +}); + +it('checks targets status', () => { + const targets = Cypress.env('targets'); + + Object.keys(targets).forEach((podName, i) => { + const podData = Object.values(targets)[i]; + + cy.visit(`/targets?search=${podName}`); + cy.contains(`${podData.replicaCount}/${podData.replicaCount} up`); + }) +}); diff --git a/.vib/kube-prometheus/goss/goss.yaml b/.vib/kube-prometheus/goss/goss.yaml new file mode 100644 index 000000000..7233f6d32 --- /dev/null +++ b/.vib/kube-prometheus/goss/goss.yaml @@ -0,0 +1,21 @@ +file: + /var/run/secrets/kubernetes.io/serviceaccount: + exists: {{ .Vars.operator.serviceAccount.automountServiceAccountToken }} + filetype: directory + mode: "3777" +command: + check-no-capabilities: + exec: cat /proc/1/status + exit-status: 0 + stdout: + - "CapInh: 0000000000000000" + - "CapPrm: 0000000000000000" + - "CapEff: 0000000000000000" + - "CapBnd: 0000000000000000" + - "CapAmb: 0000000000000000" + check-user-info: + exec: id + exit-status: 0 + stdout: + - uid={{ .Vars.operator.podSecurityContext.runAsUser }} + - /groups=.*{{ .Vars.operator.podSecurityContext.fsGroup }}/ diff --git a/.vib/kube-prometheus/goss/vars.yaml b/.vib/kube-prometheus/goss/vars.yaml new file mode 100644 index 000000000..961bc5963 --- /dev/null +++ b/.vib/kube-prometheus/goss/vars.yaml @@ -0,0 +1,6 @@ +operator: + serviceAccount: + automountServiceAccountToken: true + podSecurityContext: + runAsUser: 1002 + fsGroup: 1002 diff --git a/.vib/kube-prometheus/vib-action.config b/.vib/kube-prometheus/vib-action.config new file mode 100644 index 000000000..36a99dc6a --- /dev/null +++ b/.vib/kube-prometheus/vib-action.config @@ -0,0 +1 @@ +verification-mode=SERIAL diff --git a/.vib/kube-prometheus/vib-publish.json b/.vib/kube-prometheus/vib-publish.json index 35ab2b45a..0ff715b70 100644 --- a/.vib/kube-prometheus/vib-publish.json +++ b/.vib/kube-prometheus/vib-publish.json @@ -22,7 +22,7 @@ "url": "{SHA_ARCHIVE}", "path": "/bitnami/kube-prometheus" }, - "runtime_parameters": "Im9wZXJhdG9yIjoKICAiY3VzdG9tUmVzb3VyY2VEZWxldGVQb2xpY3kiOiAiYmVmb3JlLWhvb2stY3JlYXRpb24iCiJwcm9tZXRoZXVzIjoKICAic2VydmljZSI6CiAgICAidHlwZSI6ICJMb2FkQmFsYW5jZXIiCiAgICAicG9ydHMiOiAKICAgICAgImh0dHAiOiA4MAo=", + "runtime_parameters": "b3BlcmF0b3I6CiAgZW5hYmxlZDogdHJ1ZQogIHNlcnZpY2VBY2NvdW50OgogICAgY3JlYXRlOiB0cnVlCiAgICBhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuOiB0cnVlCiAgcG9kU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgY2FwYWJpbGl0aWVzOgogICAgICBkcm9wOgogICAgICAtIEFMTAogICAgcnVuQXNOb25Sb290OiB0cnVlCiAgICByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBmYWxzZQogIHNlcnZpY2VNb25pdG9yOgogICAgZW5hYmxlZDogdHJ1ZQogIGt1YmVsZXRTZXJ2aWNlOgogICAgZW5hYmxlZDogdHJ1ZQogIHNlcnZpY2U6CiAgICBwb3J0czoKICAgICAgaHR0cDogODA4MQpwcm9tZXRoZXVzOgogIGVuYWJsZWQ6IHRydWUKICByZXBsaWNhQ291bnQ6IDIKICBzZXJ2aWNlTW9uaXRvcjoKICAgIGVuYWJsZWQ6IHRydWUKICBzZXJ2aWNlOgogICAgdHlwZTogTG9hZEJhbGFuY2VyCiAgICBwb3J0czogCiAgICAgIGh0dHA6IDgwCmFsZXJ0bWFuYWdlcjoKICBlbmFibGVkOiB0cnVlCiAgcmVwbGljYUNvdW50OiAyCiAgc2VydmljZU1vbml0b3I6CiAgICBlbmFibGVkOiB0cnVlCiAgc2VydmljZToKICAgIHBvcnRzOgogICAgICBodHRwOiA5MDk0Cm5vZGUtZXhwb3J0ZXI6CiAgc2VydmljZU1vbml0b3I6CiAgICBlbmFibGVkOiB0cnVlCmt1YmUtc3RhdGUtbWV0cmljczoKICByZXBsaWNhQ291bnQ6IDEKICBzZXJ2aWNlTW9uaXRvcjoKICAgIGVuYWJsZWQ6IHRydWUKZXhwb3J0ZXJzOgogIG5vZGUtZXhwb3J0ZXI6CiAgICBlbmFibGVkOiB0cnVlCiAga3ViZS1zdGF0ZS1tZXRyaWNzOgogICAgZW5hYmxlZDogdHJ1ZQprdWJlbGV0OgogIGVuYWJsZWQ6IHRydWUKa3ViZUFwaVNlcnZlcjoKICBlbmFibGVkOiB0cnVlCmt1YmVDb250cm9sbGVyTWFuYWdlcjoKICBlbmFibGVkOiB0cnVlCmt1YmVTY2hlZHVsZXI6CiAgZW5hYmxlZDogdHJ1ZQpjb3JlRG5zOgogIGVuYWJsZWQ6IHRydWUKa3ViZVByb3h5OgogIGVuYWJsZWQ6IHRydWUKcmJhYzoKICBjcmVhdGU6IHRydWUKICBwc3BFbmFibGVkOiB0cnVl", "target_platform": { "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}", "size": { @@ -37,6 +37,28 @@ "endpoint": "lb-kube-prometheus-prometheus-http", "app_protocol": "HTTP" } + }, + { + "action_id": "cypress", + "params": { + "resources": { + "path": "/.vib/kube-prometheus/cypress" + }, + "endpoint": "lb-kube-prometheus-prometheus-http", + "app_protocol": "HTTP" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/kube-prometheus/goss" + }, + "remote": { + "workload": "deploy-kube-prometheus-operator" + }, + "vars_file": "vars.yaml" + } } ] }, diff --git a/.vib/kube-prometheus/vib-verify.json b/.vib/kube-prometheus/vib-verify.json index f45a89c45..fa594e029 100644 --- a/.vib/kube-prometheus/vib-verify.json +++ b/.vib/kube-prometheus/vib-verify.json @@ -22,7 +22,7 @@ "url": "{SHA_ARCHIVE}", "path": "/bitnami/kube-prometheus" }, - "runtime_parameters": "Im9wZXJhdG9yIjoKICAiY3VzdG9tUmVzb3VyY2VEZWxldGVQb2xpY3kiOiAiYmVmb3JlLWhvb2stY3JlYXRpb24iCiJwcm9tZXRoZXVzIjoKICAic2VydmljZSI6CiAgICAidHlwZSI6ICJMb2FkQmFsYW5jZXIiCiAgICAicG9ydHMiOiAKICAgICAgImh0dHAiOiA4MAo=", + "runtime_parameters": "b3BlcmF0b3I6CiAgZW5hYmxlZDogdHJ1ZQogIHNlcnZpY2VBY2NvdW50OgogICAgY3JlYXRlOiB0cnVlCiAgICBhdXRvbW91bnRTZXJ2aWNlQWNjb3VudFRva2VuOiB0cnVlCiAgcG9kU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgcnVuQXNVc2VyOiAxMDAyCiAgICBmc0dyb3VwOiAxMDAyCiAgY29udGFpbmVyU2VjdXJpdHlDb250ZXh0OgogICAgZW5hYmxlZDogdHJ1ZQogICAgY2FwYWJpbGl0aWVzOgogICAgICBkcm9wOgogICAgICAtIEFMTAogICAgcnVuQXNOb25Sb290OiB0cnVlCiAgICByZWFkT25seVJvb3RGaWxlc3lzdGVtOiBmYWxzZQogIHNlcnZpY2VNb25pdG9yOgogICAgZW5hYmxlZDogdHJ1ZQogIGt1YmVsZXRTZXJ2aWNlOgogICAgZW5hYmxlZDogdHJ1ZQogIHNlcnZpY2U6CiAgICBwb3J0czoKICAgICAgaHR0cDogODA4MQpwcm9tZXRoZXVzOgogIGVuYWJsZWQ6IHRydWUKICByZXBsaWNhQ291bnQ6IDIKICBzZXJ2aWNlTW9uaXRvcjoKICAgIGVuYWJsZWQ6IHRydWUKICBzZXJ2aWNlOgogICAgdHlwZTogTG9hZEJhbGFuY2VyCiAgICBwb3J0czogCiAgICAgIGh0dHA6IDgwCmFsZXJ0bWFuYWdlcjoKICBlbmFibGVkOiB0cnVlCiAgcmVwbGljYUNvdW50OiAyCiAgc2VydmljZU1vbml0b3I6CiAgICBlbmFibGVkOiB0cnVlCiAgc2VydmljZToKICAgIHBvcnRzOgogICAgICBodHRwOiA5MDk0Cm5vZGUtZXhwb3J0ZXI6CiAgc2VydmljZU1vbml0b3I6CiAgICBlbmFibGVkOiB0cnVlCmt1YmUtc3RhdGUtbWV0cmljczoKICByZXBsaWNhQ291bnQ6IDEKICBzZXJ2aWNlTW9uaXRvcjoKICAgIGVuYWJsZWQ6IHRydWUKZXhwb3J0ZXJzOgogIG5vZGUtZXhwb3J0ZXI6CiAgICBlbmFibGVkOiB0cnVlCiAga3ViZS1zdGF0ZS1tZXRyaWNzOgogICAgZW5hYmxlZDogdHJ1ZQprdWJlbGV0OgogIGVuYWJsZWQ6IHRydWUKa3ViZUFwaVNlcnZlcjoKICBlbmFibGVkOiB0cnVlCmt1YmVDb250cm9sbGVyTWFuYWdlcjoKICBlbmFibGVkOiB0cnVlCmt1YmVTY2hlZHVsZXI6CiAgZW5hYmxlZDogdHJ1ZQpjb3JlRG5zOgogIGVuYWJsZWQ6IHRydWUKa3ViZVByb3h5OgogIGVuYWJsZWQ6IHRydWUKcmJhYzoKICBjcmVhdGU6IHRydWUKICBwc3BFbmFibGVkOiB0cnVl", "target_platform": { "target_platform_id": "{VIB_ENV_TARGET_PLATFORM}", "size": { @@ -37,6 +37,28 @@ "endpoint": "lb-kube-prometheus-prometheus-http", "app_protocol": "HTTP" } + }, + { + "action_id": "cypress", + "params": { + "resources": { + "path": "/.vib/kube-prometheus/cypress" + }, + "endpoint": "lb-kube-prometheus-prometheus-http", + "app_protocol": "HTTP" + } + }, + { + "action_id": "goss", + "params": { + "resources": { + "path": "/.vib/kube-prometheus/goss" + }, + "remote": { + "workload": "deploy-kube-prometheus-operator" + }, + "vars_file": "vars.yaml" + } } ] }