diff --git a/master/bt5/slapos_slap_tool/TestTemplateItem/testSlapOSSlapTool.py b/master/bt5/slapos_slap_tool/TestTemplateItem/testSlapOSSlapTool.py index 8da277858a55835c4662509136aaef766404da57..0101619e4aba299c2faccceebf9c1c1615f2b5d7 100644 --- a/master/bt5/slapos_slap_tool/TestTemplateItem/testSlapOSSlapTool.py +++ b/master/bt5/slapos_slap_tool/TestTemplateItem/testSlapOSSlapTool.py @@ -2167,6 +2167,84 @@ class TestSlapOSSlapToolPersonAccess(TestSlapOSSlapToolMixin): if os.path.exists(self.instance_request_simulator): os.unlink(self.instance_request_simulator) + def test_request_allocated_instance(self): + self.tic() + self.person.edit( + default_email_coordinate_text="%s@example.org" % self.person.getReference(), + career_role='member', + ) + self._makeComplexComputer(person=self.person) + self.start_requested_software_instance.updateLocalRolesOnSecurityGroups() + self.tic() + self.login(self.person_reference) + response = self.portal_slap.requestComputerPartition( + software_release=self.start_requested_software_instance.getUrlString(), + software_type=self.start_requested_software_instance.getSourceReference(), + partition_reference=self.start_requested_software_instance.getTitle(), + partition_parameter_xml='<marshal><dictionary id="i2"/></marshal>', + filter_xml='<marshal><dictionary id="i2"/></marshal>', + state='<marshal><string>started</string></marshal>', + shared_xml='<marshal><bool>0</bool></marshal>', + ) + self.assertEqual(type(response), str) + # check returned XML + xml_fp = StringIO.StringIO() + + xml.dom.ext.PrettyPrint(xml.dom.ext.reader.Sax.FromXml(response), + stream=xml_fp) + xml_fp.seek(0) + got_xml = xml_fp.read() + expected_xml = """\ +<?xml version='1.0' encoding='UTF-8'?> +<marshal> + <object id='i2' module='slapos.slap.slap' class='SoftwareInstance'> + <tuple/> + <dictionary id='i3'> + <string>_connection_dict</string> + <dictionary id='i4'/> + <string>_instance_guid</string> + <string>%(instance_guid)s</string> + <string>_parameter_dict</string> + <dictionary id='i5'/> + <string>_requested_state</string> + <string>%(state)s</string> + <string>ip_list</string> + <list id='i6'> + <tuple> + <string/> + <string>%(ip)s</string> + </tuple> + </list> + <string>slap_computer_id</string> + <string>%(computer_id)s</string> + <string>slap_computer_partition_id</string> + <string>%(partition_id)s</string> + <string>slap_software_release_url</string> + <string>%(url_string)s</string> + <string>slap_software_type</string> + <string>%(type)s</string> + <string>slave_instance_list</string> + <list id='i7'/> + <string>timestamp</string> + <string>%(timestamp)s</string> + </dictionary> + </object> +</marshal> +""" % dict( + instance_guid=self.start_requested_software_instance.getReference(), + state="started", + url_string=self.start_requested_software_instance.getUrlString(), + type=self.start_requested_software_instance.getSourceReference(), + timestamp=int(self.start_requested_software_instance.getModificationDate()), + computer_id=self.computer_id, + partition_id=self.start_requested_software_instance.getAggregateId(), + ip=self.start_requested_software_instance.getAggregateValue()\ + .getDefaultNetworkAddressIpAddress(), + ) + self.assertEqual(expected_xml, got_xml, + '\n'.join([q for q in difflib.unified_diff(expected_xml.split('\n'), + got_xml.split('\n'))])) + def assertSupplySimulator(self, args, kwargs): stored = eval(open(self.computer_supply_simulator).read()) # do the same translation magic as in workflow diff --git a/master/bt5/slapos_slap_tool/bt/revision b/master/bt5/slapos_slap_tool/bt/revision index cabf43b5ddf813cbe89697372a21373f14921884..410b14d2ce6f958c13adcb30807e8673074c49d9 100644 --- a/master/bt5/slapos_slap_tool/bt/revision +++ b/master/bt5/slapos_slap_tool/bt/revision @@ -1 +1 @@ -24 \ No newline at end of file +25 \ No newline at end of file diff --git a/master/product/Vifib/Tool/SlapTool.py b/master/product/Vifib/Tool/SlapTool.py index 47db793738618127d9c7230dcf75e37954d22db0..dede901b6598ff068e9fc83225e912ffc4a7b1c8 100644 --- a/master/product/Vifib/Tool/SlapTool.py +++ b/master/product/Vifib/Tool/SlapTool.py @@ -654,7 +654,6 @@ class SlapTool(BaseTool): computer_partition_document.getRelativeUrl()) if software_instance is not None: - slap_partition._instance_guid = software_instance.getReference() # trick client side, that data has been synchronised already for given # document slap_partition._synced = True @@ -677,6 +676,7 @@ class SlapTool(BaseTool): parameter_dict.pop('xml')) slap_partition._connection_dict = self._instanceXmlToDict( parameter_dict.pop('connection_xml')) + slap_partition._instance_guid = parameter_dict.pop('instance_guid') for slave_instance_dict in parameter_dict.get("slave_instance_list", []): if slave_instance_dict.has_key("connection_xml"): slave_instance_dict.update(self._instanceXmlToDict( @@ -788,7 +788,6 @@ class SlapTool(BaseTool): computer_partition_document.getRelativeUrl()) if software_instance is not None: - slap_partition._instance_guid = software_instance.getReference() state = software_instance.getSlapState() if state == "stop_requested": slap_partition._requested_state = 'stopped' @@ -808,6 +807,7 @@ class SlapTool(BaseTool): parameter_dict.pop('xml')) slap_partition._connection_dict = self._instanceXmlToDict( parameter_dict.pop('connection_xml')) + slap_partition._instance_guid = parameter_dict.pop('instance_guid') for slave_instance_dict in parameter_dict.get("slave_instance_list", []): if slave_instance_dict.has_key("connection_xml"): slave_instance_dict.update(self._instanceXmlToDict( @@ -1176,10 +1176,13 @@ class SlapTool(BaseTool): parameter_dict.pop('xml')) connection_xml = self._instanceXmlToDict( parameter_dict.pop('connection_xml')) + instance_guid = parameter_dict.pop('instance_guid') software_instance = SoftwareInstance(**parameter_dict) software_instance._parameter_dict = xml software_instance._connection_dict = connection_xml + software_instance._requested_state = state + software_instance._instance_guid = instance_guid return xml_marshaller.xml_marshaller.dumps(software_instance) #################################################### @@ -1320,6 +1323,7 @@ class SlapTool(BaseTool): if (newtimestamp > timestamp): timestamp = newtimestamp return { + 'instance_guid': software_instance.getReference(), 'xml': software_instance.getTextContent(), 'connection_xml': software_instance.getConnectionXml(), 'slap_computer_id': computer_partition.getParentValue().getReference(),