This commit is contained in:
		
							
								
								
									
										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") | ||||||
| @@ -44,32 +43,28 @@ async def apply_changes(item, v1, now, apps_api): | |||||||
|  |  | ||||||
|     # Generate Deployment |     # Generate Deployment | ||||||
|     body = yaml.safe_load(DEPLOYMENT_BODY.replace("foobar", name)) |     body = yaml.safe_load(DEPLOYMENT_BODY.replace("foobar", name)) | ||||||
|     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 | ||||||
|     body["spec"]["template"]["spec"]["containers"][0]["args"] = [target] |     body["spec"]["template"]["spec"]["containers"][0]["args"] = [target] | ||||||
|  |  | ||||||
|     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 | ||||||
|     body = yaml.safe_load(SERVICE_BODY.replace("foobar", name)) |     body = yaml.safe_load(SERVICE_BODY.replace("foobar", name)) | ||||||
|     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