diff --git a/slapos/tests/slapgrid.py b/slapos/tests/slapgrid.py index d57840dc81ce58c863d4ea9c0f269b3c3fa94500..f0fda2ae31638802699489d5dae6c71c63ffb965 100644 --- a/slapos/tests/slapgrid.py +++ b/slapos/tests/slapgrid.py @@ -19,22 +19,26 @@ class BasicMixin: def setUp(self): self._tempdir = tempfile.mkdtemp() + logging.basicConfig(level=logging.DEBUG) + self.setSlapgrid() + + def setSlapgrid(self): self.software_root = os.path.join(self._tempdir, 'software') self.instance_root = os.path.join(self._tempdir, 'instance') if getattr(self, 'master_url', None) is None: - self.master_url = 'http://127.0.0.1:0/' + self.master_url = 'http://127.0.0.1:80/' self.computer_id = 'computer' self.supervisord_socket = os.path.join(self._tempdir, 'supervisord.sock') self.supervisord_configuration_path = os.path.join(self._tempdir, 'supervisord') self.usage_report_periodicity = 1 self.buildout = None - logging.basicConfig(level=logging.DEBUG) self.grid = slapgrid.Slapgrid(self.software_root, self.instance_root, self.master_url, self.computer_id, self.supervisord_socket, self.supervisord_configuration_path, self.usage_report_periodicity, self.buildout) + def tearDown(self): # XXX: Hardcoded pid, as it is not configurable in slapos svc = os.path.join(self.instance_root, 'var', 'run', 'supervisord.pid') @@ -47,6 +51,7 @@ class BasicMixin: os.kill(pid, signal.SIGTERM) shutil.rmtree(self._tempdir, True) + class TestBasicSlapgridCP(BasicMixin, unittest.TestCase): def test_no_software_root(self): self.assertRaises(OSError, self.grid.processComputerPartitionList) @@ -126,6 +131,7 @@ touch worked""") self._unmock_sleep() BasicMixin.tearDown(self) + class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase): def test_nothing_to_do(self): @@ -133,7 +139,7 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase): def server_response(self, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -150,11 +156,14 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase): self.assertSortedListEqual(os.listdir(self.software_root), []) def test_one_partition(self): - - def server_response(self, path, method, body, header): + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -167,10 +176,18 @@ class TestSlapgridCPWithMaster(MasterMixin, unittest.TestCase): partition._requested_state = 'stopped' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'stoppedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.sequence = [] + os.mkdir(self.software_root) os.mkdir(self.instance_root) partition_path = os.path.join(self.instance_root, '0') @@ -193,13 +210,20 @@ touch worked""") 'buildout.cfg']) self.assertSortedListEqual(os.listdir(self.software_root), [software_hash]) + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'stoppedComputerPartition']) def test_one_partition_started(self): - def server_response(self, path, method, body, header): + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -212,10 +236,21 @@ touch worked""") partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.sequence = [] + self.started = False + os.mkdir(self.software_root) os.mkdir(self.instance_root) partition_path = os.path.join(self.instance_root, '0') @@ -250,13 +285,22 @@ chmod 755 etc/run/wrapper self.assertTrue('Working' in open(wrapper_log, 'r').read()) self.assertSortedListEqual(os.listdir(self.software_root), [software_hash]) + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'startedComputerPartition']) + self.assertTrue(self.started) + def test_one_partition_started_stopped(self): - def server_response(self, path, method, body, header): + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -268,11 +312,22 @@ chmod 755 etc/run/wrapper partition._software_release_document = sr partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] - return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.started = True + self.sequence = [] + os.mkdir(self.software_root) os.mkdir(self.instance_root) partition_path = os.path.join(self.instance_root, '0') @@ -319,11 +374,18 @@ chmod 755 etc/run/wrapper self.assertTrue('Working' in open(wrapper_log, 'r').read()) self.assertSortedListEqual(os.listdir(self.software_root), [software_hash]) - - def server_response(self, path, method, body, header): + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'startedComputerPartition']) + self.assertTrue(self.started) + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -336,9 +398,21 @@ chmod 755 etc/run/wrapper partition._requested_state = 'stopped' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'stoppedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.stopped = True + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.stopped = False + self.sequence = [] + self.setSlapgrid() + self.assertTrue(self.grid.processComputerPartitionList()) self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc', 'var']) @@ -353,13 +427,22 @@ chmod 755 etc/run/wrapper break time.sleep(0.2) self.assertTrue(found) + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'stoppedComputerPartition']) + self.assertTrue(self.stopped) + def test_one_partition_stopped_started(self): - def server_response(self, path, method, body, header): + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -372,10 +455,21 @@ chmod 755 etc/run/wrapper partition._requested_state = 'stopped' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'stoppedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.stopped = True + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.stopped = False + self.sequence = [] + os.mkdir(self.software_root) os.mkdir(self.instance_root) partition_path = os.path.join(self.instance_root, '0') @@ -403,11 +497,19 @@ chmod 755 etc/run/wrapper 'buildout.cfg']) self.assertSortedListEqual(os.listdir(self.software_root), [software_hash]) + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'stoppedComputerPartition']) + self.assertTrue(self.stopped) - def server_response(self, path, method, body, header): + def server_response(self_httplib, path, method, body, header): parsed_url = urlparse.urlparse(path.lstrip('/')) - parsed_qs = urlparse.parse_qs(parsed_url.query) - if parsed_url.path == 'getComputerInformation' and \ + self.sequence.append(parsed_url.path) + if method == 'GET': + parsed_qs = urlparse.parse_qs(parsed_url.query) + else: + parsed_qs = urlparse.parse_qs(body) + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id']) slap_computer._software_release_list = [] @@ -420,10 +522,20 @@ chmod 755 etc/run/wrapper partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') else: return (404, {}, '') httplib.HTTPConnection._callback = server_response + self.started = True + self.sequence = [] + + self.setSlapgrid() self.assertTrue(self.grid.processComputerPartitionList()) self.assertSortedListEqual(os.listdir(self.instance_root), ['0', 'etc', 'var']) @@ -440,6 +552,11 @@ chmod 755 etc/run/wrapper break time.sleep(0.2) self.assertTrue('Working' in open(wrapper_log, 'r').read()) + self.assertEqual(self.sequence, + ['getFullComputerInformation', 'availableComputerPartition', + 'startedComputerPartition']) + self.assertTrue(self.started) + class TestSlapgridArgumentTuple(unittest.TestCase): """ @@ -532,8 +649,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase): parsed_qs = urlparse.parse_qs(parsed_url.query) else: parsed_qs = urlparse.parse_qs(body) - - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -543,11 +659,19 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase): sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ - method == 'POST' and 'computer_partition_id' in parsed_qs: + method == 'POST' and 'computer_partition_id' in parsed_qs: self.error = True self.assertEqual(parsed_qs['computer_partition_id'][0], '0') return (200, {}, '') @@ -557,6 +681,7 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase): httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = False + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -570,10 +695,11 @@ class TestSlapgridCPWithMasterPromise(MasterMixin, unittest.TestCase): touch "%(worked_file)s" exit 127""" % {'worked_file': worked_file}) os.chmod(fail, 0777) - self.assertTrue(self.grid.processComputerPartitionList()) + self.assertFalse(self.grid.processComputerPartitionList()) self.assertTrue(os.path.isfile(worked_file)) self.assertTrue(self.error) + self.assertFalse(self.started) def test_one_succeeding_promise(self): @@ -585,7 +711,7 @@ exit 127""" % {'worked_file': worked_file}) else: parsed_qs = urlparse.parse_qs(body) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -595,9 +721,17 @@ exit 127""" % {'worked_file': worked_file}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error = True @@ -609,6 +743,7 @@ exit 127""" % {'worked_file': worked_file}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = False + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -626,6 +761,7 @@ exit 0""" % {'worked_file': worked_file}) self.assertTrue(os.path.isfile(worked_file)) self.assertFalse(self.error) + self.assertTrue(self.started) def test_stderr_has_been_sent(self): @@ -637,7 +773,7 @@ exit 0""" % {'worked_file': worked_file}) else: parsed_qs = urlparse.parse_qs(body) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -647,9 +783,17 @@ exit 0""" % {'worked_file': worked_file}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error = True @@ -665,6 +809,7 @@ exit 0""" % {'worked_file': worked_file}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.5 self.error = False + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -679,11 +824,13 @@ touch "%(worked_file)s" echo -n Error 1>&2 exit 127""" % {'worked_file': worked_file}) os.chmod(succeed, 0777) - self.assertTrue(self.grid.processComputerPartitionList()) + self.assertFalse(self.grid.processComputerPartitionList()) self.assertTrue(os.path.isfile(worked_file)) self.assertEqual(self.error_log, 'Error') self.assertTrue(self.error) + self.assertFalse(self.started) + def test_timeout_works(self): @@ -694,8 +841,7 @@ exit 127""" % {'worked_file': worked_file}) parsed_qs = urlparse.parse_qs(parsed_url.query) else: parsed_qs = urlparse.parse_qs(body) - - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -705,9 +851,17 @@ exit 127""" % {'worked_file': worked_file}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error = True @@ -724,6 +878,7 @@ exit 127""" % {'worked_file': worked_file}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = False + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -738,10 +893,11 @@ touch "%(worked_file)s" sleep 5 exit 0""" % {'worked_file': worked_file}) os.chmod(succeed, 0777) - self.assertTrue(self.grid.processComputerPartitionList()) + self.assertFalse(self.grid.processComputerPartitionList()) self.assertTrue(os.path.isfile(worked_file)) self.assertTrue(self.error) + self.assertFalse(self.started) def test_two_succeeding_promises(self): @@ -753,7 +909,7 @@ exit 0""" % {'worked_file': worked_file}) else: parsed_qs = urlparse.parse_qs(body) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -763,9 +919,17 @@ exit 0""" % {'worked_file': worked_file}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error = True @@ -777,6 +941,7 @@ exit 0""" % {'worked_file': worked_file}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = False + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -805,6 +970,7 @@ exit 0""" % {'worked_file': worked_file_2}) self.assertTrue(os.path.isfile(worked_file_2)) self.assertFalse(self.error) + self.assertTrue(self.started) def test_one_succeeding_one_failing_promises(self): @@ -816,7 +982,7 @@ exit 0""" % {'worked_file': worked_file_2}) else: parsed_qs = urlparse.parse_qs(body) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -826,9 +992,17 @@ exit 0""" % {'worked_file': worked_file_2}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error += 1 @@ -840,6 +1014,7 @@ exit 0""" % {'worked_file': worked_file_2}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = 0 + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -849,23 +1024,27 @@ exit 0""" % {'worked_file': worked_file_2}) promises_files = [] for i in range(2): - promise = os.path.join(promise_path, 'promise_%d') + promise = os.path.join(promise_path, 'promise_%d' % i) promises_files.append(promise) - worked_file = os.path.join(instance_path, 'promise_worked_%d') + worked_file = os.path.join(instance_path, 'promise_worked_%d' % i) lockfile = os.path.join(instance_path, 'lock') with open(promise, 'w') as f: f.write("""#!/usr/bin/env sh touch "%(worked_file)s" -[[ ! -f "%(lockfile)s" ]] || { touch "%(lockfile)s" ; exit 127 } -exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) +if [ ! -f %(lockfile)s ] +then + touch "%(lockfile)s" + exit 0 +else + exit 127 +fi""" % {'worked_file': worked_file, 'lockfile': lockfile}) os.chmod(promise, 0777) - - - self.assertTrue(self.grid.processComputerPartitionList()) + self.assertFalse(self.grid.processComputerPartitionList()) for file_ in promises_files: self.assertTrue(os.path.isfile(file_)) self.assertEquals(self.error, 1) + self.assertFalse(self.started) def test_one_succeeding_one_timing_out_promises(self): @@ -877,7 +1056,7 @@ exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) else: parsed_qs = urlparse.parse_qs(body) - if parsed_url.path == 'getComputerInformation' and \ + if parsed_url.path == 'getFullComputerInformation' and \ 'computer_id' in parsed_qs: slap_computer = slapos.slap.Computer(parsed_qs['computer_id'][0]) slap_computer._software_release_list = [] @@ -887,9 +1066,17 @@ exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) sr = slapos.slap.SoftwareRelease() sr._software_release = 'http://sr/' partition._software_release_document = sr - partition._requested_state = 'stopped' + partition._requested_state = 'started' slap_computer._computer_partition_list = [partition] return (200, {}, xml_marshaller.xml_marshaller.dumps(slap_computer)) + if parsed_url.path == 'availableComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + return (200, {}, '') + if parsed_url.path == 'startedComputerPartition' and \ + method == 'POST' and 'computer_partition_id' in parsed_qs: + self.assertEqual(parsed_qs['computer_partition_id'][0], '0') + self.started = True + return (200, {}, '') if parsed_url.path == 'softwareInstanceError' and \ method == 'POST' and 'computer_partition_id' in parsed_qs: self.error += 1 @@ -901,6 +1088,7 @@ exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) httplib.HTTPConnection._callback = server_response self.fake_waiting_time = 0.2 self.error = 0 + self.started = False instance_path = self._create_instance('0') software_hash = self._bootstrap() @@ -910,20 +1098,27 @@ exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) promises_files = [] for i in range(2): - promise = os.path.join(promise_path, 'promise_%d') + promise = os.path.join(promise_path, 'promise_%d' % i) promises_files.append(promise) - worked_file = os.path.join(instance_path, 'promise_worked_%d') + worked_file = os.path.join(instance_path, 'promise_worked_%d' % i) lockfile = os.path.join(instance_path, 'lock') with open(promise, 'w') as f: f.write("""#!/usr/bin/env sh touch "%(worked_file)s" -[[ ! -f "%(lockfile)s" ]] || { touch "%(lockfile)s" ; sleep 5 } -exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) +if [ ! -f %(lockfile)s ] +then + touch "%(lockfile)s" +else + sleep 5 +fi +exit 0""" % {'worked_file': worked_file, 'lockfile': lockfile}) os.chmod(promise, 0777) - self.assertTrue(self.grid.processComputerPartitionList()) + self.assertFalse(self.grid.processComputerPartitionList()) for file_ in promises_files: self.assertTrue(os.path.isfile(file_)) self.assertEquals(self.error, 1) + self.assertFalse(self.started) +