瀏覽代碼

AMBARI-8317 Refactor the OS-dependent Ambari Server Windows components

Pass 1.1
Preliminary changes. Introducing OS-dependent abstraction for functions.
Florian Barca 10 年之前
父節點
當前提交
e4b2d34b6b
共有 1 個文件被更改,包括 37 次插入5 次删除
  1. 37 5
      ambari-common/src/main/python/ambari_commons/os_family_impl.py

+ 37 - 5
ambari-common/src/main/python/ambari_commons/os_family_impl.py

@@ -17,17 +17,20 @@ limitations under the License.
 '''
 '''
 
 
 import types
 import types
-from os_check import OSCheck
+from ambari_commons import OSCheck
 
 
 
 
 class OsFamilyImpl(object):
 class OsFamilyImpl(object):
   """
   """
-  Base class for os depended factory. Usage::
+  Base class for os dependent factory. Usage::
 
 
       class BaseFoo(object): pass
       class BaseFoo(object): pass
-      @Factory("windows")
-      class OsFoo(object):pass
-      print BaseFoo()# OsFoo
+      @OsFamilyImpl(os_family="windows")
+      class OsFooW(BaseFoo):pass
+      print BaseFoo()# OsFooW
+      @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
+      class OsFooD(BaseFoo):pass
+      print BaseFoo()# OsFooD
 
 
   """
   """
 
 
@@ -62,3 +65,32 @@ class OsFamilyImpl(object):
     base_cls.__new__ = types.MethodType(new, base_cls)
     base_cls.__new__ = types.MethodType(new, base_cls)
 
 
     return cls
     return cls
+
+class OsFamilyFuncImpl(object):
+  """
+  Base class for os dependent function. Usage::
+
+      @OSFamilyFuncImpl(os_family="windows")
+      def os_foo(...):pass
+
+  """
+  _func_impls = {}
+
+  def _createFunctionInstance(self, func):
+    self._func_impls[func.__module__ + "." + func.__name__ + "." + self.os_const] = func
+
+    def thunk(*args, **kwargs):
+      fn_id_base = func.__module__ + "." + func.__name__
+      fn_id = fn_id_base + "." + OSCheck.get_os_family()
+      if fn_id not in self._func_impls:
+        fn_id = fn_id_base + "." + OsFamilyImpl.DEFAULT
+
+      fn = self._func_impls[fn_id]
+      return fn(*args, **kwargs)
+    return thunk
+
+  def __init__(self, os_family):
+    self.os_const = os_family
+
+  def __call__(self, func):
+    return self._createFunctionInstance(func)