diff --git a/src/test/java/com/navi/infra/portal/service/kubernetes/K8sResourceDeleterTest.java b/src/test/java/com/navi/infra/portal/service/kubernetes/K8sResourceDeleterTest.java index 0dc32ae9..a2519196 100644 --- a/src/test/java/com/navi/infra/portal/service/kubernetes/K8sResourceDeleterTest.java +++ b/src/test/java/com/navi/infra/portal/service/kubernetes/K8sResourceDeleterTest.java @@ -1,6 +1,7 @@ package com.navi.infra.portal.service.kubernetes; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -148,59 +149,4 @@ class K8sResourceDeleterTest { k8sResourceDeleter.deleteK8sObject(manifest, kubeObjectType, null, null, false); verify(flinkSessionJobOperator).delete(manifest); } - - @Test - void testDeleteK8sResourcesIfNeeded_DeploymentDeleted() { - when(oldManifest.hasDeployment()).thenReturn(true); - when(manifest.hasDeployment()).thenReturn(false); - k8sResourceDeleter.deleteK8sResourcesIfNeeded(manifest, oldManifest); - verify(deploymentOperator).delete(oldManifest); - } - - @Test - void testDeleteK8sResourcesIfNeeded_FlinkJobDeleted() { - when(oldManifest.getFlink()).thenReturn(new Flink()); - when(manifest.getFlink()).thenReturn(null); - k8sResourceDeleter.deleteK8sResourcesIfNeeded(manifest, oldManifest); - verify(flinkSessionJobOperator).delete(oldManifest); - } - - @Test - void testDeleteK8sResourcesIfNeeded_ServiceMonitorDeleted() { - Manifest mockManifest = mock(Manifest.class); - Manifest mockOldManifest = mock(Manifest.class); - Deployment mockDeployment = mock(Deployment.class); - - when(mockManifest.getDeployment()).thenReturn(mockDeployment); - when(mockOldManifest.hasServiceMonitor()).thenReturn(true); - when(mockManifest.hasServiceMonitor()).thenReturn(false); - when(mockDeployment.getLoadBalancers()).thenReturn( - Collections.emptyList()); - - k8sResourceDeleter.deleteK8sResourcesIfNeeded(mockManifest, mockOldManifest); - - verify(serviceMonitorOperator).delete(mockOldManifest); - } - - @Test - void testDeleteK8sResourcesIfNeeded_CommonApiGatewayRoutesDeleted() { - Manifest mockManifest = mock(Manifest.class); - Manifest mockOldManifest = mock(Manifest.class); - Deployment mockDeployment = mock(Deployment.class); - - when(mockManifest.getDeployment()).thenReturn(mockDeployment); - - when(mockManifest.getAllCommonApiGatewayRoutes()).thenReturn( - List.of(Map.of("pathName", "route1"))); - when(mockOldManifest.getAllCommonApiGatewayRoutes()).thenReturn( - List.of(Map.of("pathName", "route1"), Map.of("pathName", "route2")) - ); - - when(mockDeployment.getLoadBalancers()).thenReturn( - Collections.emptyList()); - - k8sResourceDeleter.deleteK8sResourcesIfNeeded(mockManifest, mockOldManifest); - - verify(commonApiGatewaysOperator).deleteRoute(mockOldManifest, "route2"); - } } diff --git a/test.json b/test.json new file mode 100644 index 00000000..5bf7a6c8 --- /dev/null +++ b/test.json @@ -0,0 +1,1069 @@ +[ + { + "metadata": { + "name": "spring-boot-demo-navi-service-secret", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "v1", + "data": {}, + "kind": "Secret", + "type": "Opaque" + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": { + "status": "active" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1", + "controller-tools.k8s.io": "1.0" + } + }, + "apiVersion": "autoscaling.alibabacloud.com/v1beta1", + "kind": "CronHorizontalPodAutoscaler", + "spec": { + "jobs": [ + { + "schedule": "58 17 * * *", + "targetSize": 2, + "name": "ScaleUp" + }, + { + "schedule": "d d d d d", + "targetSize": 2, + "name": "ScaleDown" + } + ], + "deploymentName": "spring-boot-demo-navi-service", + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "spring-boot-demo-navi-service" + } + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "autoscaling.k8s.io/v1", + "kind": "VerticalPodAutoscaler", + "spec": { + "targetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "spring-boot-demo-navi-service" + }, + "resourcePolicy": { + "containerPolicies": [ + { + "maxAllowed": { + "memory": "16Gi", + "cpu": "7200m" + }, + "containerName": "spring-boot-demo-navi-service", + "minAllowed": { + "memory": "1024Mi", + "cpu": "500m" + }, + "controlledResources": [ + "cpu", + "memory" + ] + }, + { + "mode": "Off", + "containerName": "*" + } + ] + } + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-external-pingpath", + "namespace": "dev", + "annotations": { + "konghq.com/plugins": "dev-spring-boot-demo-pingpath-ur,dev-spring-boot-demo-external-pingpath-ipr,dev-spring-boot-demo-external-pingpath-ea", + "external-dns.alpha.kubernetes.io/exclude": "true" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-pingpath", + "Name": "dev-spring-boot-demo-external-pingpath", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "spec": { + "ingressClassName": "kong-external", + "rules": [ + { + "host": "dev-external-gateway.np.navi-tech.in", + "http": { + "paths": [ + { + "path": "/ping/{id}", + "backend": { + "service": { + "port": { + "number": 8080 + }, + "name": "spring-boot-demo-navi-service" + } + }, + "pathType": "ImplementationSpecific" + } + ] + } + } + ] + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-external-servererror", + "namespace": "dev", + "annotations": { + "konghq.com/plugins": "dev-spring-boot-demo-servererror-ur", + "external-dns.alpha.kubernetes.io/exclude": "true" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-servererror", + "Name": "dev-spring-boot-demo-external-servererror", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "spec": { + "ingressClassName": "kong-external", + "rules": [ + { + "host": "dev-external-gateway.np.navi-tech.in", + "http": { + "paths": [ + { + "path": "/serverError/{temp}/test", + "backend": { + "service": { + "port": { + "number": 8080 + }, + "name": "spring-boot-demo-navi-service" + } + }, + "pathType": "ImplementationSpecific" + } + ] + } + } + ] + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-internal-pingpath", + "namespace": "dev", + "annotations": { + "konghq.com/plugins": "dev-spring-boot-demo-pingpath-ur", + "external-dns.alpha.kubernetes.io/exclude": "true" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-pingpath", + "Name": "dev-spring-boot-demo-internal-pingpath", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "spec": { + "ingressClassName": "kong-internal", + "rules": [ + { + "host": "dev-internal-gateway.np.navi-tech.in", + "http": { + "paths": [ + { + "path": "/ping/{id}", + "backend": { + "service": { + "port": { + "number": 8080 + }, + "name": "spring-boot-demo-navi-service" + } + }, + "pathType": "ImplementationSpecific" + } + ] + } + } + ] + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-internal-servererror", + "namespace": "dev", + "annotations": { + "konghq.com/plugins": "dev-spring-boot-demo-servererror-ur", + "external-dns.alpha.kubernetes.io/exclude": "true" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-servererror", + "Name": "dev-spring-boot-demo-internal-servererror", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "spec": { + "ingressClassName": "kong-internal", + "rules": [ + { + "host": "dev-internal-gateway.np.navi-tech.in", + "http": { + "paths": [ + { + "path": "/serverError/{temp}/test", + "backend": { + "service": { + "port": { + "number": 8080 + }, + "name": "spring-boot-demo-navi-service" + } + }, + "pathType": "ImplementationSpecific" + } + ] + } + } + ] + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-pingpath-ur", + "namespace": "dev", + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-pingpath", + "Name": "dev-spring-boot-demo-pingpath-ur", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "configuration.konghq.com/v1", + "plugin": "request-transformer", + "kind": "KongPlugin", + "config": { + "replace": { + "uri": "/ping" + } + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-servererror-ur", + "namespace": "dev", + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-servererror", + "Name": "dev-spring-boot-demo-servererror-ur", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "configuration.konghq.com/v1", + "plugin": "request-transformer", + "kind": "KongPlugin", + "config": { + "replace": { + "uri": "/serverError/{temp}" + } + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-external-pingpath-ipr", + "namespace": "dev", + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-pingpath", + "Name": "dev-spring-boot-demo-external-pingpath-ipr", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "configuration.konghq.com/v1", + "plugin": "ip-restriction", + "kind": "KongPlugin", + "config": { + "allow": [ + "103.215.237.13/32" + ] + } + }, + { + "metadata": { + "name": "dev-spring-boot-demo-external-pingpath-ea", + "namespace": "dev", + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "gateway-resource-identifier": "dev-spring-boot-demo-external-pingpath", + "Name": "dev-spring-boot-demo-external-pingpath-ea", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "configuration.konghq.com/v1", + "plugin": "external-auth", + "kind": "KongPlugin", + "config": { + "url": "dummyUrl" + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service-network-policy", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "cilium.io/v2", + "kind": "CiliumNetworkPolicy", + "spec": { + "endpointSelector": { + "matchLabels": { + "app": "navi-service", + "release": "spring-boot-demo" + } + }, + "egress": [ + { + "toPorts": [ + { + "rules": { + "dns": [ + { + "matchPattern": "*" + } + ] + }, + "ports": [ + { + "protocol": "ANY", + "port": "53" + } + ] + } + ] + }, + { + "toEndpoints": [ + { + "matchLabels": { + "app": "istiod", + "k8s:io.kubernetes.pod.namespace": "istio-system" + } + } + ] + }, + { + "toEndpoints": [ + { + "matchLabels": { + "k8s:io.kubernetes.pod.namespace": "apm", + "app.kubernetes.io/component": "opentelemetry-collector" + } + } + ] + } + ] + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": { + "alb.ingress.kubernetes.io/healthcheck-path": "/actuator/health", + "alb.ingress.kubernetes.io/tags": "Environment=dev,Owner=medici,Name=spring-boot-demo-navi-service,Team=Infra,Namespace=dev", + "alb.ingress.kubernetes.io/healthcheck-port": "4001" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "v1", + "kind": "Service", + "spec": { + "selector": { + "app": "navi-service", + "release": "spring-boot-demo" + }, + "ports": [ + { + "protocol": "TCP", + "port": 4001, + "name": "metrics", + "targetPort": 4001 + }, + { + "protocol": "TCP", + "port": 8080, + "name": "serviceport", + "targetPort": 8080 + } + ], + "type": "ClusterIP" + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "linkConfig": "false", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "apps/v1", + "kind": "Deployment", + "spec": { + "template": { + "metadata": { + "annotations": { + "instrumentation.opentelemetry.io/container-names": "spring-boot-demo-navi-service", + "sidecar.istio.io/inject": "false", + "instrumentation.opentelemetry.io/inject-java": "apm/instrumentation" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "spec": { + "terminationGracePeriodSeconds": 60, + "tolerations": [], + "dnsConfig": { + "options": [ + { + "name": "ndots", + "value": "2" + } + ] + }, + "volumes": [], + "containers": [ + { + "lifecycle": { + "preStop": { + "exec": { + "command": [ + "sleep", + "30" + ] + } + } + }, + "image": "193044292705.dkr.ecr.ap-south-1.amazonaws.com/medici/spring-boot-demo:v174e616b0eee46fa2181c08de0510fdda892d055", + "imagePullPolicy": "IfNotPresent", + "livenessProbe": { + "failureThreshold": 5, + "periodSeconds": 30, + "successThreshold": 1, + "initialDelaySeconds": 0, + "httpGet": { + "path": "/actuator/health", + "port": 4001, + "httpHeaders": [] + } + }, + "name": "spring-boot-demo-navi-service", + "readinessProbe": { + "failureThreshold": 5, + "periodSeconds": 30, + "tcpSocket": { + "port": 8080 + }, + "successThreshold": 1, + "initialDelaySeconds": 0 + }, + "resources": { + "requests": { + "memory": "1024Mi", + "cpu": 0.5 + }, + "limits": { + "memory": "1024Mi" + } + }, + "startupProbe": { + "failureThreshold": 30, + "periodSeconds": 10, + "successThreshold": 1, + "initialDelaySeconds": 0, + "httpGet": { + "path": "/actuator/health", + "port": 4001, + "httpHeaders": [] + } + }, + "env": [ + { + "name": "secretMd5", + "value": "fa9497f5acccafcc3e6019657bdc5eb1" + } + ], + "ports": [ + { + "protocol": "TCP", + "containerPort": 4001 + }, + { + "protocol": "TCP", + "containerPort": 8080 + } + ], + "envFrom": [ + { + "secretRef": { + "name": "spring-boot-demo-navi-service-secret" + } + } + ], + "volumeMounts": [] + } + ], + "nodeSelector": {} + } + }, + "selector": { + "matchLabels": { + "app": "navi-service", + "release": "spring-boot-demo" + } + }, + "strategy": { + "type": "RollingUpdate", + "rollingUpdate": { + "maxSurge": "51%", + "maxUnavailable": 0 + } + }, + "progressDeadlineSeconds": 720 + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service-sharedalb", + "namespace": "dev", + "annotations": { + "alb.ingress.kubernetes.io/group.order": "100", + "alb.ingress.kubernetes.io/target-type": "ip", + "alb.ingress.kubernetes.io/actions.ssl-redirect": "{\"Type\": \"redirect\", \"RedirectConfig\": { \"Protocol\": \"HTTPS\", \"Port\": \"443\", \"StatusCode\": \"HTTP_301\"}}", + "alb.ingress.kubernetes.io/group.name": "dev-internal", + "alb.ingress.kubernetes.io/target-group-attributes": "", + "alb.ingress.kubernetes.io/ssl-policy": "ELBSecurityPolicy-TLS-1-2-2017-01", + "alb.ingress.kubernetes.io/listen-ports": "[{ \"HTTPS\": 443 },{\"HTTP\": 80}]", + "alb.ingress.kubernetes.io/certificate-arn": "arn:aws:acm:ap-south-1:571315076762:certificate/a19c398a-639b-45ca-b885-4cf6002a16dc", + "kubernetes.io/ingress.class": "alb" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "networking.k8s.io/v1", + "kind": "Ingress", + "spec": { + "rules": [ + { + "host": "spring-boot-demo.np.navi-tech.in", + "http": { + "paths": [ + { + "path": "/*", + "backend": { + "service": { + "port": { + "name": "use-annotation" + }, + "name": "ssl-redirect" + } + }, + "pathType": "ImplementationSpecific" + }, + { + "backend": { + "service": { + "port": { + "number": 8080 + }, + "name": "spring-boot-demo-navi-service" + } + }, + "pathType": "ImplementationSpecific" + } + ] + } + } + ] + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service-pdb", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "policy/v1", + "kind": "PodDisruptionBudget", + "spec": { + "maxUnavailable": "15%", + "selector": { + "matchLabels": { + "app": "navi-service", + "release": "spring-boot-demo" + } + } + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service-monitor", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "monitoring.coreos.com/v1", + "kind": "ServiceMonitor", + "spec": { + "sampleLimit": 20000, + "endpoints": [ + { + "path": "/actuator/prometheus", + "scrapeTimeout": "10s", + "port": "serviceport", + "metricRelabelings": [], + "interval": "30s", + "honorLabels": false + } + ], + "namespaceSelector": { + "matchNames": [ + "dev" + ] + }, + "selector": { + "matchLabels": { + "app": "navi-service", + "release": "spring-boot-demo" + } + } + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": {}, + "labels": { + "app": "navi-service", + "Owner": "medici", + "role": "alert-rules", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "prometheus": "kube-prometheus", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "monitoring.coreos.com/v1", + "kind": "PrometheusRule", + "spec": { + "groups": [ + { + "name": "spring-boot-demo-navi-service-basic", + "rules": [ + { + "alert": "HighPodRestarts", + "annotations": { + "summary": "High Pod Restarts", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; Pod restarted multiple times", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=\"dev\", pod=~\"spring-boot-demo-navi-service.*\"}[30m])) by (reason, pod, namespace) > 3", + "labels": { + "severity": "critical", + "enrichment": "true", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "HighPodFailures", + "annotations": { + "summary": "High Pod Failures", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; Pods were last terminated due to reason {{ $labels.reason }}", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "sum(increase(kube_pod_container_status_last_terminated_reason{namespace=\"dev\", container=~\"spring-boot-demo-navi-service.*\",reason !~ \"Completed|Evicted|OOMKilled\"}[3h])) by (reason, pod, namespace) > 2", + "labels": { + "severity": "warning", + "enrichment": "true", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "FrequentPodOOMKilled", + "annotations": { + "summary": "High Pod Failures", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; Pod: {{ $labels.pod }} is restarting multiple times because of OOMKilled", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "increase(kube_pod_container_status_restarts_total{namespace=\"dev\", container=\"spring-boot-demo-navi-service\",pod=~\"spring-boot-demo-navi-service.*\"}[10m]) >= 2 AND ignoring(reason) kube_pod_container_status_last_terminated_reason{namespace=\"dev\", container=\"spring-boot-demo-navi-service\", reason=\"OOMKilled\"} > 0", + "labels": { + "severity": "critical", + "enrichment": "true", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "PodOOMKilled", + "annotations": { + "summary": "Pod OOMKilled", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; Pod: {{ $labels.pod }} killed because of OOMKilled", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "kube_pod_container_status_restarts_total{namespace=\"dev\", container=\"spring-boot-demo-navi-service\"} - kube_pod_container_status_restarts_total{namespace=\"dev\", container=\"spring-boot-demo-navi-service\"} offset 5m >= 1 AND ignoring(reason) kube_pod_container_status_last_terminated_reason{namespace=\"dev\", container=\"spring-boot-demo-navi-service\", reason=\"OOMKilled\"} > 0", + "labels": { + "severity": "warning", + "enrichment": "true", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "KubeContainerWaiting", + "for": "1h", + "annotations": { + "summary": "container is waiting for too long", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; container in waiting state for one hour", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "sum by (namespace, pod, container) (kube_pod_container_status_waiting_reason{container=\"spring-boot-demo-navi-service\", namespace=\"dev\"}) > 0", + "labels": { + "severity": "critical", + "enrichment": "true", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "ReplicaUnavailableAlert", + "for": "15m", + "annotations": { + "summary": "Low desired replica count", + "description": "Namespace: dev, AppName: spring-boot-demo-navi-service; Not enough instances available since past 15m", + "runbook": "https://navihq.atlassian.net/wiki/spaces/IN/pages/279937094/Act+On+Pod+Alert" + }, + "expr": "(kube_deployment_status_replicas_available{deployment=\"spring-boot-demo-navi-service\", namespace=\"dev\"}) - ignoring(poddisruptionbudget, deployment) (kube_poddisruptionbudget_status_desired_healthy{poddisruptionbudget=\"spring-boot-demo-navi-service-pdb\",namespace=\"dev\"}) < 0", + "labels": { + "severity": "critical", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + }, + { + "alert": "VPAUncappedTargetGreaterThanCappedTarget", + "for": "1m", + "annotations": { + "summary": "Uncapped target is more than bounds, this means your service is requires lot more resources than what node may have", + "description": "Uncapped target is more than bounds Namespace:dev; App:spring-boot-demo-navi-service; " + }, + "expr": "kube_verticalpodautoscaler_status_recommendation_containerrecommendations_uncappedtarget{container=\"spring-boot-demo-navi-service\"} / kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target{container=\"spring-boot-demo-navi-service\"} > 1", + "labels": { + "severity": "warning", + "appName": "spring-boot-demo-navi-service", + "namespace": "dev", + "alertTeam": "Infra" + } + } + ] + } + ] + } + }, + { + "metadata": { + "name": "spring-boot-demo-navi-service", + "namespace": "dev", + "annotations": { + "status": "inactive" + }, + "labels": { + "app": "navi-service", + "Owner": "medici", + "release": "spring-boot-demo", + "repo": "navi-medici_spring-boot-demo-service", + "Product": "lending", + "heritage": "NaviDeploymentManifest", + "language": "Java", + "Name": "spring-boot-demo", + "micrometer-prometheus": "disabled", + "serviceCriticality": "tier-1", + "Environment": "dev", + "Team": "Infra", + "chart": "navi-service-0.0.1" + } + }, + "apiVersion": "autoscaling/v2", + "kind": "HorizontalPodAutoscaler", + "spec": { + "maxReplicas": 2, + "minReplicas": 2, + "metrics": [], + "scaleTargetRef": { + "apiVersion": "apps/v1", + "kind": "Deployment", + "name": "disabled" + } + } + } +]