aboutsummaryrefslogtreecommitdiffstats
path: root/vicn/core/resource_factory.py
diff options
context:
space:
mode:
Diffstat (limited to 'vicn/core/resource_factory.py')
-rw-r--r--vicn/core/resource_factory.py84
1 files changed, 84 insertions, 0 deletions
diff --git a/vicn/core/resource_factory.py b/vicn/core/resource_factory.py
new file mode 100644
index 00000000..15504729
--- /dev/null
+++ b/vicn/core/resource_factory.py
@@ -0,0 +1,84 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017 Cisco and/or its affiliates.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import copy
+import inspect
+import logging
+import pkgutil
+import traceback
+
+from netmodel.model.type import Type
+from netmodel.util.singleton import Singleton
+
+log = logging.getLogger(__name__)
+
+# Blacklist : resource that are temporarily disabled loaded
+RESOURCE_BLACKLIST = ['LinuxBridge']
+
+class ResourceFactory(metaclass=Singleton):
+ """
+ This manages classes, not instances
+ """
+
+ def __init__(self):
+ self._registry = dict()
+ self._register_all()
+
+ def _register_all(self):
+ log.info("Registering resources")
+ from vicn.core.resource import Resource
+
+ from vicn import resource as package
+ prefix = package.__name__ + "."
+
+ # Because aggregates might not be instanciated in order, we accumulate
+ # them and register them at the end
+ delayed_aggregates = dict()
+
+ # Explored modules are automatically imported by walk_modules + it
+ # allows to explore recursively resources/
+ # http://docs.python.org/2/library/pkgutil.html
+ for importer, modname, ispkg in pkgutil.walk_packages(package.__path__,
+ prefix, onerror = None):
+ try:
+ module = __import__(modname, fromlist = "dummy")
+
+ classes = [m[1] for m in inspect.getmembers(module,
+ inspect.isclass) if m[1].__module__ == modname]
+ for cls in classes:
+ if not issubclass(cls, Resource):
+ continue
+
+ if cls.__name__ in RESOURCE_BLACKLIST:
+ print('Skipped blacklisted resource ' + cls.__name__)
+ continue
+
+ # Register module to resource factory
+ self._registry[cls.__qualname__] = cls
+ Type._registry[cls.__qualname__.lower()] = cls
+
+ except Exception as e:
+ log.warning("Cannot load %s : %s: %s" % (modname, e,
+ traceback.format_exc()))
+
+ log.info("Registered resources are: {%s}" % ", ".join(sorted(
+ self._registry.keys())))
+
+ def get_available_resources(self):
+ return self._registry
+