From e4681d7360e4902341d599001957abcf2a8e85a4 Mon Sep 17 00:00:00 2001
From: Rafael Monnerat <rafael@nexedi.com>
Date: Thu, 13 Feb 2025 18:07:28 +0100
Subject: [PATCH] py3: Fixup some py3 bytes x str inconsistencies

---
 ...erp5.SlapOSTestCaseDefaultScenarioMixin.py | 16 ++++++------
 .../portal_components/tool.erp5.SlapTool.py   | 26 ++++++++++---------
 2 files changed, 22 insertions(+), 20 deletions(-)

diff --git a/master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py b/master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
index 3264862c8..ca68ba860 100644
--- a/master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
+++ b/master/bt5/slapos_cloud/TestTemplateItem/portal_components/test.erp5.SlapOSTestCaseDefaultScenarioMixin.py
@@ -25,7 +25,7 @@ from erp5.component.test.testSlapOSCloudSecurityGroup import TestSlapOSSecurityM
 from erp5.component.test.SlapOSTestCaseMixin import changeSkin
 import re
 from slapos.util import dumps, loads
-from Products.ERP5Type.Utils import str2bytes
+from Products.ERP5Type.Utils import str2bytes, bytes2str
 from AccessControl.SecurityManagement import getSecurityManager, \
              setSecurityManager
 
@@ -229,7 +229,7 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
     try:
       self.login(compute_node.getUserId())
       self.portal.portal_slap.loadComputerConfigurationFromXML(
-          dumps(compute_node_dict))
+          bytes2str(dumps(compute_node_dict)))
       self.tic()
       self.assertEqual(partition_count,
           len(compute_node.contentValues(portal_type='Compute Partition')))
@@ -276,9 +276,9 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
         if partition._requested_state == 'destroyed' \
               and partition._need_modification == 1:
           self.portal.portal_slap.destroyedComputerPartition(compute_node.getReference(),
-              partition._partition_id.encode("UTF-8")
+              partition._partition_id
               )
-          destroyed_partition_id_list.append(partition._partition_id.encode("UTF-8"))
+          destroyed_partition_id_list.append(partition._partition_id)
     finally:
       setSecurityManager(sm)
     self.tic()
@@ -306,10 +306,10 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
               and partition._need_modification == 1:
           instance_reference = partition._instance_guid.encode('UTF-8')
           ip_list = partition._parameter_dict['ip_list']
-          connection_xml = dumps(dict(
+          connection_xml = bytes2str(dumps(dict(
             url_1 = 'http://%s/' % ip_list[0][1],
             url_2 = 'http://%s/' % ip_list[1][1],
-          ))
+          )))
           self.login()
           instance_user_id = self.portal.portal_catalog.getResultValue(
               reference=instance_reference, portal_type="Software Instance").getUserId()
@@ -324,10 +324,10 @@ class DefaultScenarioMixin(TestSlapOSSecurityMixin):
             )
             for slave in partition._parameter_dict['slave_instance_list']:
               slave_reference = slave['slave_reference']
-              connection_xml = dumps(dict(
+              connection_xml = bytes2str(dumps(dict(
                 url_1 = 'http://%s/%s' % (ip_list[0][1], slave_reference),
                 url_2 = 'http://%s/%s' % (ip_list[1][1], slave_reference)
-              ))
+              )))
               self.portal.portal_slap.setComputerPartitionConnectionXml(
                 computer_id=compute_node_reference,
                 computer_partition_id=partition._partition_id,
diff --git a/master/bt5/slapos_slap_tool/ToolComponentTemplateItem/portal_components/tool.erp5.SlapTool.py b/master/bt5/slapos_slap_tool/ToolComponentTemplateItem/portal_components/tool.erp5.SlapTool.py
index bc2d13ab9..583d803ee 100644
--- a/master/bt5/slapos_slap_tool/ToolComponentTemplateItem/portal_components/tool.erp5.SlapTool.py
+++ b/master/bt5/slapos_slap_tool/ToolComponentTemplateItem/portal_components/tool.erp5.SlapTool.py
@@ -28,7 +28,7 @@
 #
 ##############################################################################
 
-from Products.ERP5Type.Utils import str2unicode
+from Products.ERP5Type.Utils import str2unicode, bytes2str, str2bytes
 from AccessControl import ClassSecurityInfo
 from AccessControl import Unauthorized
 from OFS.Traversable import NotFound
@@ -75,7 +75,7 @@ except ImportError:
 
 
 from zLOG import LOG, INFO
-from six import StringIO
+import six
 import pkg_resources
 from DateTime import DateTime
 from App.Common import rfc1123_date
@@ -112,13 +112,15 @@ def convertToREST(function):
       raise Unauthorized
 
     self.REQUEST.response.setHeader('Content-Type', 'text/xml; charset=utf-8')
+    if isinstance(retval, bytes):
+      return '%s' % bytes2str(retval)
     return '%s' % retval
   wrapper.__doc__ = function.__doc__
   return wrapper
 
 def castToStr(dict_kw):
   instance = etree.Element('instance')
-  for _id, _value in dict_kw.iteritems():
+  for _id, _value in six.iteritems(dict_kw):
     # cast everything to string.
     text = _value
     if not isinstance(_value, str):
@@ -690,7 +692,7 @@ class SlapTool(BaseTool):
     'loadComputerConfigurationFromXML')
   def loadComputerConfigurationFromXML(self, xml):
     "Load the given xml as configuration for the compute_node object"
-    compute_node_dict = loads(xml)
+    compute_node_dict = loads(str2bytes(xml))
     compute_node = self.getPortalObject().portal_catalog.getComputeNodeObject(compute_node_dict['reference'])
     compute_node.ComputeNode_updateFromDict(compute_node_dict)
     return 'Content properly posted.'
@@ -771,11 +773,11 @@ class SlapTool(BaseTool):
   def _validateXML(self, to_be_validated, xsd_model):
     """Will validate the xml file"""
     #We parse the XSD model
-    xsd_model = StringIO(xsd_model)
+    xsd_model = six.StringIO(xsd_model)
     xmlschema_doc = etree.parse(xsd_model)
     xmlschema = etree.XMLSchema(xmlschema_doc)
 
-    string_to_validate = StringIO(to_be_validated)
+    string_to_validate = six.StringIO(to_be_validated)
 
     try:
       document = etree.parse(string_to_validate)
@@ -927,7 +929,7 @@ class SlapTool(BaseTool):
         compute_node_id,
         compute_partition_id,
         slave_reference)
-    connection_xml = dict2xml(loads(connection_xml))
+    connection_xml = dict2xml(loads(str2bytes(connection_xml)))
     if not software_instance.isLastData(value=connection_xml):
       software_instance.updateConnection(
         connection_xml=connection_xml,
@@ -952,19 +954,19 @@ class SlapTool(BaseTool):
     In any other case returns not important data and HTTP code is 403 Forbidden
     """
     if state:
-      state = loads(state)
+      state = loads(str2bytes(state))
     if state is None:
       state = 'started'
     if shared_xml is not _MARKER:
-      shared = loads(shared_xml)
+      shared = loads(str2bytes(shared_xml))
     else:
       shared = False
     if partition_parameter_xml:
-      partition_parameter_kw = loads(partition_parameter_xml)
+      partition_parameter_kw = loads(str2bytes(partition_parameter_xml))
     else:
       partition_parameter_kw = dict()
     if filter_xml:
-      filter_kw = loads(filter_xml)
+      filter_kw = loads(str2bytes(filter_xml))
       if software_type == 'pull-backup' and not 'retention_delay' in filter_kw:
         filter_kw['retention_delay'] = 7.0
     else:
@@ -1109,7 +1111,7 @@ class SlapTool(BaseTool):
       slap_software_release._known_state = software_release_dict['_known_state']
       slap_compute_node._software_release_list.append(slap_software_release)
 
-    return dumps(slap_compute_node)
+    return bytes2str(dumps(slap_compute_node))
 
   def _getSoftwareInstanceForComputePartition(self, compute_node_id,
       compute_partition_id, slave_reference=None):
-- 
2.30.9