Skip to content
Snippets Groups Projects
Commit 4aff118e authored by André Anjos's avatar André Anjos :speech_balloon:
Browse files

[backend] Set queue name uniqueness; Provide natural keys

parent c36727f5
No related branches found
No related tags found
1 merge request!194Scheduler
......@@ -46,6 +46,11 @@ class Migration(migrations.Migration):
name='memory',
field=models.PositiveIntegerField(default=0, help_text=b'In megabytes'),
),
migrations.AlterField(
model_name='queue',
name='name',
field=models.CharField(help_text=b'The name for this object (space-like characters will be automatically replaced by dashes)', unique=True, max_length=100),
),
migrations.AlterField(
model_name='queue',
name='cores_per_slot',
......
......@@ -38,6 +38,15 @@ from ..common.texts import Messages
#----------------------------------------------------------
class EnvironmentManager(models.Manager):
def get_by_natural_key(self, name, version):
return self.get(
name=name,
version=version,
)
class Environment(Shareable):
"""Defines a software environment to run algorithms"""
......@@ -81,6 +90,8 @@ class Environment(Shareable):
on_delete=models.SET_NULL,
)
objects = EnvironmentManager()
#_____ Meta parameters __________
class Meta:
......@@ -92,6 +103,10 @@ class Environment(Shareable):
return self.fullname()
def natural_key(self):
return (self.name, self.version)
#_____ Utilities __________
def fullname(self):
......@@ -119,6 +134,12 @@ class Environment(Shareable):
#----------------------------------------------------------
class WorkerManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Worker(models.Model):
name = models.CharField(
......@@ -139,6 +160,8 @@ class Worker(models.Model):
info = models.TextField(null=True, blank=True,
help_text='Informative message from the worker in case it is inactive')
objects = WorkerManager()
#_____ Overrides __________
......@@ -149,6 +172,10 @@ class Worker(models.Model):
return retval
def natural_key(self):
return self.name
def load(self):
'''Calculates the number of cores being used currently'''
return sum([j.block.queue.cores_per_slot for j in self.jobs])
......@@ -177,9 +204,16 @@ class Worker(models.Model):
#----------------------------------------------------------
class QueueManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Queue(models.Model):
name = models.CharField(max_length=100, help_text=Messages['name'])
name = models.CharField(max_length=100, help_text=Messages['name'],
unique=True)
memory_limit = models.PositiveIntegerField(help_text='In megabytes')
......@@ -213,6 +247,11 @@ class Queue(models.Model):
self.max_slots_per_user
)
def natural_key(self):
return self.name
#_____ Utilities __________
def number_of_slots(self):
......@@ -264,6 +303,12 @@ class Queue(models.Model):
return [w[0] for w in workers]
class SlotManager(models.Manager):
def get_by_natural_key(self, queue_name, worker_name):
return self.get(queue__name=queue_name, worker__name=worker_name)
class Slot(models.Model):
queue = models.ForeignKey(Queue, related_name='slots',
......@@ -282,6 +327,8 @@ class Slot(models.Model):
help_text='Priority of these slots on the defined queue'
)
objects = SlotManager()
#_____ Meta parameters __________
class Meta:
......@@ -291,3 +338,7 @@ class Slot(models.Model):
def __str__(self):
return '%s - %s (slots: %d, priority: %d)' % (self.queue, self.worker, self.quantity, self.priority)
def natural_key(self):
return (self.queue.name, self.worker.name)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment