| #!/usr/bin/python |
| # |
| # Copyright 2010 Google Inc. All Rights Reserved. |
| |
| __author__ = "asharif@google.com (Ahmad Sharif)" |
| |
| from fnmatch import fnmatch |
| |
| |
| class Machine(object): |
| """Stores information related to machine and its state.""" |
| |
| def __init__(self, hostname, label, cpu, cores, os, username): |
| self.hostname = hostname |
| self.label = label |
| self.cpu = cpu |
| self.cores = cores |
| self.os = os |
| self.username = username |
| |
| # MachineManager related attributes. |
| self.uses = 0 |
| self.locked = False |
| |
| def Acquire(self, exclusively): |
| assert not self.locked |
| |
| if exclusively: |
| self.locked = True |
| self.uses += 1 |
| |
| def Release(self): |
| assert self.uses > 0 |
| |
| self.uses -= 1 |
| |
| if not self.uses: |
| self.locked = False |
| |
| def __repr__(self): |
| return "{%s: %s@%s}" % ( |
| self.__class__.__name__, self.username, self.hostname) |
| |
| def __str__(self): |
| return "\n".join(["Machine Information:", |
| "Hostname: %s" % self.hostname, |
| "Label: %s" % self.label, |
| "CPU: %s" % self.cpu, |
| "Cores: %d" % self.cores, |
| "OS: %s" % self.os, |
| "Uses: %d" % self.uses, |
| "Locked: %s" % self.locked]) |
| |
| |
| class MachineSpecification(object): |
| """Helper class used to find a machine matching your requirements.""" |
| |
| def __init__(self, hostname="*", label="*", os="*", lock_required=False): |
| self.hostname = hostname |
| self.label = label |
| self.os = os |
| self.lock_required = lock_required |
| self.preferred_machines = [] |
| |
| def __str__(self): |
| return "\n".join(["Machine Specification:", |
| "Name: %s" % self.name, |
| "OS: %s" % self.os, |
| "Lock required: %s" % self.lock_required]) |
| |
| def IsMatch(self, machine): |
| return all([not machine.locked, |
| fnmatch(machine.hostname, self.hostname), |
| fnmatch(machine.label, self.label), |
| fnmatch(machine.os, self.os)]) |
| |
| def AddPreferredMachine(self, hostname): |
| if hostname not in self.preferred_machines: |
| self.preferred_machines.append(hostname) |