diff --git a/master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCoreSoftwareInstanceRequest.py b/master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCoreSoftwareInstanceRequest.py index b39f7102b9bf2d46ed760c3777c8dbca1a9b7d17..2e162e07793043d853f8ecf8018a7d3dbcb91493 100644 --- a/master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCoreSoftwareInstanceRequest.py +++ b/master/bt5/slapos_cloud/TestTemplateItem/testSlapOSCoreSoftwareInstanceRequest.py @@ -2,6 +2,7 @@ from Products.SlapOS.tests.testSlapOSMixin import \ testSlapOSMixin import transaction +from Products.ERP5Type.tests.backportUnittest import expectedFailure class TestSlapOSCoreSoftwareInstanceRequest(testSlapOSMixin): @@ -74,7 +75,8 @@ class TestSlapOSCoreSoftwareInstanceRequest(testSlapOSMixin): self.login(self.software_instance.getReference()) def beforeTearDown(self): - pass + if 'request_instance' in self.software_instance.REQUEST: + self.software_instance.REQUEST['request_instance'] = None def test_request_requiredParameter(self): good_request_kw = self.request_kw.copy() @@ -313,6 +315,238 @@ class TestSlapOSCoreSoftwareInstanceRequest(testSlapOSMixin): ) self.tic() - # check that correct request does not raise self.assertRaises(ValueError, self.software_instance.requestInstance, **request_kw) + + def test_request_destroyed_state(self): + request_kw = self.request_kw.copy() + # in order to have unique requested title + request_kw['software_title'] = self.generateNewSoftwareTitle() + request_kw['state'] = 'destroyed' + + # check that correct request does not raise + self.software_instance.requestInstance(**request_kw) + + requested_instance = self.software_instance.REQUEST.get( + 'request_instance') + + # requesting with destroyed state shall not create new instance + self.assertEqual(None, requested_instance) + + def test_request_two_different(self): + request_kw = self.request_kw.copy() + # in order to have unique requested title + request_kw['software_title'] = self.generateNewSoftwareTitle() + + # check that correct request does not raise + self.software_instance.requestInstance(**request_kw) + + requested_instance = self.software_instance.REQUEST.get( + 'request_instance') + + request_kw['software_title'] = self.generateNewSoftwareTitle() + + self.software_instance.requestInstance(**request_kw) + + requested_instance2 = self.software_instance.REQUEST.get( + 'request_instance') + + self.assertNotEqual(requested_instance.getRelativeUrl(), + requested_instance2.getRelativeUrl()) + + self.assertSameSet( + self.software_instance.getPredecessorList(), + [requested_instance.getRelativeUrl(), requested_instance2.getRelativeUrl()]) + + def test_request_tree_change_indexed(self): + """Checks tree change forced by request + + For a tree like: + + A + | + A + |\ + B C + + When B requests C tree shall change to: + + A + | + A + | + B + | + C""" + request_kw = self.request_kw.copy() + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + B_instance = self.software_instance.REQUEST.get('request_instance') + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + C_instance = self.software_instance.REQUEST.get('request_instance') + + self.assertSameSet( + self.software_instance.getPredecessorList(), + [B_instance.getRelativeUrl(), C_instance.getRelativeUrl()]) + + self.tic() # in order to recalculate tree + + B_instance.requestInstance(**request_kw) + C1_instance = self.software_instance.REQUEST.get('request_instance') + + self.assertEqual(C_instance.getRelativeUrl(), C1_instance.getRelativeUrl()) + + self.assertSameSet(self.software_instance.getPredecessorList(), + [B_instance.getRelativeUrl()]) + self.assertSameSet(B_instance.getPredecessorList(), + [C_instance.getRelativeUrl()]) + + def test_request_tree_change_not_indexed(self): + """Checks tree change forced by request + + For a tree like: + + A + | + A + |\ + B C + + When B requests C tree in next transaction, but before indexation, + the system shall disallow the operation.""" + request_kw = self.request_kw.copy() + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + B_instance = self.software_instance.REQUEST.get('request_instance') + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + C_instance = self.software_instance.REQUEST.get('request_instance') + + self.assertSameSet( + self.software_instance.getPredecessorList(), + [B_instance.getRelativeUrl(), C_instance.getRelativeUrl()]) + + transaction.commit() + + self.assertRaises(NotImplementedError, B_instance.requestInstance, + **request_kw) + + @expectedFailure + def test_request_tree_change_same_transaction(self): + """Checks tree change forced by request + + For a tree like: + + A + | + A + |\ + B C + + When B requests C tree in the same transaction the system shall + disallow the operation.""" + request_kw = self.request_kw.copy() + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + B_instance = self.software_instance.REQUEST.get('request_instance') + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + C_instance = self.software_instance.REQUEST.get('request_instance') + + self.assertSameSet( + self.software_instance.getPredecessorList(), + [B_instance.getRelativeUrl(), C_instance.getRelativeUrl()]) + + self.assertRaises(NotImplementedError, B_instance.requestInstance, + **request_kw) + + def test_request_started_stopped_destroyed(self): + request_kw = self.request_kw.copy() + + request_kw['software_title'] = self.generateNewSoftwareTitle() + self.software_instance.requestInstance(**request_kw) + + requested_instance = self.software_instance.REQUEST.get( + 'request_instance') + self.assertNotEqual(None, requested_instance) + + self.assertEqual(request_kw['software_title'], + requested_instance.getTitle()) + self.assertEqual('Software Instance', + requested_instance.getPortalType()) + self.assertEqual('validated', + requested_instance.getValidationState()) + self.assertEqual('start_requested', + requested_instance.getSlapState()) + self.assertEqual(request_kw['software_release'], + requested_instance.getRootSoftwareReleaseUrl()) + self.assertEqual(request_kw['instance_xml'], + requested_instance.getTextContent()) + self.assertEqual(request_kw['sla_xml'], + requested_instance.getSlaXml()) + self.assertEqual(request_kw['software_type'], + requested_instance.getSourceReference()) + + self.tic() + + request_kw['state'] = 'stopped' + self.software_instance.requestInstance(**request_kw) + requested_instance2 = self.software_instance.REQUEST.get( + 'request_instance') + self.assertNotEqual(None, requested_instance2) + self.assertEqual(requested_instance.getRelativeUrl(), + requested_instance2.getRelativeUrl()) + + self.assertEqual(request_kw['software_title'], + requested_instance2.getTitle()) + self.assertEqual('Software Instance', + requested_instance2.getPortalType()) + self.assertEqual('validated', + requested_instance2.getValidationState()) + self.assertEqual('stop_requested', + requested_instance2.getSlapState()) + self.assertEqual(request_kw['software_release'], + requested_instance2.getRootSoftwareReleaseUrl()) + self.assertEqual(request_kw['instance_xml'], + requested_instance2.getTextContent()) + self.assertEqual(request_kw['sla_xml'], + requested_instance2.getSlaXml()) + self.assertEqual(request_kw['software_type'], + requested_instance2.getSourceReference()) + + + self.tic() + + request_kw['state'] = 'destroyed' + self.software_instance.requestInstance(**request_kw) + requested_instance3 = self.software_instance.REQUEST.get( + 'request_instance') + self.assertEqual(None, requested_instance3) + + # in case of destruction instance is not returned, so fetch it + # directly form document + requested_instance3 = self.software_instance.getPredecessorValue( + portal_type='Software Instance') + self.assertEqual(request_kw['software_title'], + requested_instance3.getTitle()) + self.assertEqual('Software Instance', + requested_instance3.getPortalType()) + self.assertEqual('validated', + requested_instance3.getValidationState()) + self.assertEqual('destroy_requested', + requested_instance3.getSlapState()) + self.assertEqual(request_kw['software_release'], + requested_instance3.getRootSoftwareReleaseUrl()) + self.assertEqual(request_kw['instance_xml'], + requested_instance3.getTextContent()) + self.assertEqual(request_kw['sla_xml'], + requested_instance3.getSlaXml()) + self.assertEqual(request_kw['software_type'], + requested_instance3.getSourceReference()) diff --git a/master/bt5/slapos_cloud/bt/revision b/master/bt5/slapos_cloud/bt/revision index 9cd72aa941214d4cb8522dda34eb12cf878e3e8b..e77a96349c09f79b6c061a73e03ad91346a0a196 100644 --- a/master/bt5/slapos_cloud/bt/revision +++ b/master/bt5/slapos_cloud/bt/revision @@ -1 +1 @@ -72 \ No newline at end of file +73 \ No newline at end of file