This commit is contained in:
parent
e276e71456
commit
43764d3365
6
.pre-commit-config.yaml
Normal file
6
.pre-commit-config.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
repos:
|
||||||
|
- repo: https://github.com/PyCQA/flake8
|
||||||
|
rev: 3.9.2
|
||||||
|
hooks:
|
||||||
|
- id: flake8
|
||||||
|
additional_dependencies: [flake8-typing-imports==1.10.0,flake8-quotes==3.2.0]
|
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
To run locally with suitable `KUBECONFIG`:
|
||||||
|
|
||||||
|
```
|
||||||
|
MY_POD_NAMESPACE=camtiler ./camera-operator.py
|
||||||
|
```
|
||||||
|
|
@ -6,13 +6,11 @@ import yaml
|
|||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
from kubernetes_asyncio.client.api_client import ApiClient
|
from kubernetes_asyncio.client.api_client import ApiClient
|
||||||
from kubernetes_asyncio import client, config, watch
|
from kubernetes_asyncio import client, config, watch
|
||||||
from os import path
|
|
||||||
from time import time
|
from time import time
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
import useful.logs
|
import useful.logs
|
||||||
|
|
||||||
useful.logs.setup(
|
useful.logs.setup(json_fields={"msg": "message", "level": "levelname"})
|
||||||
json_fields={"msg":"message", "level": "levelname"})
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
NAMESPACE = os.environ["MY_POD_NAMESPACE"]
|
NAMESPACE = os.environ["MY_POD_NAMESPACE"]
|
||||||
@ -23,6 +21,7 @@ with open("camera-service.yml") as stream:
|
|||||||
with open("camera-deployment.yml") as stream:
|
with open("camera-deployment.yml") as stream:
|
||||||
DEPLOYMENT_BODY = stream.read()
|
DEPLOYMENT_BODY = stream.read()
|
||||||
|
|
||||||
|
|
||||||
async def apply_changes(item, v1, now, apps_api):
|
async def apply_changes(item, v1, now, apps_api):
|
||||||
target = item["spec"]["target"]
|
target = item["spec"]["target"]
|
||||||
replicas = item["spec"].get("replicas")
|
replicas = item["spec"].get("replicas")
|
||||||
@ -51,12 +50,10 @@ async def apply_changes(item, v1, now, apps_api):
|
|||||||
if replicas:
|
if replicas:
|
||||||
body["spec"]["replicas"] = replicas
|
body["spec"]["replicas"] = replicas
|
||||||
try:
|
try:
|
||||||
await apps_api.replace_namespaced_deployment(
|
await apps_api.replace_namespaced_deployment(name, NAMESPACE, body)
|
||||||
name = name, body = body, namespace=NAMESPACE)
|
|
||||||
logger.debug("Updated deployment %s/%s", NAMESPACE, name)
|
logger.debug("Updated deployment %s/%s", NAMESPACE, name)
|
||||||
except client.exceptions.ApiException as e:
|
except client.exceptions.ApiException:
|
||||||
await apps_api.create_namespaced_deployment(
|
await apps_api.create_namespaced_deployment(NAMESPACE, body)
|
||||||
body = body, namespace=NAMESPACE)
|
|
||||||
logger.debug("Created deployment %s/%s", NAMESPACE, name)
|
logger.debug("Created deployment %s/%s", NAMESPACE, name)
|
||||||
|
|
||||||
# Generate Service
|
# Generate Service
|
||||||
@ -64,12 +61,10 @@ async def apply_changes(item, v1, now, apps_api):
|
|||||||
body["metadata"]["labels"]["app.kubernetes.io/managed-by"] = LABEL_MANAGED_BY
|
body["metadata"]["labels"]["app.kubernetes.io/managed-by"] = LABEL_MANAGED_BY
|
||||||
body["metadata"]["labels"]["modified"] = now
|
body["metadata"]["labels"]["modified"] = now
|
||||||
try:
|
try:
|
||||||
await v1.replace_namespaced_service(
|
await v1.replace_namespaced_service(name, NAMESPACE, body)
|
||||||
name = name, body = body, namespace=NAMESPACE)
|
|
||||||
logger.debug("Updated service %s/%s", NAMESPACE, name)
|
logger.debug("Updated service %s/%s", NAMESPACE, name)
|
||||||
except client.exceptions.ApiException as e:
|
except client.exceptions.ApiException:
|
||||||
await v1.create_namespaced_service(
|
await v1.create_namespaced_service(NAMESPACE, body)
|
||||||
body = body, namespace=NAMESPACE)
|
|
||||||
logger.debug("Created service %s/%s", NAMESPACE, name)
|
logger.debug("Created service %s/%s", NAMESPACE, name)
|
||||||
|
|
||||||
|
|
||||||
@ -123,20 +118,19 @@ async def main():
|
|||||||
name = "camera-%s" % event["object"]["metadata"]["name"]
|
name = "camera-%s" % event["object"]["metadata"]["name"]
|
||||||
try:
|
try:
|
||||||
await v1.delete_namespaced_service(name, NAMESPACE)
|
await v1.delete_namespaced_service(name, NAMESPACE)
|
||||||
except client.exceptions.ApiException as e:
|
except client.exceptions.ApiException:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
logger.debug("Removed service: %s/%s", NAMESPACE, name)
|
logger.debug("Removed service: %s/%s", NAMESPACE, name)
|
||||||
try:
|
try:
|
||||||
await apps_api.delete_namespaced_deployment(name, NAMESPACE)
|
await apps_api.delete_namespaced_deployment(name, NAMESPACE)
|
||||||
except client.exceptions.ApiException as e:
|
except client.exceptions.ApiException:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
logger.debug("Removed deployment: %s/%s", NAMESPACE, name)
|
logger.debug("Removed deployment: %s/%s", NAMESPACE, name)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
loop = asyncio.new_event_loop()
|
loop = asyncio.new_event_loop()
|
||||||
loop.run_until_complete(main())
|
loop.run_until_complete(main())
|
||||||
loop.close()
|
loop.close()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user