move plugins from from ccsdk to dcaegen2
[dcaegen2/platform/plugins.git] / k8s / k8splugin / cloudify_importer.py
1 # #######
2 # Copyright (c) 2017 GigaSpaces Technologies Ltd. All rights reserved
3 # Copyright (c) 2019 Pantheon.tech. All rights reserved
4 # Copyright (c) 2020 AT&T Intellectual Property. All rights reserved
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 #        http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17
18 # Copied and updated for python3 from cloudify-python-importer
19
20 from __future__ import print_function
21
22 import sys
23 import imp
24 import os
25 try:
26     import builtins
27 except ImportError:
28     import __builtin__ as builtins
29
30
31 class _OurImporter(object):
32
33     def __init__(self, dir_name, load_file):
34         self.dirname = dir_name
35         self.load_file = load_file
36
37     def load_module(self, package_name):
38         try:
39             return sys.modules[package_name]
40         except KeyError:
41             pass
42
43         if self.load_file:
44             try:
45                 fp, pathname, description = imp.find_module(
46                     package_name.split(".")[-1],
47                     ["/".join(self.dirname.split("/")[:-1])]
48                 )
49                 m = imp.load_module(package_name, fp, pathname, description)
50             except ImportError as e:
51                 raise e
52         else:
53             m = imp.new_module(package_name)
54
55             m.__name__ = package_name
56             m.__path__ = [self.dirname]
57             m.__doc__ = None
58
59         m.__loader__ = self
60
61         sys.modules.setdefault(package_name, m)
62         return m
63
64
65 class _OurFinder(object):
66
67     def __init__(self, dir_name):
68         self.dir_name = dir_name
69
70     def find_module(self, package_name):
71         real_path = "/".join(package_name.split("."))
72
73         for path in [self.dir_name] + sys.path:
74
75             full_name = os.path.abspath(path) + "/" + real_path
76             dir_root = os.path.abspath(path) + "/" + real_path.split("/")[0]
77
78             if os.path.isfile(path + "/" + real_path + ".py"):
79                 return _OurImporter(full_name, True)
80
81             if os.path.isdir(full_name):
82                 if not os.path.isfile(dir_root + "/" + "__init__.py"):
83                     print('Creating __init__.py in', dir_root, file=sys.stderr)
84                     with open(dir_root + "/" + "__init__.py", 'a+') as file:
85                         file.write("# Created by importer")
86                     return _OurImporter(dir_root, False)
87
88                 return _OurImporter(full_name, True)
89
90         return None
91
92
93 def _check_import(dir_name):
94     return _OurFinder(dir_name)
95
96
97 def register_callback():
98     sys.path_hooks.append(_check_import)
99
100     save_import = builtins.__import__
101
102     def new_import(*argv, **kwargs):
103         try:
104             module = save_import(*argv, **kwargs)
105         except ImportError as e:
106             finder = _OurFinder("")
107             if not finder:
108                 raise e
109             importer = finder.find_module(argv[0])
110             if not importer:
111                 raise e
112             module = importer.load_module(argv[0])
113             if not module:
114                 raise e
115
116         return module
117
118     builtins.__import__ = new_import
119
120
121 register_callback()