def setUp(self): # XXX #8895 means we need a cluster here self.cluster = Cluster() self.cluster.hostname = "cluster.example.com" self.cluster.save() self.pnode = Node() self.pnode.cluster = self.cluster self.pnode.hostname = "pnode.example.com" self.pnode.save() self.snode = Node() self.snode.cluster = self.cluster self.snode.hostname = "snode.example.com" self.snode.save() self.valid_data = {"pnode": self.pnode.id, "snode": self.snode.id}
def _update_node(self, cluster, info, data, updated, callback): """ updates an individual node, this is the actual work function @param cluster - cluster this node is on @param info - info from ganeti @param data - data from database @param updated - counter object @param callback - callback fired when method is complete. """ hostname = info['name'] if hostname in data: id, mtime = data[hostname] if not mtime or mtime < info['mtime']: print ' Node (updated) : %s' % hostname #print ' %s :: %s' % (mtime, datetime.fromtimestamp(info['mtime'])) # only update the whole object if it is new or modified. parsed = Node.parse_persistent_info(info) Node.objects.filter(pk=id) \ .update(serialized_info=cPickle.dumps(info), **parsed) updated += 1 else: # new node node = Node(cluster=cluster, hostname=info['name']) node.info = info node.save() id = node.pk updated += 1 # Updates relationships between a Node and its Primary and Secondary # VirtualMachines. This always runs even when there are no updates but # it should execute quickly since it runs against an indexed column # # XXX this blocks so it may be worthwhile to spin this off into a # deferred just to break up this method. VirtualMachine.objects \ .filter(hostname__in=info['pinst_list']) \ .update(primary_node=id) VirtualMachine.objects \ .filter(hostname__in=info['sinst_list']) \ .update(secondary_node=id) callback(id)
class TestVMWizardAdvancedForm(TestCase): def setUp(self): # XXX #8895 means we need a cluster here self.cluster = Cluster() self.cluster.hostname = "cluster.example.com" self.cluster.save() self.pnode = Node() self.pnode.cluster = self.cluster self.pnode.hostname = "pnode.example.com" self.pnode.save() self.snode = Node() self.snode.cluster = self.cluster self.snode.hostname = "snode.example.com" self.snode.save() self.valid_data = { "pnode": self.pnode.id, "snode": self.snode.id, } def tearDown(self): self.pnode.delete() self.snode.delete() self.cluster.delete() def test_trivial(self): pass def test_validate_valid(self): form = VMWizardAdvancedForm(self.valid_data) self.assertTrue(form.is_valid(), form.errors) def test_validate_ip_check_without_name_check(self): data = self.valid_data.copy() data["ip_check"] = True form = VMWizardAdvancedForm(data) self.assertFalse(form.is_valid(), "IP check shouldn't be allowed without name check") def test_validate_pnode_equals_snode(self): invalid_data = self.valid_data.copy() invalid_data["snode"] = invalid_data["pnode"] form = VMWizardAdvancedForm(invalid_data) self.assertFalse(form.is_valid(), "The secondary node cannot be the primary node.")