From 66781fe79399da176a3bbc87dcf071dbfa709390 Mon Sep 17 00:00:00 2001 From: Vaibhav Pathak Date: Thu, 29 Jan 2026 11:03:35 +0530 Subject: [PATCH] catlog and helm added --- catalog-info.yaml | 128 +++++++++++++++++ docs/api-reference.md | 109 ++++++++++++++ docs/configuration.md | 81 +++++++++++ docs/deployment.md | 75 ++++++++++ docs/getting-started.md | 63 ++++++++ docs/index.md | 48 +++++++ helm/schedulerservice/Chart.lock | 6 + helm/schedulerservice/Chart.yaml | 23 +++ helm/schedulerservice/charts/mysql-1.6.9.tgz | Bin 0 -> 11568 bytes helm/schedulerservice/templates/NOTES.txt | 18 +++ helm/schedulerservice/templates/_helpers.tpl | 63 ++++++++ .../schedulerservice/templates/configmap.yaml | 13 ++ .../templates/deployment.yaml | 83 +++++++++++ helm/schedulerservice/templates/hpa.yaml | 32 +++++ helm/schedulerservice/templates/ingress.yaml | 41 ++++++ helm/schedulerservice/templates/pdb.yaml | 18 +++ helm/schedulerservice/templates/service.yaml | 19 +++ .../templates/serviceaccount.yaml | 12 ++ helm/schedulerservice/values-local.yaml | 128 +++++++++++++++++ helm/schedulerservice/values.yaml | 135 ++++++++++++++++++ mkdocs.yml | 22 +++ 21 files changed, 1117 insertions(+) create mode 100644 catalog-info.yaml create mode 100644 docs/api-reference.md create mode 100644 docs/configuration.md create mode 100644 docs/deployment.md create mode 100644 docs/getting-started.md create mode 100644 docs/index.md create mode 100644 helm/schedulerservice/Chart.lock create mode 100644 helm/schedulerservice/Chart.yaml create mode 100644 helm/schedulerservice/charts/mysql-1.6.9.tgz create mode 100644 helm/schedulerservice/templates/NOTES.txt create mode 100644 helm/schedulerservice/templates/_helpers.tpl create mode 100644 helm/schedulerservice/templates/configmap.yaml create mode 100644 helm/schedulerservice/templates/deployment.yaml create mode 100644 helm/schedulerservice/templates/hpa.yaml create mode 100644 helm/schedulerservice/templates/ingress.yaml create mode 100644 helm/schedulerservice/templates/pdb.yaml create mode 100644 helm/schedulerservice/templates/service.yaml create mode 100644 helm/schedulerservice/templates/serviceaccount.yaml create mode 100644 helm/schedulerservice/values-local.yaml create mode 100644 helm/schedulerservice/values.yaml create mode 100644 mkdocs.yml diff --git a/catalog-info.yaml b/catalog-info.yaml new file mode 100644 index 0000000..3507cac --- /dev/null +++ b/catalog-info.yaml @@ -0,0 +1,128 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: schedulerservice + title: Scheduler Service + description: Job scheduling and execution service for managing scheduled tasks and job triggers + annotations: + backstage.io/kubernetes-id: "schedulerservice" + backstage.io/techdocs-ref: dir:. + github.com/project-slug: "onlinesales-ai/schedulerService" + argocd/app-selector: backstage.io/kubernetes-id=schedulerservice + argo-workflows.cnoe.io/label-selector: "service=schedulerservice" + helm.cnoe.io/git-repo: "https://gitea.os-tf-qa.onlinesales.ai/gitea_admin/schedulerService-chart.git" + helm.cnoe.io/git-ref: "main" + helm.cnoe.io/chart-path: "helm/schedulerservice" + helm.cnoe.io/values-file: "values-local.yaml" + helm.cnoe.io/available-values-files: '["values.yaml", "values-local.yaml"]' + helm.cnoe.io/dependencies: '{"mysql":{"namespace":"{namespace}","release":"schedulerservice-mysql","chart":"wso2/mysql","version":"1.6.9","parameters":{"mysqlDatabase":"os_scheduling_db"}}}' + helm.cnoe.io/dependency-urls: '{}' + tags: + - java + - kubernetes + - scheduler + - tomcat + links: + - url: https://github.com/onlinesales-ai/schedulerService + title: GitHub Repository + icon: github +spec: + type: service + lifecycle: production + owner: group:infrastructure + system: job-management + providesApis: + - schedulerservice-api + dependsOn: + - resource:schedulerservice-db +--- +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + name: schedulerservice-api + title: Scheduler Service API + description: REST API for job scheduling and management +spec: + type: openapi + lifecycle: production + owner: group:infrastructure + system: job-management + definition: | + openapi: 3.0.0 + info: + title: Scheduler Service API + version: 1.0.0 + description: Job scheduling and execution service API + servers: + - url: http://schedulerservice.cnoe.localtest.me/schedulerService + description: Local development + paths: + /job: + post: + summary: Create a new job + responses: + '200': + description: Job created successfully + /jobTrigger: + get: + summary: Get job trigger status / Health check + parameters: + - name: jsonQuery + in: query + required: true + schema: + type: string + responses: + '200': + description: Job trigger status + post: + summary: Trigger job execution + responses: + '200': + description: Job triggered + /schedules: + get: + summary: List schedules + responses: + '200': + description: List of schedules + post: + summary: Create schedule + responses: + '200': + description: Schedule created + /group: + get: + summary: List groups + responses: + '200': + description: List of groups + /jobStat: + get: + summary: Get job statistics + responses: + '200': + description: Job statistics + /jobDetail: + get: + summary: Get job details + responses: + '200': + description: Job details + /cluster: + get: + summary: Get cluster information + responses: + '200': + description: Cluster info +--- +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: schedulerservice-db + title: Scheduler Service Database + description: MySQL database for scheduler service +spec: + type: database + owner: group:infrastructure + system: job-management diff --git a/docs/api-reference.md b/docs/api-reference.md new file mode 100644 index 0000000..26d3e02 --- /dev/null +++ b/docs/api-reference.md @@ -0,0 +1,109 @@ +# API Reference + +## Base URL + +- **Local**: `http://schedulerservice.cnoe.localtest.me/schedulerService/` +- **Production**: `http://schedulerservice.{namespace}.svc.cluster.local/schedulerService/` + +## Health Check + +### GET /schedulerService/jobTrigger + +Returns the health status of the service. + +**Request:** +``` +GET /schedulerService/jobTrigger?jsonQuery={"application":"nagios","jobName":"monitoring_scheduler_svc"} +``` + +**URL Encoded:** +``` +GET /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D +``` + +**Response (200 OK):** +```json +{ + "status": "success" +} +``` + +## Endpoints + +### Job Management + +#### POST /schedulerService/job + +Create a new job. + +**Request Body:** +```json +{ + "jobName": "my-job", + "application": "my-app", + "command": "echo hello", + "preemption": false +} +``` + +### Schedule Management + +#### GET /schedulerService/schedules + +List all schedules. + +#### POST /schedulerService/schedules + +Create a new schedule. + +#### PUT /schedulerService/schedules + +Update an existing schedule. + +#### DELETE /schedulerService/schedules + +Delete a schedule. + +### Job Trigger + +#### GET /schedulerService/jobTrigger + +Get job trigger status. + +#### POST /schedulerService/jobTrigger + +Trigger a job execution. + +### Statistics + +#### GET /schedulerService/jobStat + +Get job statistics. + +### Job Details + +#### GET /schedulerService/jobDetail + +Get detailed information about a job. + +### Group Management + +#### GET /schedulerService/group + +List groups. + +#### POST /schedulerService/group + +Create a group. + +### Cluster Information + +#### GET /schedulerService/cluster + +Get cluster information. + +### Command Prefix Mapping + +#### GET /schedulerService/commandPrefixImageMapping + +Get command prefix to container image mappings. diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..90f13a2 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,81 @@ +# Configuration + +## Environment Variables + +| Variable | Description | Default | +|----------|-------------|---------| +| `APP_ENV` | Application environment | `local` | +| `LOG_LEVEL` | Logging level | `INFO` | + +## Configuration Files + +Configuration files are mounted at `/etc/onlinesales/config/schedulerService/`. + +### schedulerService.cfg + +Main service configuration file. + +``` +LOG_CONFIG_FILE=/etc/onlinesales/config/schedulerService/log.cfg +DB_CONFIG_FILE=/etc/onlinesales/config/schedulerService/hibernate.cfg.xml +``` + +### authConfig.cfg + +Authentication configuration for ACL. + +```json +{ + "authEnable": false, + "authServiceUrl": "http://hades-service/hades/authorize" +} +``` + +### hibernate.cfg.xml + +Database connection configuration (injected via secrets). + +```xml + + + + + + com.mysql.cj.jdbc.Driver + jdbc:mysql://HOST:PORT/os_scheduling_db + USERNAME + PASSWORD + org.hibernate.dialect.MySQL5Dialect + + +``` + +## Helm Values + +### Production (values.yaml) + +- Replicas: 2 +- Resource limits enabled +- Autoscaling enabled +- PDB enabled +- MySQL subchart disabled (external DB) + +### Local (values-local.yaml) + +- Replicas: 1 +- No resource limits +- Autoscaling disabled +- Ingress enabled for local access +- MySQL subchart enabled + +## Database Configuration + +| Parameter | Production | Local | +|-----------|-----------|-------| +| Host | External MySQL | `schedulerservice-mysql` | +| Port | 3306 | 3306 | +| Database | `os_scheduling_db` | `os_scheduling_db` | +| User | (from secret) | `scheduler_user` | +| Password | (from secret) | `localpassword` | diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 0000000..7708841 --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,75 @@ +# Deployment + +## Helm Chart + +The service is deployed using Helm charts located in `helm/schedulerservice/`. + +## Values Files + +| File | Purpose | +|------|---------| +| `values.yaml` | Production/default configuration | +| `values-local.yaml` | Local Kind cluster development | + +## Backstage Integration + +This service is registered in Backstage with the following identifiers: + +- **Kubernetes ID**: `schedulerservice` +- **ArgoCD Selector**: `backstage.io/kubernetes-id=schedulerservice` + +## Commands + +### Lint Chart +```bash +helm lint helm/schedulerservice +``` + +### Template Preview +```bash +helm template scheduler-service helm/schedulerservice -f helm/schedulerservice/values-local.yaml +``` + +### Install +```bash +helm install scheduler-service helm/schedulerservice -f helm/schedulerservice/values-local.yaml -n scheduler --create-namespace +``` + +### Upgrade +```bash +helm upgrade scheduler-service helm/schedulerservice -f helm/schedulerservice/values-local.yaml -n scheduler +``` + +### Uninstall +```bash +helm uninstall scheduler-service -n scheduler +``` + +## Kubernetes Resources + +The Helm chart creates the following resources: + +| Resource | Name | +|----------|------| +| Deployment | `schedulerservice` | +| Service | `schedulerservice` | +| ServiceAccount | `schedulerservice` | +| ConfigMap | `schedulerservice-config` | +| Ingress | `schedulerservice` | +| HPA | `schedulerservice` (production only) | +| PDB | `schedulerservice` (production only) | + +## Health Checks + +| Probe | Path | Initial Delay | +|-------|------|---------------| +| Liveness | `/schedulerService/jobTrigger?...` | 60s | +| Readiness | `/schedulerService/jobTrigger?...` | 30s | +| Startup | `/schedulerService/jobTrigger?...` | 30s | + +## Secrets + +The following secrets are required: + +- `schedulerservice-db-secret`: Database credentials + - `hibernate.cfg.xml`: Complete Hibernate configuration file diff --git a/docs/getting-started.md b/docs/getting-started.md new file mode 100644 index 0000000..05a1369 --- /dev/null +++ b/docs/getting-started.md @@ -0,0 +1,63 @@ +# Getting Started + +## Prerequisites + +- Kubernetes cluster (Kind for local development) +- Helm 3.x +- kubectl configured +- MySQL database available + +## Local Development + +### 1. Clone the repository + +```bash +git clone https://gitea.os-tf-qa.onlinesales.ai/gitea_admin/schedulerService-chart.git +cd schedulerService-chart +``` + +### 2. Update Helm dependencies + +```bash +helm dependency update helm/schedulerservice +``` + +### 3. Install with Helm (Local) + +```bash +helm install scheduler-service helm/schedulerservice \ + -f helm/schedulerservice/values-local.yaml \ + -n scheduler \ + --create-namespace +``` + +### 4. Access the service + +The service will be available at: +- http://schedulerservice.cnoe.localtest.me/schedulerService/ + +### 5. Verify health + +```bash +curl "http://schedulerservice.cnoe.localtest.me/schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D" +``` + +## Production Deployment + +```bash +helm install scheduler-service helm/schedulerservice \ + -f helm/schedulerservice/values.yaml \ + -n scheduler \ + --create-namespace +``` + +## Database Setup + +The service requires a MySQL database. The schema will be managed via Hibernate ORM. + +### Local MySQL + +When using `values-local.yaml`, a MySQL instance is deployed as a subchart with: +- Database: `os_scheduling_db` +- User: `scheduler_user` +- Password: `localpassword` diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..38bd435 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,48 @@ +# Scheduler Service + +Job scheduling and execution service for managing scheduled tasks and job triggers. + +## Overview + +This service is part of the **job-management** system. It provides REST APIs for creating, managing, and triggering scheduled jobs across the platform. + +## Quick Links + +- [Getting Started](getting-started.md) +- [API Reference](api-reference.md) +- [Configuration](configuration.md) +- [Deployment](deployment.md) + +## Service Information + +| Property | Value | +|----------|-------| +| **Service Type** | Java (Tomcat) | +| **Port** | 8080 | +| **Health Endpoint** | `/schedulerService/jobTrigger?jsonQuery=...` | +| **Owner** | group:infrastructure | +| **Database** | MySQL (os_scheduling_db) | + +## Architecture + +``` +[Client] --> [Ingress] --> [Scheduler Service] --> [MySQL Database] + | + +--> [External Services] +``` + +## API Endpoints + +| Endpoint | Description | +|----------|-------------| +| `/schedulerService/job` | Job creation and management | +| `/schedulerService/jobTrigger` | Job trigger status and execution | +| `/schedulerService/schedules` | Schedule CRUD operations | +| `/schedulerService/group` | Group management | +| `/schedulerService/jobStat` | Job statistics | +| `/schedulerService/jobDetail` | Job details | +| `/schedulerService/cluster` | Cluster information | + +## Dependencies + +- **MySQL Database**: `os_scheduling_db` - Stores job configurations, schedules, and execution history diff --git a/helm/schedulerservice/Chart.lock b/helm/schedulerservice/Chart.lock new file mode 100644 index 0000000..8b01dff --- /dev/null +++ b/helm/schedulerservice/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: mysql + repository: https://helm.wso2.com + version: 1.6.9 +digest: sha256:bdbd774f845f1f0f4b7346e75b80f6c2e244cf92cf9feacf3d4807f8e50f9bce +generated: "2026-01-29T10:58:50.337803+05:30" diff --git a/helm/schedulerservice/Chart.yaml b/helm/schedulerservice/Chart.yaml new file mode 100644 index 0000000..cd9a1b4 --- /dev/null +++ b/helm/schedulerservice/Chart.yaml @@ -0,0 +1,23 @@ +apiVersion: v2 +name: schedulerservice +description: Helm chart for Scheduler Service - Job scheduling and execution service +type: application +version: 0.1.0 +appVersion: "1.0.0" +keywords: + - java + - tomcat + - scheduler + - microservice + - backstage +maintainers: + - name: infrastructure + email: infrastructure@onlinesales.ai +home: https://github.com/onlinesales-ai/schedulerService +sources: + - https://github.com/onlinesales-ai/schedulerService +dependencies: + - name: mysql + version: 1.6.9 + repository: https://helm.wso2.com + condition: mysql.enabled diff --git a/helm/schedulerservice/charts/mysql-1.6.9.tgz b/helm/schedulerservice/charts/mysql-1.6.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d23e4bc6b655c7ea6d8ff87d7f96005dc28d3da9 GIT binary patch literal 11568 zcmV-0Ezi;)iwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PKC+cH6kJ;C?;)idu5|*v>I2$&Qn>_T;RiI7-^96Whm9`m(dL zEQo|8j46TvKso9--!SjiVO zj1d#g3{CvM-NVypG#by2kJbN;Mx*$D(QZ_Ou-#^K@NvuDqq{H@VEJbc#p8{9`< zN>9WEVt;EiwuMtf?l1D7kom9&cGT zsIQit_Q3}EB0#cz{ZV&Vm5$pS5iyPis=@1MfLVYA=5<$c46iQcQTG}%+b08t*sQK0 zPvc>2I!~P+t?xbW@uT^Fiu?%k`w{?)`M>$3armUj|Hp^N5B&cvo}C>{`9LOUguzg$ zwX*{Z4^zgIq^-$XQ8=sTh`TP(h}W&19ZNxJK~24`>7P9`YC%m)lbU65!H~eCS<3?9#E6)k&_LkNq6J^RT5@c< zA$G}d1|i~HiWeAC28>c6MIVy`v9klO@DN45XaPfkM<>v1fRq}@6_^1Rj07XgjQ%C1 z;=;gcfkaJylt50@$N)-&R@#ED`krIfTC=&NDb+;V_vsBp0gA*J2ZFdrU=NV%V$KgB z3Z$6Dfsle-k8!4TRkt$<#Vpf(IsTP>&s2P6UbS-LiGt#kz}_YP6cL8KeOd5S>~dgO zcge$^?36o3!3cvG6E1)5w*4D45w9Cm#qM|U?z;H`Q_vO9!I0nY1k zob6FWJX}{Gczq`dJtSww)-Mu*pG!e%cs-BE#ZRt&h>apSmK?+w2|x@h64H3c&c2&< z|MM-lG!Tdcm^l)_YsvtBMw8H2lMlA->8Z9eGe&4&hki67!3#CMR{;`aimwt1B}1UT zhZ(p&Q9TH-YF4)3(jdUDnqg$R@El0M1qxj3Scr{y3qE|bEc{t8^b7T)3Fa-hwE%X& z2EBl)Z(O|sz>*|h5vDmNQ|%p%09R~V%&my#95t>5ySOd5r&a>9{97E*wn|< zfQXZLnO(cJ^sO=|6a)bnYWNsX50>AnLF zri9TzG0GG%r5M}O@E(_fJ8l58UGQs=kcW&7%v_N96YpjP1))Ks0CW$nOusMRKa z20UdE#2A_Z9j3g}l@e5N$Jzn&CrlzPV1QwQf=B_-GS&kUC`yxE;31OpTafh?yx`Kn z#i3AtnDI@R!gMTQi!kzit~+7Vz(#gRJ!_}b*H&(JCbLUCB3!W9&v>RwoS}&pBWKjZ zz_E{AL0M^KTGHDg8AVL7M;&oaMuF^(9Z(O~cjUhbT=}DGek5|fJsgsNh}m7XiVRE} z1)hxpLG1XA75|a6-=jX(aJX7xLh6AAC<#rLxZJE)auS8=fk>KA3wZj|u)I&EIKZ4= zFgn0$VGf8O$bW@>Bxi~S9&f=>!vY8~Bh*XYHRU@&CYVMdd3h{X)kv)^y)nalOnt8f zO$%U%h#xVWd3$78lF`ZX=8sowy}4fNJ3DY86(TOw5~k&2sNX0?S0c?y-nh6*5!u;E z7jFgTB88xZB6J01a+Nyq5$C$f=@2|TBmwpgfa}ld>zU%0|CW9A?@0}gl@PDlwW>TnHJR5~=wa>8PMZf$0J4Nr_=roqeDzZYYR+{{RA7YD|eM zAO;tyNQnb*$CPp5TB>k3UMn=WiH|Lj6-|ZEotT|VPO`y}NV*P@7+bjyujPBARbb(ojf*Vec=eTFMn+GgQ_L9gQWDlx zI2KYj0w0j+R)$X-lw!0lTeGO;lJ?Q*)+U<399eCAw-G2YJ2PZ$ZFWV=*&Lwm^ zJ&45cdHU)6?OO>)zPuXY05jxYx#aJ%5w0Ztnl0-}TQzOTwOVqUWH&WTdPskR3q}QX zslUr1q)b>l;5cwYd>`=VkaAsEeu1N-#?yxWeny4<@EcqxrCw?4Tahr0}ga=nua zaILb4LJw*`HXBc5fs&FlN6%;;t8Z0GO<7Y}psQ4CCPN>Yjg};2HYF~8M*|`i(yEz| zuaMbXBL6KKU_V{CQYkLU$Us|9Xq!sBZkfMYmE)h?zQ+wI!;b#8vf3OsX9rl^P$nrf zeplZKqk&Jj+=bamIXnK-maXx`oOGg>)zgcZj1^}o{XlBq7y8vt1t2CdM>s8WXqI!A9oyS(8&m!rdruyC78p_SduOS6nDxL z1U{yb@5z0h+1|yvkp7vHirh??U7y@JN}?!$(sp|%(f$G|l$s~kd<_iu!c6p*<#r=|d4K`8cjQ710WfAOX%UBC` z+YuKG`2^LwGcUliU27+)DA^ib;n1fug;P5fW0se^ZkM(Ia#bH-DP~g}U9y?e>Xh7+ z@9}*rq+YRpNWFqs?qZ=f@gXBrsp|2D$=WHu)3ub@Q)*_3AW0X+c!0Q4#uDRKE4Of} zg(9zBrwVqnVf5=n!=C(U&ZZuo`+v;&jS2_~PcCy3Pqpp({y0h$aiH)hqKiKhbs(ti z;zMwj4BjNPPUl(HlXVQ7Y`DH&rF#k8)hG&#@Yc9)%GWdf?RoYXX8rfyM^j{oei0 zw^x_v=e?_ocDMWM`Q@t@kM?3DWp#t$N}XRit6)?3@0$HMFH3ZY+HyKL>h#xPikK1pRMLory;w@u#|=3#Tk}rjcv=$kHIFsWgR+j zs;vbX+RC-}2v8_&IoRry6vMy%Yx2ez8jPZ@tARbUtRn{u(`L61G4KQVGtd@d59^T$ zlcQ_hs4i@eSDChO;aG!5m>jX0=6D(jE?bp7`uRCexn8zw7}RKF9BOA~V_8dB$L#1F zxhIv=oD%9!=iOd`KGjLoioBH}zTGbl5qQEsG(I|9AQ5o~c^;E8T)i_tzV7a4n!h-| zEH=-l?tSpa?iYuL*i~{`^(Wqb%MK;us8~HWn8^ly<&K64sQ!)X@r%*e7Bgj&}m z-)Xy0=QDOAV{J>Nzc~e#M8atN*-h4$R*uCaM0-ft4U%$p>eiPJ)3SbL<%3e!V={mA zB}Mxy*cb6{iS1XgBP}HDFn*ttihA5~`h8LVyBcFZ#Ed&4yfas@CHmjtljdPj|9krM z!TQhXe%{dz$Lgdo<^x&sJU&{v1;L`gg{MdAPcrF7!y)+$H9G|+`NP)gQvI=& zIvbfbB*)F*Q-pjnB-jHKhN|C=^()rURe2%XkT`G{U>C{7l+y`@pA+kzQ3DC~J+54K z)CpK@4m(HP^8$#}+P<`!6Kz@?;)e>_s1Z@pN3PBZ;X#z8~LEjCHHkdZ(P3m@0+r-4%Y zf!jauS^=7FejQ?)_qQg(H^v%j=GUm5vXOby$P-_exUFPB_ekLSkyo{Z>@V0G%w>%t zp~6as4kJ zUfcTB1cjUWhcAo&c=DuR|2b?n4j{kKaevcy<7frpTA;&|(y%O06ou*RSe)MgEjE zZ-E4!+>buV$b-CS_}+7LpHGqh)5DOviw0TD|A)<^Cq@1L_(|g-{^OfGS=L5j$mA9`F!+ir4dCkoGVRR}hO2=FtzfmFCLw1O&#zzY^o>CbzJ9HlGceTyQ!A$k#zn@M z5uxKovSngd09i~5h8rTriNL8mKh*uqdP^vCG5sA)d~h;S2l8Uak~;@E8flnJre3Vs zm~RCzka$TOCpskD@!QP!t~J7$@v0au3lbQy$6iV!^6_)+uG#XEwo6lx9JK1M732II z%Hq8UqBMP~-%F>k2wJ(_nOV#j3zNyqdUB@iKsooS~fD~`LfNLSTd74d>2Z1#-E40hR5RzHb1Y|cQJhi1y;s5SMfT~IM8 zwP5_p+pJ2isoITY_=n^}Va(guU#7b@cG#j&&yiG!ikU+`HeB4qFcBV{`J<`YlherchIoo#t^D;Mp zODip7kBVriSZ;>?!crNj_jGk3kPWR#3*`cCD&{#?YZKWMN7H0vc^qF;(Ogn`lcq9J zGijM@C{0C!**Yt=>CR>7)tA)@_SW%{dA^Q4b?<_ytt?sQmR!U}Jli=HXP7Il_jyj9 zylvHRmE0%|S>>yR(q*YU!ND}&$D&_CIV3h)J)SasI@5mp_WakY&by1=@5v!e2Gcko zF!f_zfF;o`n|mnm(h*Mjl8rEiJy|f<>FnqI{rMfv9VZog`kK*6EAujT=KLAYF7Yt` zWx+-wYZ5I?J;V-@702y`V(U+hey9n#Ov1N{K$jEP*0Zt7O#EpkVe$A=wsZ>iRIqTq znADQ??`3lGqxintxhykW)~sABcdSbE+#jVkTR+MKzS+Oc=P07l4k#*;U$du2G?bg%6<)*vz*Odr#$y@^RsX?G|3t(qndjrQ?qcfcQ zi}ZkOOxc`naPF_GC}mUK%+r=~WmZ<1ic(s~;+8Q?23Z$awEvG`RM`P?-`24QoUd=pS3SQO z^6RQozWnDYv4c!8E%q12?AskCx&;vN1cX~388fAhHL|J{7jXg+)3 z|8Maa{?8s$R%sczGs?LNgHi>waJZ<_MT&Cd{`^YI?tPg)XI%OKHuTf{3p%dGK8a~U zOw)UNo;H}4%gr1qAd-#)z&RSN*=%!VvP_4YOT2W+P z@AF-%RjnBLKfgDRFM5jd-(+sS(=}jO{O_~IQ7QiS*@OT8H+eF?DvLu3wJ%3*9jNwa z*@wNN(?`zTrP|YFu9m5L@eqQLmE=0l;dzKYMc9f*<;$0n89g`ds@D~k;1=Y}U!{7t zFnIa|2X1}|$mD2=n_f;D3;OWoi@LX>?T2G@7OC4S<~JNK!G*tz=vOtn0PFk4_|A~c z{A$&>l+`-1*L4;UY|FUc-wXP>rn-NJt{NUqg6QU(JCzVXmuXb$(J>L zE=ng&s}TA8%cc}&qPm>P!mNwQU1_$|Qk~+i)Qj@^uZFa85D7+(OBtqIB?&Hy4g;iGbj&|<`Y)~BR~(4V8Tw-OcgRP- zu35PlOq@GKi;YJ(@RToBVmhiix+j6aY>NCA95r}$qPpeyWHno9K+}SWTsgRT8Qs7t z@x^~}xxVUClK2(iAm%LamoDx(i&bhONN@-kGaPBEX zW_8}1vpnyYzhpq~FJ2N>>O?I1^^UkAb7h*8Gd9nw4&zVNC2MapH*VDSwN0@Q1Qu7w zU(T@~2gDWb?5OHgzDU}=#GaD){gtDR^qRIHN2e?#5F25keF4*|bI2mjd>U6yFCwXE zrC2!E?N#HQDk7bVF-|26Ofi!(y9K?Ii{hxQ;(%P`LK)_LCUZ?E#d0m>m-`h(#P=4b zf4Qf){tL{7{&)MlZ}GEi|M&Fiabf*`cGP@0|M@0QF|agyt9HWG_v8X38~Zcr3oGu? zmZ%l+Xs{@7_*gj{Epa-%&2Pi2PjCSKLyjBNdis`d=yu~l=wXnRb# zc(FqIZd(fKxoNXghtQf_Mryjs!fOc4_iH?RQNDsO6UMjj49Z}hSq@Fo@O204yAIT* zxZbBj!F>7ut@8ghj+)0s`G0(L{E+|in>^de{|o9pNdAfqWp1Y^Yt+WrpE!J6A5(f= zYk^X*Oz3U0!CE*Mg=Au}j-1b91{GDc(x4pG!ceMN=3_X0{KtIt@jAfCN{;f$|TPs7@NTJQ# zF_~gGqk_2Dvf3Qz5YFfnnnwq4*f?w)=zSFj66nj1n5?HRFbXL6G#Fu~t};@W0D6w~ znlhMBhJge_$|g$VJphjNeKbE|e*z~O;)ho_WY|?DlqD?Rn~!_(z0)Hi#?e6elgM?e zu6wleL+AAmFQ5PL{I%_+fNT_aHqwCXKmpo6P|!cTS6xiO##^+3Pe%r(EwRgjtM5CO zwWG~Qmi0mXpF&VS9m+=gKseAKxoT%ZxqwhzyUmLCN1LI226c zED*FWPI-Lcyk*11FZyapPH2!0K|C8#;9=&^WT!|lWQYqExguiN43N6fGVZdXV0F7B z$=s5uhfK9Ef97ri>rZC3dC_lKR=?jLAU?JpfkZcfqAz8Hv@CE%93~xBzu%X$gOlqD z_4so$8|F^i%!tH;ZE%cjl)1bP4oHX}a_>Iw?c{#%%k6>UQ=f35?~xCY-0}%YwCZ|N zbI)#E4}0K6Ob@3*PB&&*FK0p7bV2VYy>vkw~r>&01Y8Ga^&H%bB5x?^xFF=7v><1tWNhtFECP%z#Bf z5K}_w3P}gvp=%60VybHlhdy#KeE9wR{pHnV=WVCm)oFA-nu}D;g=LTS%pbe|{DJO5 zzv4RE3K+IAW3P5Y?T5!7zt;Numi6!O_;HVfj~}<-E#U$r?HP*WhBNz$Fy(aj6$iWz z$UGj1;!kxC``Fw(mL>R%oG8=2sbkw=#70@#FO$2@W6vRGxGbg9Nk{`62o8vI>Jmjf z2`_5a)GXtx3Rw=7mE~K1riIK&F7JuzLORb{TBm%FFp7MgVG6Spm`kXW_Qei?}MR@Z7>H%w0xQe%w_mtoKOpx`XRgvu?p&xulsBWUZK%PY{dI34_7;J zt^~wJ(L@oVph|4Smy;VxNUkziV>bF9KCarA{A~2++@4Sg?KXdpL=yI!1pL<3O_+S` zp2Xna;R$847WA8qccgy+Cl~M4kI5qBG#V2$!YdBJt&~0dli$}?OQo@LA}E`!KIAKb zU$0t%Mh}fvsar%tpwXT5KLvm6Jadj3>*1l$$lVaKq<&ibUgjeUew}JrG{g!MQbyxW z=i?UoP3P!vT_#s(RG#6@fnHNMn2QP;;Ogso@3~k8u1oL z?gkUj84n9Y{LR#nTj&R5-8DQxBh5#*3_?ydH0OZ&%5N^z?pRQ{-<5h|e8V_~z6kw3 z45PqZrrzJKi$FCR`doFPq$;6dQW@U~E?c9Kzqe|^x{*OcD!Z8j_B+62Yc$N28fy_1 z4yJ_BKpEkth!MH`Z->k_Xp}513yCUW<=D#8XOxP5Z0Au2lpc^F;DQ_=T-)+I>@5I) zsjW-RhT4B4SMAGJN8>%mYy}CSBo&KqS`YAz>b@Lk9ZtRFO1_Px%H_FOs;HM{BgSRx zskn>Th_B08iiYxsktoRSC&u?XnvQK|V`<9fezqO;0S0(T8BX#|%b^}%Ip(^$SUl(p z&^T&rQmu?e?sALLxZJ`|^akiq;6Rx}FdI@f(e`77$#&1Jq^3JTBcJcNh{rAbI>te! z+p;(Z8f~W%rr?h^s#Zp$c)Lfx(9Sy&kV!O=%bwJ21)1Xb_7KbyzBf2hW6$Tr!;<+; z!C~YB8Vbx{jHXf$3=#3M=g8T(BQ%Ovi>!i%sk0Od-P=3{3N!3UBouFKjK=cBbGVDa4T z+^Z=g<|yd;IZvI8 zLW6?7iZtyf@uVv&TDLGnK3`igH z2@OvESV&j5&?SE;qDn6Sh!Ij5|F^;dZsGYG0++vTjYcMKY85)S(3^$#iAF&D4XPE< zNOR&=&&e%ZV&whGh`{H8i-9ur;ym#0#OziCzbP8Iyv-Guq>?Jx-<79j8#FeTR2A2@ zEnx9(H1G&h5h1f!@TT0Zob|sy8ku;ZIVZ7cK5ft@I>=?Q-tM`DFJCvQCeg@-+$^_K zoly^)fG)LEgwzAXIT>kt)ppM|Xv8r-tDVHQ1Lofk+^- z(MSrLj3eKs&o*cj(n>5j-{=bEOaoHgvt7ib#xcQSj3W;54P#rN(O25YCWmIZTkw{u zhMl;p`mpS7A1QDcotTT)?08s~a%>5WCEg16kH)m&G#k!(ZVF{ImK>gy(74;vvuzH| zN>_?4w5TU&%yHh?7LCpK8>`-1*DqN{Ow~Ixg5E-N6Vu27G^#BNe`2fQ>KEzt=gr1l z*{kjWjmqix6B~GPH(M@UH!^2``YO!W8lruHlNC@dN$r$VEA_vL~L+MAsY4J+j8 z!cbidw#Bo}@>hLH_dJt=y1@G$(WqnLYSpkVfjeG(Iab>EnRkd z{w!cm;}ueGU5jTPjg48nh{lk=VKfToprO9O>8nK0CQc)FfXOZV_~VZoRI5URMM0a- z@mkPc3ipM@mS~hxWG*o9WP(1jCXvJty(tC;{N|h3Y|_i+mXQn^rlLx?xnaLc;7@eq z*XhMt)v{>h6Kc+rRN35~2_oyYx(JPat+wIvS9!C+T(9VEh+Q%yn8VE&t8*Dtxa|P= zm`1**PMQ>~)s@`sBvlTLV9}Y=t%~FeGAB+26jJ?aljj!RBvE;3^kzOaNt&~yfJT~? zWCc4_7mFxV(Na=@?RMWP?oQ%oOfI(#7s0J&Bguxc!g`rI`!mi`M&`zYCsE7YzOxP* zI>0YZ#=MR~l97r&U(L zZO{;8g8!hwO2YaU($Gb@c4*T##2{d=_Yc6qbaO>rqp|nCcLE*`ap1}6rGd5>&jYK^ z{;1bpLAf>UyhEX!jI4GmC?GF!-VUj^@eXhslR`+njO}AtI|hx|DspES81P%5!3b5` zrug#Lg%HHO9Hxrj`C-H|DvC4S2Az3R2Nd=8?AUw zs#B~$TuQUNakc#IqYRAMEUMX z%E{SDIUu2Vt3E}n?vp{?gwuz{xSCUEiiv3|@3RNOlg+=P zWu88V@d#IzP<7rB2VEhbh?zArqnOE7lbwM~<%|PSvNuKnsEbry5vFDpBhOKjRBLCx z82=~PHep;OINXeJAaSLh{HDEGbch&Io;x~mmU0MF5oJCNM)H4!s;Lzx!%@kHkWks7 z9DUT5K-PI%JQy-M0i+X1N%}^?3>Ze71_zpgpfX7}fF=U1P2j$VtUryGJXwQD_~&bu^IFppVc@ z0^0mIB|Lp#b}_1`x}%Oop_n@=Le9O5^epSCmy2#plv2_Kk!D3MkT6NuP9iSoBsESI zPii)jadL491qW9HuQ~uS(oG4o@_9}_&XNT;NGlFXS{Q)j5A0R-_y7`Vq|JmX{}oD? zugabbW@@oaGGfU^NuBfrg2zN$d5njIU}O*ptdiiF#ZWHv%rjxD86i(yr32}PY2eRH z>t-9KIIZuv!LYA(tv*Gb%5K;1_oX1U${lFMH+9Qe$$cFk^tMswo#xjhR5wJ}E^@~> zeJ9sVTkiJ#sd@X!wh<~M)vMEAPP?b)XIC$OSKnp1_WR!X)yZY2-RoSv?{+TbyUy90)3eT1 z_x;Om@3i;6cY1ynqjIGuxEdq1fbW=WhDGY%o>(6{e0(7P{p724L;dB9{-`8a4bR4b zU^8{Wq%Hg74J7HxPH-GoV;BZlPBDuDsnWQ@p8=I}M2fi79#OzY_JEkERf%3EPg^Fx zk(3_Xu_}0_08S^{;w28L8pYK(qS8W>vV@hAZbeB+yJ{`By@4F&WU@7>z^itz{j%Nd z!0Br^JMTf~x6^K~YnK04o!9O6Z+md^Q~R=g((7D8x6^}244?KI9RxJ+)@xVS*{b1~c)Q)VxeS#ijU!J)Q+n--naK}0aM>)B3Pk4cASG`PPaPu% z=tL4`o#EjG1@&X+Sse%Uq`IA{?u^C6-`8TN_qJOvnZOe*eK6DcB~=`?>Nrum2RaFT z!pFJ<*H`D7taP6uBFXk7W8-Z{Vyw&$ikc3LF<#kFQ|oWG2M2MsxujTXW!2dMawm{- zBc;^{i3tr;bAc$0bs_Pg9Ag)8NtD)Oc&D;;=IqnlTmhj5OKw0G7o(Bj#8WDpDy&4- zDp0LclRQ-|TiLQ%#j<3m?#Ib3bGs&;sL1rzh=RN4+&A9LLF)?VP=;E-4$h7r@teRt@*E+lGtF z(_bX({@nR}3GB+!$@Ws}0#d6_^JrGj=NQEa7@6F3flfCpbjs1(R+_{abJwA|rURWo zr|}$DRnhyR*ef!d&j;~_J$*NT-8Ilp=j zf^xH@nV_V_f^08I8!ej>V}>zs?t@Q)m_kx5P$8Mua^-X(eVdy`IDI|unzy9HHJ;@P iWQX#5Cp&+59-fEi;dywH=l=x&0RR7$aS2=i_y7PwRNu}3 literal 0 HcmV?d00001 diff --git a/helm/schedulerservice/templates/NOTES.txt b/helm/schedulerservice/templates/NOTES.txt new file mode 100644 index 0000000..8297bad --- /dev/null +++ b/helm/schedulerservice/templates/NOTES.txt @@ -0,0 +1,18 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "schedulerservice.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:{{ .Values.service.targetPort }} +{{- end }} + +2. Backstage Kubernetes ID: {{ .Values.commonLabels | default dict | dig "backstage.io/kubernetes-id" "schedulerservice" }} + +3. Health check endpoint: + /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + +4. Documentation available at TechDocs in Backstage after registering catalog-info.yaml diff --git a/helm/schedulerservice/templates/_helpers.tpl b/helm/schedulerservice/templates/_helpers.tpl new file mode 100644 index 0000000..d504264 --- /dev/null +++ b/helm/schedulerservice/templates/_helpers.tpl @@ -0,0 +1,63 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "schedulerservice.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +*/}} +{{- define "schedulerservice.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "schedulerservice.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "schedulerservice.labels" -}} +helm.sh/chart: {{ include "schedulerservice.chart" . }} +{{ include "schedulerservice.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- with .Values.commonLabels }} +{{ toYaml . }} +{{- end }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "schedulerservice.selectorLabels" -}} +app.kubernetes.io/name: {{ include "schedulerservice.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "schedulerservice.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "schedulerservice.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/helm/schedulerservice/templates/configmap.yaml b/helm/schedulerservice/templates/configmap.yaml new file mode 100644 index 0000000..631c179 --- /dev/null +++ b/helm/schedulerservice/templates/configmap.yaml @@ -0,0 +1,13 @@ +{{- if .Values.config.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "schedulerservice.fullname" . }}-config + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} +data: + {{- range $key, $value := .Values.config.files }} + {{ $key }}: | + {{- $value | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/schedulerservice/templates/deployment.yaml b/helm/schedulerservice/templates/deployment.yaml new file mode 100644 index 0000000..a77f77d --- /dev/null +++ b/helm/schedulerservice/templates/deployment.yaml @@ -0,0 +1,83 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "schedulerservice.fullname" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "schedulerservice.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "schedulerservice.labels" . | nindent 8 }} + {{- with .Values.podLabels }} + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "schedulerservice.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: {{ .Chart.Name }} + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + ports: + - name: http + containerPort: {{ .Values.service.targetPort }} + protocol: TCP + {{- if .Values.livenessProbe }} + livenessProbe: + {{- toYaml .Values.livenessProbe | nindent 12 }} + {{- end }} + {{- if .Values.readinessProbe }} + readinessProbe: + {{- toYaml .Values.readinessProbe | nindent 12 }} + {{- end }} + {{- if .Values.startupProbe }} + startupProbe: + {{- toYaml .Values.startupProbe | nindent 12 }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- if .Values.config.enabled }} + volumeMounts: + - name: config + mountPath: {{ .Values.config.mountPath }} + {{- end }} + {{- with .Values.env }} + env: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- if .Values.config.enabled }} + volumes: + - name: config + configMap: + name: {{ include "schedulerservice.fullname" . }}-config + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/helm/schedulerservice/templates/hpa.yaml b/helm/schedulerservice/templates/hpa.yaml new file mode 100644 index 0000000..22d7480 --- /dev/null +++ b/helm/schedulerservice/templates/hpa.yaml @@ -0,0 +1,32 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "schedulerservice.fullname" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "schedulerservice.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/helm/schedulerservice/templates/ingress.yaml b/helm/schedulerservice/templates/ingress.yaml new file mode 100644 index 0000000..edd253f --- /dev/null +++ b/helm/schedulerservice/templates/ingress.yaml @@ -0,0 +1,41 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ include "schedulerservice.fullname" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.ingress.className }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + pathType: {{ .pathType }} + backend: + service: + name: {{ include "schedulerservice.fullname" $ }} + port: + number: {{ $.Values.service.port }} + {{- end }} + {{- end }} +{{- end }} diff --git a/helm/schedulerservice/templates/pdb.yaml b/helm/schedulerservice/templates/pdb.yaml new file mode 100644 index 0000000..08faec3 --- /dev/null +++ b/helm/schedulerservice/templates/pdb.yaml @@ -0,0 +1,18 @@ +{{- if .Values.pdb.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ include "schedulerservice.fullname" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} +spec: + {{- if .Values.pdb.minAvailable }} + minAvailable: {{ .Values.pdb.minAvailable }} + {{- end }} + {{- if .Values.pdb.maxUnavailable }} + maxUnavailable: {{ .Values.pdb.maxUnavailable }} + {{- end }} + selector: + matchLabels: + {{- include "schedulerservice.selectorLabels" . | nindent 6 }} +{{- end }} diff --git a/helm/schedulerservice/templates/service.yaml b/helm/schedulerservice/templates/service.yaml new file mode 100644 index 0000000..ca4c00b --- /dev/null +++ b/helm/schedulerservice/templates/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "schedulerservice.fullname" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} + {{- with .Values.service.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: {{ .Values.service.targetPort }} + protocol: TCP + name: http + selector: + {{- include "schedulerservice.selectorLabels" . | nindent 4 }} diff --git a/helm/schedulerservice/templates/serviceaccount.yaml b/helm/schedulerservice/templates/serviceaccount.yaml new file mode 100644 index 0000000..1b1bc2f --- /dev/null +++ b/helm/schedulerservice/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "schedulerservice.serviceAccountName" . }} + labels: + {{- include "schedulerservice.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/helm/schedulerservice/values-local.yaml b/helm/schedulerservice/values-local.yaml new file mode 100644 index 0000000..5a63efc --- /dev/null +++ b/helm/schedulerservice/values-local.yaml @@ -0,0 +1,128 @@ +# Local development configuration for Kind cluster +replicaCount: 1 + +# CRITICAL: Same Backstage label for local discovery +commonLabels: + backstage.io/kubernetes-id: "schedulerservice" + +image: + repository: gcr.io/prj-onlinesales-stag-01/schedulerservice + pullPolicy: IfNotPresent + tag: "latest" + +# Relaxed security for local development +podSecurityContext: + fsGroup: 1000 + runAsNonRoot: false + runAsUser: 0 + +securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + runAsNonRoot: false + runAsUser: 0 + capabilities: + drop: + - ALL + +service: + type: ClusterIP + port: 8080 + targetPort: 8080 + +# Enable ingress for local access +ingress: + enabled: true + className: "nginx" + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + hosts: + - host: schedulerservice.cnoe.localtest.me + paths: + - path: /schedulerService + pathType: Prefix + +# No resource limits for local development +resources: {} + +# Relaxed probes for local development +livenessProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 30 + failureThreshold: 10 + +readinessProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 30 + failureThreshold: 10 + +startupProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 30 + failureThreshold: 60 + +# Disable autoscaling and PDB for local +autoscaling: + enabled: false + +pdb: + enabled: false + +nodeSelector: {} +tolerations: [] +affinity: {} + +# External service dependencies for local +externalServices: {} + +config: + enabled: true + mountPath: /etc/onlinesales/config/schedulerService + files: + schedulerService.cfg: | + LOG_CONFIG_FILE=/etc/onlinesales/config/schedulerService/log.cfg + DB_CONFIG_FILE=/etc/onlinesales/config/schedulerService/hibernate.cfg.xml + authConfig.cfg: | + { + "authEnable": false, + "authServiceUrl": "http://hades-service/hades/authorize" + } + log.cfg: | + log4j.rootLogger=DEBUG, stdout + log4j.appender.stdout=org.apache.log4j.ConsoleAppender + log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +env: + - name: APP_ENV + value: "local" + - name: LOG_LEVEL + value: "DEBUG" + +# MySQL enabled for local development +mysql: + enabled: true + image: "mysql" + imageTag: "8.0" + mysqlRootPassword: "rootpassword" + mysqlUser: "scheduler_user" + mysqlPassword: "localpassword" + mysqlDatabase: "os_scheduling_db" + fullnameOverride: "schedulerservice-mysql" + persistence: + enabled: false + resources: {} + podLabels: + backstage.io/kubernetes-id: "schedulerservice" diff --git a/helm/schedulerservice/values.yaml b/helm/schedulerservice/values.yaml new file mode 100644 index 0000000..0639bab --- /dev/null +++ b/helm/schedulerservice/values.yaml @@ -0,0 +1,135 @@ +# Production/Default configuration for Scheduler Service +replicaCount: 2 + +# CRITICAL: Backstage Kubernetes plugin discovery label +commonLabels: + backstage.io/kubernetes-id: "schedulerservice" + +image: + repository: gcr.io/prj-onlinesales-prod-01/schedulerservice + pullPolicy: IfNotPresent + tag: "latest" + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + create: true + annotations: {} + name: "" + +podAnnotations: + reloader.stakater.com/auto: "true" + +podLabels: {} + +podSecurityContext: + fsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + +securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + runAsNonRoot: true + runAsUser: 1000 + capabilities: + drop: + - ALL + +service: + type: ClusterIP + port: 8080 + targetPort: 8080 + annotations: {} + +ingress: + enabled: false + className: "nginx" + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + hosts: + - host: schedulerservice.example.com + paths: + - path: /schedulerService + pathType: Prefix + tls: [] + +resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 250m + memory: 512Mi + +livenessProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 60 + periodSeconds: 30 + timeoutSeconds: 30 + failureThreshold: 5 + successThreshold: 1 + +readinessProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 30 + periodSeconds: 15 + timeoutSeconds: 30 + failureThreshold: 5 + +startupProbe: + httpGet: + path: /schedulerService/jobTrigger?jsonQuery=%7B%22application%22%3A%22nagios%22%2C%22jobName%22%3A%22monitoring_scheduler_svc%22%7D + port: http + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 30 + failureThreshold: 30 + +autoscaling: + enabled: true + minReplicas: 2 + maxReplicas: 10 + targetCPUUtilizationPercentage: 70 + targetMemoryUtilizationPercentage: 80 + +pdb: + enabled: true + minAvailable: 1 + +nodeSelector: {} +tolerations: [] +affinity: {} + +# External service dependencies +externalServices: {} + +config: + enabled: true + mountPath: /etc/onlinesales/config/schedulerService + files: + schedulerService.cfg: | + LOG_CONFIG_FILE=/etc/onlinesales/config/schedulerService/log.cfg + DB_CONFIG_FILE=/etc/onlinesales/config/schedulerService/hibernate.cfg.xml + authConfig.cfg: | + { + "authEnable": false, + "authServiceUrl": "http://hades-service/hades/authorize" + } + log.cfg: | + log4j.rootLogger=INFO, stdout + log4j.appender.stdout=org.apache.log4j.ConsoleAppender + log4j.appender.stdout.layout=org.apache.log4j.PatternLayout + log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n + +env: [] + +# MySQL disabled for production (use external DB) +mysql: + enabled: false diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..8f1f24b --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,22 @@ +site_name: 'Scheduler Service' +site_description: 'Job scheduling and execution service for managing scheduled tasks and job triggers' + +nav: + - Home: index.md + - Getting Started: getting-started.md + - API Reference: api-reference.md + - Configuration: configuration.md + - Deployment: deployment.md + +plugins: + - techdocs-core + +markdown_extensions: + - admonition + - codehilite + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.details + - toc: + permalink: true