File 0003-add-a-NoopPackagerMixin-class.patch of Package openstack-trove-doc

diff --git a/trove/guestagent/pkg.py b/trove/guestagent/pkg.py
index 080a748..4225aac 100644
--- a/trove/guestagent/pkg.py
+++ b/trove/guestagent/pkg.py
@@ -21,6 +21,7 @@ import re
 from tempfile import NamedTemporaryFile
 
 import pexpect
+import six
 
 from trove.common import exception
 from trove.common import utils
@@ -73,7 +74,7 @@ class PkgBrokenError(exception.TroveError):
     pass
 
 
-class BasePackagerMixin:
+class BasePackagerMixin(object):
 
     def pexpect_kill_proc(self, child):
         child.delayafterclose = 1
@@ -394,17 +395,31 @@ class DebianPackagerMixin(BasePackagerMixin):
                                            % package_name)
 
 
+class NoopPackagerMixin(BasePackagerMixin):
+    """A no-op packager which does no action, but logs all calls."""
+    def __getattribute__(self, name):
+        def noop(*args, **kwargs):
+            LOG.warn(_("Tried to call the %(name)s method with "
+                       "%(args)s %(kwargs)s on an unsupported operating "
+                       "system. No action will be done.") %
+                     dict(name=name, args=args or '', kwargs=kwargs or ''))
+            return True
+        return noop
+
+
 class BasePackage(type):
 
     def __new__(meta, name, bases, dct):
-        if operating_system.get_os() == operating_system.REDHAT:
+        os = operating_system.get_os()
+        if os == operating_system.REDHAT:
             bases += (RedhatPackagerMixin, )
-        else:
-            # The default is debian
+        elif os == operating_system.DEBIAN:
             bases += (DebianPackagerMixin,)
+        else:
+            bases += (NoopPackagerMixin,)
         return super(BasePackage, meta).__new__(meta, name, bases, dct)
 
 
-class Package(object):
-
-    __metaclass__ = BasePackage
+@six.add_metaclass(BasePackage)
+class Package:
+    pass
diff --git a/trove/tests/unittests/guestagent/test_pkg.py b/trove/tests/unittests/guestagent/test_pkg.py
index 864b2f5..c6dc9e3 100644
--- a/trove/tests/unittests/guestagent/test_pkg.py
+++ b/trove/tests/unittests/guestagent/test_pkg.py
@@ -14,7 +14,7 @@
 #    under the License.
 
 import testtools
-from mock import Mock, MagicMock
+from mock import Mock, MagicMock, patch
 import pexpect
 from trove.common import utils
 from trove.guestagent import pkg
@@ -451,3 +451,30 @@ class PkgRPMRemoveTestCase(testtools.TestCase):
         # test and verify
         self.assertRaises(pkg.PkgTimeout, self.pkg.pkg_remove,
                           self.pkgName, 5000)
+
+
+class PkgNoopInstallTestCase(testtools.TestCase):
+    def setUp(self):
+        super(PkgNoopInstallTestCase, self).setUp()
+        self.pkg = pkg.NoopPackagerMixin()
+
+    def tearDown(self):
+        super(PkgNoopInstallTestCase, self).tearDown()
+
+    def test_pkg_is_instaled_no_packages(self):
+        packages = []
+        with patch.object(pkg.LOG, 'warn') as warn:
+            self.assertTrue(self.pkg.pkg_is_installed(packages))
+            warn.assert_called_with(
+                "Tried to call the pkg_is_installed method with "
+                "([],)  on an unsupported operating "
+                "system. No action will be done.")
+
+    def test_pkg_is_instaled_yes(self):
+        packages = ["package1=1.0", "package2"]
+        with patch.object(pkg.LOG, 'warn') as warn:
+            self.assertTrue(self.pkg.pkg_is_installed(packages))
+            warn.assert_called_with(
+                "Tried to call the pkg_is_installed method with "
+                "(['package1=1.0', 'package2'],)  on an unsupported operating "
+                "system. No action will be done.")
openSUSE Build Service is sponsored by