Skip to content

Commit

Permalink
Merge pull request #165 from EDITD/PFM_1685_Add_object_annotations_in…
Browse files Browse the repository at this point in the history
…_config_file

PFM-1685 / Add annotations option to resources defined in kubetools.yaml file
  • Loading branch information
DilaraOflaz authored Jul 10, 2024
2 parents 016e8d6 + cd1ed31 commit ec80711
Show file tree
Hide file tree
Showing 10 changed files with 448 additions and 15 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

### Unreleased

# v13.14.1
- Add annotations and labels options to resources defined in kubetools.yaml file

# v13.14.0
- Fix docker-compose conflict when kubetools commands are called without activating their venv
- Add Python 3.12 to supported versions, albeit without Flake8 because of CPython bug
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ tests:

deployments:
my-app-webserver:
annotations:
imageregistry: "https://hub.docker.com/"
labels:
app.kubernetes.io/name: my-app-webserver
serviceAccountName: webserver
secrets:
secret-volume:
Expand Down
54 changes: 39 additions & 15 deletions kubetools/kubernetes/config/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,14 @@ def generate_kubernetes_configs_for_project(

for name, dependency in config.get('dependencies', {}).items():
dependency_name = make_deployment_name(project_name, name)
dependency_labels = copy_and_update(base_labels, {
ROLE_LABEL_KEY: 'dependency',
NAME_LABEL_KEY: dependency_name,
})
dependency_labels = copy_and_update(
base_labels,
{
ROLE_LABEL_KEY: 'dependency',
NAME_LABEL_KEY: dependency_name,
},
dependency.get('labels', {}),
)

node_selector_labels = dependency.get('nodeSelector', None)
service_account_name = dependency.get('serviceAccountName', None)
Expand All @@ -181,7 +185,10 @@ def generate_kubernetes_configs_for_project(
deployment_name=name,
default_registry=default_registry,
)
app_annotations = copy_and_update(base_annotations)
app_annotations = copy_and_update(
base_annotations,
dependency.get('annotations', {}),
)

if container_ports:
services.append(make_service_config(
Expand All @@ -207,10 +214,14 @@ def generate_kubernetes_configs_for_project(

for name, deployment in config.get('deployments', {}).items():
deployment_name = make_deployment_name(project_name, name)
deployment_labels = copy_and_update(base_labels, {
ROLE_LABEL_KEY: 'app',
NAME_LABEL_KEY: deployment_name,
})
deployment_labels = copy_and_update(
base_labels,
{
ROLE_LABEL_KEY: 'app',
NAME_LABEL_KEY: deployment_name,
},
deployment.get('labels', {}),
)

node_selector_labels = deployment.get('nodeSelector', None)
service_account_name = deployment.get('serviceAccountName', None)
Expand All @@ -225,6 +236,7 @@ def generate_kubernetes_configs_for_project(
app_annotations = copy_and_update(
base_annotations,
per_deployment_annotations.get(name),
deployment.get('annotations', {}),
)

if container_ports:
Expand Down Expand Up @@ -294,12 +306,16 @@ def generate_kubernetes_configs_for_project(
node_selector_labels = job_spec.get('nodeSelector', None)
service_account_name = job_spec.get('serviceAccountName', None)
secrets = job_spec.get('secrets', None)
app_annotations = copy_and_update(
base_annotations,
job_spec.get('annotations', {}),
)

jobs.append(make_job_config(
job_spec,
app_name=project_name,
labels=job_labels,
annotations=base_annotations,
annotations=app_annotations,
envvars=job_envvars,
node_selector_labels=node_selector_labels,
service_account_name=service_account_name,
Expand All @@ -309,10 +325,14 @@ def generate_kubernetes_configs_for_project(
cronjobs = []

for name, cronjob in config.get('cronjobs', {}).items():
cronjob_labels = copy_and_update(base_labels, {
ROLE_LABEL_KEY: 'cronjob',
NAME_LABEL_KEY: name,
})
cronjob_labels = copy_and_update(
base_labels,
{
ROLE_LABEL_KEY: 'cronjob',
NAME_LABEL_KEY: name,
},
cronjob.get('labels', {}),
)

node_selector_labels = cronjob.get('nodeSelector', None)
service_account_name = cronjob.get('serviceAccountName', None)
Expand All @@ -325,7 +345,11 @@ def generate_kubernetes_configs_for_project(
default_registry=default_registry,
)

app_annotations = copy_and_update(base_annotations)
app_annotations = copy_and_update(
base_annotations,
cronjob.get('annotations', {}),
)

schedule = cronjob['schedule']
concurrency_policy = cronjob['concurrency_policy']
batch_api_version = cronjob.get('batch-api-version') # May depend on target cluster
Expand Down
90 changes: 90 additions & 0 deletions tests/configs/basic_app/k8s_cronjobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,93 @@ spec:
imagePullPolicy: 'Always'
name: generic-container
restartPolicy: OnFailure

---

kind: CronJob
metadata:
name: generic-cronjob-with-annotations
labels: {
kubetools/name: generic-cronjob-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: cronjob
}
annotations: {
app.kubernetes.io/managed-by: kubetools,
imageregistry: https://hub.docker.com/,
description: 'Run: [''generic-command'']'
}
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 10
concurrencyPolicy: "Allow"
jobTemplate:
spec:
template:
metadata:
name: generic-cronjob-with-annotations
labels: {
kubetools/name: generic-cronjob-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: cronjob,
}
annotations: {
app.kubernetes.io/managed-by: kubetools,
imageregistry: https://hub.docker.com/,
description: 'Run: [''generic-command'']'
}
spec:
containers:
- command: [generic-command]
containerContext: generic-context
env:
- {name: KUBE, value: 'true'}
image: generic-image
imagePullPolicy: 'Always'
name: generic-container
restartPolicy: OnFailure

---

kind: CronJob
metadata:
name: generic-cronjob-with-labels
labels: {
app.kubernetes.io/name: generic-cronjob-with-labels,
kubetools/name: generic-cronjob-with-labels,
kubetools/project_name: generic-app,
kubetools/role: cronjob
}
annotations: {
app.kubernetes.io/managed-by: kubetools,
description: 'Run: [''generic-command'']'
}
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 10
concurrencyPolicy: "Allow"
jobTemplate:
spec:
template:
metadata:
name: generic-cronjob-with-labels
labels: {
app.kubernetes.io/name: generic-cronjob-with-labels,
kubetools/name: generic-cronjob-with-labels,
kubetools/project_name: generic-app,
kubetools/role: cronjob,
}
annotations: {
app.kubernetes.io/managed-by: kubetools,
description: 'Run: [''generic-command'']'
}
spec:
containers:
- command: [generic-command]
containerContext: generic-context
env:
- {name: KUBE, value: 'true'}
image: generic-image
imagePullPolicy: 'Always'
name: generic-container
restartPolicy: OnFailure
94 changes: 94 additions & 0 deletions tests/configs/basic_app/k8s_deployments.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,97 @@ spec:
readinessProbe:
httpGet: {path: /ping, port: 80}
timeoutSeconds: 5

---

apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {
app.kubernetes.io/managed-by: kubetools,
imageregistry: https://hub.docker.com/
}
labels: {
kubetools/name: generic-app-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: app
}
name: generic-app-with-annotations
spec:
replicas: 1
revisionHistoryLimit: 5
selector:
matchLabels: {
kubetools/name: generic-app-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: app
}
template:
metadata:
labels: {
kubetools/name: generic-app-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: app
}
spec:
containers:
- command: [generic-command]
containerContext: generic-context
env:
- {name: KUBE, value: 'true'}
image: generic-image
imagePullPolicy: Always
livenessProbe:
httpGet: {path: /ping, port: 80}
timeoutSeconds: 5
name: webserver
readinessProbe:
httpGet: {path: /ping, port: 80}
timeoutSeconds: 5

---

apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {app.kubernetes.io/managed-by: kubetools}
labels: {
app.kubernetes.io/name: generic-app-with-labels,
kubetools/name: generic-app-with-labels,
kubetools/project_name: generic-app,
kubetools/role: app
}
name: generic-app-with-labels
spec:
replicas: 1
revisionHistoryLimit: 5
selector:
matchLabels: {
app.kubernetes.io/name: generic-app-with-labels,
kubetools/name: generic-app-with-labels,
kubetools/project_name: generic-app,
kubetools/role: app
}
template:
metadata:
labels: {
app.kubernetes.io/name: generic-app-with-labels,
kubetools/name: generic-app-with-labels,
kubetools/project_name: generic-app,
kubetools/role: app
}
spec:
containers:
- command: [generic-command]
containerContext: generic-context
env:
- {name: KUBE, value: 'true'}
image: generic-image
imagePullPolicy: Always
livenessProbe:
httpGet: {path: /ping, port: 80}
timeoutSeconds: 5
name: webserver
readinessProbe:
httpGet: {path: /ping, port: 80}
timeoutSeconds: 5
51 changes: 51 additions & 0 deletions tests/configs/basic_app/k8s_services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,54 @@ spec:
- {port: 80, targetPort: 80}
selector: {kubetools/name: generic-app, kubetools/project_name: generic-app, kubetools/role: app}
type: NodePort

---

apiVersion: v1
kind: Service
metadata:
annotations: {
app.kubernetes.io/managed-by: kubetools,
imageregistry: https://hub.docker.com/
}
labels: {
kubetools/name: generic-app-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: app
}
name: generic-app-with-annotations
spec:
ports:
- {port: 80, targetPort: 80}
selector: {
kubetools/name: generic-app-with-annotations,
kubetools/project_name: generic-app,
kubetools/role: app
}
type: NodePort

---

apiVersion: v1
kind: Service
metadata:
annotations: {
app.kubernetes.io/managed-by: kubetools
}
labels: {
app.kubernetes.io/name: generic-app-with-labels,
kubetools/name: generic-app-with-labels,
kubetools/project_name: generic-app,
kubetools/role: app
}
name: generic-app-with-labels
spec:
ports:
- {port: 80, targetPort: 80}
selector: {
app.kubernetes.io/name: generic-app-with-labels,
kubetools/name: generic-app-with-labels,
kubetools/project_name: generic-app,
kubetools/role: app
}
type: NodePort
Loading

0 comments on commit ec80711

Please sign in to comment.