def testAdd(self): jls = Jails() j = jls.create(getJail()) jls.add(j) self.assertEqual(1, jls.count()) self.assertRaises(KeyError, jls.add, j)
def testIterate(self): jls = Jails() jails = [] jails.append(jls.create(getJail())) jails.append(jls.create(getJail())) for j in jls: self.assertIn(j, jails, "Jail is not in expected list.")
def testLoad(self): ''' Jails.load() will load a json-serialized jail list and add them to it's registry ''' jls = Jails() jails = [] for i in range(10): jails.append(getJail()) jls.load(jails) self.assertEqual(jls.count(), 10, "The number of imported jails does not match generated count")
def testExport(self): jls = Jails() expected = [] self.assertEqual(jls.export(), expected, "The exported data does not match the expected value (empty list).") j = getJail() jls.add(jls.create(j)) expected = [j] self.assertEqual(jls.export(), expected, "The exported data does not match the expected value (one jail).") h = getJail() jls.add(jls.create(h)) expected = [j, h] self.assertEqual(len(jls.export()), 2, "The exported data does not match the expected value (one jail).")
def testContain(self): jls = Jails() jail = jls.create(getJail()) self.assertFalse(jls.contain(jail.id), "Jails registry already contains the jail o_O") jls.add(jail) self.assertTrue(jls.contain(jail.id), "Jails registry does not contain the jail!")
def testGet(self): jls = Jails() jail = getJail() j = jls.create(jail) jls.add(j) self.assertEqual(j, jls.get(jail['id'])) self.assertRaises(KeyError, jls.get, 'derp') self.assertEqual([j], jls.get(), "Exported values do not match expected ones.")
def __init__(self, registration): self.id = registration['id'] self.jails = Jails() self.keys = {} self.name = registration['name'] self.status = 'new' self.environment = None self.interface = None self.firewall = None self.interfaces = NetInterfaces.getInterfaces() self.configured = False self._persist_file = cherrypy.config.get('vm.persistence') self._load()
class VM(object): ''' Virtual Machine ''' def __init__(self, registration): self.id = registration['id'] self.jails = Jails() self.keys = {} self.name = registration['name'] self.status = 'new' self.environment = None self.interface = None self.firewall = None self.interfaces = NetInterfaces.getInterfaces() self.configured = False self._persist_file = cherrypy.config.get('vm.persistence') self._load() def update(self, **kwargs): '''Update the VM object with provided values.''' valid = ['keys', 'interface', 'name', 'firewall'] for key in kwargs: if not key in valid: continue setattr(self, key, kwargs[key]) if 'environment' in kwargs: old_env = self.environment self.environment = kwargs['environment'] if old_env != self.environment: self.jails.clear() if 'jails' in kwargs: self._set_jails(kwargs['jails']) self.configurationValid() def _set_jails(self, jails): '''Sets the jails to the provided list.''' self.jails.clear() for data in jails: if self.jails.contain(data['id']): continue jail = self.jails.create(data) self.jails.add(jail) def _load(self): '''Load the vm off the persistent storage.''' if not os.path.exists(self._persist_file): return keys = [ 'id', 'keys', 'status', 'environment', 'configured', 'interface', 'firewall' ] data = {} try: with open(self._persist_file, 'r') as f: data = json.load(f) except ValueError as e: return for key in keys: if not key in data: #discard loaded data. raise KeyError("Key: `%s` is missing." % key) if not 'jails' in data: raise KeyError("Key: `jails` is missing.") for key in keys: setattr(self, key, data[key]) self.jails.load(data['jails']) def persist(self): '''Saves the VM to the persistent storage.''' data = self.getConfiguration() with open(self._persist_file, 'w') as f: f.write(json.dumps(data, sort_keys=True, indent=4)) def getConfiguration(self): '''Returns a dictionary filled with the VM configuration data.''' data = {} data['id'] = self.id data['jails'] = self.jails.export() data['keys'] = self.keys data['status'] = self.status data['environment'] = self.environment data['configured'] = self.configured data['interface'] = self.interface data['firewall'] = self.firewall return data def configurationValid(self): '''Verifies if the configuration is valid and upate the jail status accordingly''' listItems = [self.jails.get(), self.keys] boolItems = [self.environment, self.interface] for item in listItems: if len(item) == 0: return self.isConfigured(False) for item in boolItems: if not item: return self.isConfigured(False) return self.isConfigured(True) def isConfigured(self, state = None): '''Switch the configuration state or returns it.''' if state: self.configured = state self.status = 'configured' elif state == False: self.configured = state self.status = 'new' return self.configured
def testClear(self): jls = Jails() jls.add(jls.create(getJail())) jls.clear() self.assertEqual(0, jls.count(), "Jails list not cleared.")
def testCreate(self): jls = Jails() j = jls.create(getJail()) self.assertTrue(isinstance(j, Jail))