Prechádzať zdrojové kódy

AMBARI-6674. potential language/encoding problem with mysql (aonishuk)

Andrew Onishuk 11 rokov pred
rodič
commit
99e42776eb

+ 31 - 0
ambari-agent/src/test/python/resource_management/TestFileResource.py

@@ -330,3 +330,34 @@ class TestFileResource(TestCase):
 
     self.assertEqual(chmod_mock.call_count, 1)
     self.assertEqual(chown_mock.call_count, 0)
+
+  @patch("resource_management.core.providers.system._ensure_metadata")
+  @patch("resource_management.core.providers.system.FileProvider._get_content")
+  @patch("__builtin__.open")
+  @patch.object(os.path, "exists")
+  @patch.object(os.path, "isdir")
+  def test_action_create_encoding(self, isdir_mock, exists_mock, open_mock, get_content_mock ,ensure_mock):
+
+    isdir_mock.side_effect = [False, True]
+    exists_mock.return_value = True
+    content_mock = MagicMock()
+    old_content_mock = MagicMock()
+    get_content_mock.return_value = content_mock
+    new_file = MagicMock()
+    open_mock.return_value = new_file
+    enter_file_mock = MagicMock()
+    enter_file_mock.read = MagicMock(return_value=old_content_mock)
+    new_file.__enter__ = MagicMock(return_value=enter_file_mock)
+    with Environment('/') as env:
+      File('/directory/file',
+           action='create',
+           mode=0777,
+           content='file-content',
+           encoding = "UTF-8"
+      )
+
+
+    open_mock.assert_called_with('/directory/file', 'wb')
+    content_mock.encode.assert_called_with('UTF-8')
+    old_content_mock.decode.assert_called_with('UTF-8')
+

+ 25 - 1
ambari-agent/src/test/python/resource_management/TestXmlConfigResource.py

@@ -193,4 +193,28 @@ class TestXmlConfigResource(TestCase):
                 )
 
     open_mock.assert_called_with('/dir/conf/file.xml', 'wb')
-    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>first</name>\n      <value>should be first</value>\n    </property>\n    \n    <property>\n      <name>second</name>\n      <value>should be second</value>\n    </property>\n    \n    <property>\n      <name>third</name>\n      <value>should be third</value>\n    </property>\n    \n    <property>\n      <name>z_last</name>\n      <value>should be last</value>\n    </property>\n    \n  </configuration>\n')
+    result_file.__enter__().write.assert_called_with(u'<!--Wed 2014-02-->\n    <configuration>\n    \n    <property>\n      <name></name>\n      <value></value>\n    </property>\n    \n    <property>\n      <name>first</name>\n      <value>should be first</value>\n    </property>\n    \n    <property>\n      <name>second</name>\n      <value>should be second</value>\n    </property>\n    \n    <property>\n      <name>third</name>\n      <value>should be third</value>\n    </property>\n    \n    <property>\n      <name>z_last</name>\n      <value>should be last</value>\n    </property>\n    \n  </configuration>\n')
+
+  @patch("resource_management.libraries.providers.xml_config.File")
+  @patch.object(os.path, "exists")
+  @patch.object(os.path, "isdir")
+  def test_action_create_arguments(self, os_path_isdir_mock ,os_path_exists_mock, file_mock):
+
+    os_path_isdir_mock.side_effect = [False, True]
+    os_path_exists_mock.return_value = False
+
+    with Environment() as env:
+      XmlConfig('xmlFile.xml',
+                conf_dir='/dir/conf',
+                configurations={'property1': 'value1'},
+                configuration_attributes={'attr': {'property1': 'attr_value'}},
+                mode = 0755,
+                owner = "hdfs",
+                group = "hadoop",
+                encoding = "Code"
+      )
+
+    self.assertEqual(file_mock.call_args[0][0],'/dir/conf/xmlFile.xml')
+    call_args = file_mock.call_args[1].copy()
+    del call_args['content']
+    self.assertEqual(call_args,{'owner': 'hdfs', 'group': 'hadoop', 'mode': 0755, 'encoding' : 'Code'})

+ 1 - 1
ambari-common/src/main/python/resource_management/core/logger.py

@@ -89,4 +89,4 @@ class Logger:
     if arguments_str:  
       arguments_str = arguments_str[:-2]
     
-    return "{0} {{{1}}}".format(resource, arguments_str)
+    return unicode("{0} {{{1}}}").format(resource, arguments_str)

+ 2 - 0
ambari-common/src/main/python/resource_management/core/providers/system.py

@@ -101,6 +101,7 @@ class FileProvider(Provider):
       if content is not None:
         with open(path, "rb") as fp:
           old_content = fp.read()
+          old_content = old_content.decode(self.resource.encoding) if self.resource.encoding else old_content
         if content != old_content:
           write = True
           reason = "contents don't match"
@@ -111,6 +112,7 @@ class FileProvider(Provider):
       Logger.info("Writing %s because %s" % (self.resource, reason))
       with open(path, "wb") as fp:
         if content:
+          content = content.encode(self.resource.encoding) if self.resource.encoding else content
           fp.write(content)
 
     _ensure_metadata(self.resource.path, self.resource.owner,

+ 1 - 0
ambari-common/src/main/python/resource_management/core/resources/system.py

@@ -35,6 +35,7 @@ class File(Resource):
   content = ResourceArgument()
   # whether to replace files with different content
   replace = ResourceArgument(default=True)
+  encoding = ResourceArgument()
 
   actions = Resource.actions + ["create", "delete"]
 

+ 1 - 1
ambari-common/src/main/python/resource_management/libraries/functions/format.py

@@ -66,7 +66,7 @@ class ConfigurationFormatter(Formatter):
   
   def _convert_field(self, value, conversion, is_protected):
     if conversion == 'e':
-      return quote_bash_args(str(value))
+      return quote_bash_args(unicode(value))
     elif conversion == 'h':
       return "[PROTECTED]" if is_protected else value
     elif conversion == 'p':

+ 2 - 1
ambari-common/src/main/python/resource_management/libraries/providers/xml_config.py

@@ -57,5 +57,6 @@ class XmlConfigProvider(Provider):
         content = config_content,
         owner = self.resource.owner,
         group = self.resource.group,
-        mode = self.resource.mode
+        mode = self.resource.mode,
+        encoding = self.resource.encoding
       )

+ 2 - 0
ambari-common/src/main/python/resource_management/libraries/resources/xml_config.py

@@ -35,4 +35,6 @@ class XmlConfig(Resource):
   owner = ResourceArgument()
   group = ResourceArgument()
 
+  encoding = ResourceArgument(default="UTF-8")
+
   actions = Resource.actions + ["create"]