from celery import shared_task from django.db.models.loading import get_model from orchestra.apps.orchestration.models import BackendOperation as Operation from .backends import ServiceMonitor from .models import ResourceData, Resource @shared_task(name='resources.Monitor') def monitor(resource_id): resource = Resource.objects.get(pk=resource_id) # Execute monitors for monitor_name in resource.monitors: backend = ServiceMonitor.get_backend(monitor_name) model = get_model(backend.model) operations = [] # Execute monitor for obj in model.objects.all(): operations.append(Operation.create(backend, obj, Operation.MONITOR)) Operation.execute(operations) # Update used resources and trigger resource exceeded and revovery operations = [] model = resource.content_type.model_class() for obj in model.objects.all(): data = ResourceData.get_or_create(obj, resource) data.update() if not resource.disable_trigger: if data.used < data.allocated: op = Operation.create(backend, obj, Operation.EXCEED) operations.append(op) elif data.used < data.allocated: op = Operation.create(backend, obj, Operation.RECOVERY) operations.append(op) # data = ResourceData.get_or_create(obj, resource) # current = data.get_used() # if not resource.disable_trigger: # if data.used < data.allocated and current > data.allocated: # op = Operation.create(backend, obj, Operation.EXCEED) # operations.append(op) # elif data.used > data.allocated and current < data.allocated: # op = Operation.create(backend, obj, Operation.RECOVERY) # operation.append(op) # data.update(current=current) Operation.execute(operations)