abstract Service
requirements : Requirements// resources required by a service
machine -> Machine// machine the service is allocated to
[ this in machine.services ]// inverse relationship constraint
abstract Requirements
morning_cpu -> integer
midday_cpu -> integer
evening_cpu -> integer
night_cpu -> integer
abstract Resources
cpu -> integer
abstract Machine
services -> Service *
[ this.machine = Machine ]
isFree ?
[ isFree <=> no services ]
limits : Resources
morning_utilization : Resources
/* constraints for limiting total requirements */
[ cpu < limits.cpu ]
midday_utilization : Resources
[ cpu < limits.cpu ]
evening_utilization : Resources
[ cpu < limits.cpu ]
night_utilization : Resources
[ cpu < limits.cpu ]
Task
total_free -> integer = # Machine.isFree
<<max Task.total_free>>
GoogleCA : Machine// total number of machines free
[ limits.cpu = 10 ]
GoogleNY : Machine
[ limits.cpu = 16 ]
GoogleTX : Machine
[ limits.cpu = 14 ]
MailService : Service
[ requirements.morning_cpu = 5 ]
[ requirements.midday_cpu = 4 ]
[ requirements.evening_cpu = 5 ]
[ requirements.night_cpu = 1 ]
SearchService : Service
[ requirements.morning_cpu = 7 ]
[ requirements.midday_cpu = 7 ]
[ requirements.evening_cpu = 8 ]
[ requirements.night_cpu = 3 ]
CalendarService : Service
[ requirements.morning_cpu = 2 ]
[ requirements.midday_cpu = 2 ]
[ requirements.evening_cpu = 2 ]
[ requirements.night_cpu = 1 ]