diff options
author | Tyler Mock <tyler.mock@calxeda.com> | 2013-04-30 18:54:23 -0500 |
---|---|---|
committer | Tyler Mock <tyler.mock@calxeda.com> | 2013-04-30 18:54:23 -0500 |
commit | f8b64ece449102e6f38bf31cbe48f2e509633916 (patch) | |
tree | 4e7c869903210f9d48b5733aeac54baf6d7d6f05 | |
parent | 4a29d111ac01ab62236e673416c6df0f0776d119 (diff) | |
parent | 8a6795c724a23f876ff0f00b6884145cd258e4f3 (diff) | |
download | cxmanage-f8b64ece449102e6f38bf31cbe48f2e509633916.tar.gz |
Merge branch 'master' of ssh://git.calxeda.com/var/git/cx_manage_util
-rw-r--r-- | cxmanage_api/node.py | 29 | ||||
-rw-r--r-- | cxmanage_test/node_test.py | 26 |
2 files changed, 48 insertions, 7 deletions
diff --git a/cxmanage_api/node.py b/cxmanage_api/node.py index c1a909e..1b7ad55 100644 --- a/cxmanage_api/node.py +++ b/cxmanage_api/node.py @@ -637,6 +637,8 @@ class Node(object): if (priority == None): priority = self._get_next_priority(fwinfo, package) + updated_partitions = [] + for image in package.images: if (image.type == "UBOOTENV"): # Get partitions @@ -666,6 +668,7 @@ class Node(object): except (ValueError, Exception): self._upload_image(image, running_part, priority) + updated_partitions += [running_part, factory_part] else: # Get the partitions if (partition_arg == "BOTH"): @@ -680,9 +683,35 @@ class Node(object): for partition in partitions: self._upload_image(image, partition, priority) + updated_partitions += partitions + if package.version: self.bmc.set_firmware_version(package.version) + # Post verify + fwinfo = self.get_firmware_info() + for old_partition in updated_partitions: + partition_id = int(old_partition.partition) + new_partition = fwinfo[partition_id] + + if new_partition.type != old_partition.type: + raise Exception("Update failed (partition %i, type changed)" + % partition_id) + + if int(new_partition.priority, 16) != priority: + raise Exception("Update failed (partition %i, wrong priority)" + % partition_id) + + if int(new_partition.flags, 16) & 2 != 0: + raise Exception("Update failed (partition %i, not activated)" + % partition_id) + + result = self.bmc.check_firmware(partition_id) + if not hasattr(result, "crc32") or result.error != None: + raise Exception("Update failed (partition %i, post-crc32 fail)" + % partition_id) + + def config_reset(self): """Resets configuration to factory defaults. diff --git a/cxmanage_test/node_test.py b/cxmanage_test/node_test.py index ceeb770..1e897fc 100644 --- a/cxmanage_test/node_test.py +++ b/cxmanage_test/node_test.py @@ -39,7 +39,8 @@ from pyipmi import IpmiError from pyipmi.bmc import LanBMC from cxmanage_test import TestImage, TestSensor, random_file -from cxmanage_api.simg import create_simg +from cxmanage_api import temp_file +from cxmanage_api.simg import create_simg, get_simg_header from cxmanage_api.node import Node from cxmanage_api.tftp import InternalTftp, ExternalTftp from cxmanage_api.ubootenv import UbootEnv @@ -49,13 +50,13 @@ from cxmanage_api.cx_exceptions import IPDiscoveryError NUM_NODES = 4 ADDRESSES = ["192.168.100.%i" % x for x in range(1, NUM_NODES + 1)] +TFTP = InternalTftp() class NodeTest(unittest.TestCase): """ Tests involving cxmanage Nodes """ def setUp(self): - tftp = InternalTftp() - self.nodes = [Node(ip_address=ip, tftp=tftp, bmc=DummyBMC, + self.nodes = [Node(ip_address=ip, tftp=TFTP, bmc=DummyBMC, image=TestImage, ubootenv=DummyUbootEnv, ipretriever=DummyIPRetriever, verbose=True) for ip in ADDRESSES] @@ -187,16 +188,16 @@ class NodeTest(unittest.TestCase): for partition in changed_partitions: self.assertEqual(partition.updates, 1) self.assertEqual(partition.retrieves, 0) - self.assertEqual(partition.checks, 1) + self.assertEqual(partition.checks, 2) self.assertEqual(partition.activates, 1) self.assertEqual(ubootenv_partition.updates, 1) self.assertEqual(ubootenv_partition.retrieves, 1) - self.assertEqual(ubootenv_partition.checks, 1) + self.assertEqual(ubootenv_partition.checks, 2) self.assertEqual(ubootenv_partition.activates, 1) - self.assertEqual(node.bmc.executed[-1], - ("set_firmware_version", "0.0.1")) + self.assertTrue(("set_firmware_version", "0.0.1") + in node.bmc.executed) def test_config_reset(self): """ Test node.config_reset method """ @@ -429,6 +430,16 @@ class DummyBMC(LanBMC): partition, image_type, tftp_addr)) self.partitions[partition].updates += 1 + localfile = temp_file() + TFTP.get_file(filename, localfile) + + contents = open(localfile).read() + simg = get_simg_header(contents) + self.partitions[partition].fwinfo.offset = "%8x" % simg.imgoff + self.partitions[partition].fwinfo.size = "%8x" % simg.imglen + self.partitions[partition].fwinfo.priority = "%8x" % simg.priority + self.partitions[partition].fwinfo.daddr = "%8x" % simg.daddr + class Result: def __init__(self): self.tftp_handle_id = 0 @@ -792,6 +803,7 @@ class DummyBMC(LanBMC): def fabric_rm_macaddr(self, nodeid=0, iface=0, macaddr=None): self.executed.append('fabric_rm_macaddr') + class Partition: def __init__(self, partition, type, offset=0, size=0, priority=0, daddr=0, in_use=None): |