Require link finders to subclass base FindLinks class 41/40941/2
authorIlia Abashin <abashinos@gmail.com>
Sun, 3 Sep 2017 14:11:34 +0000 (17:11 +0300)
committerIlia Abashin <abashinos@gmail.com>
Sun, 3 Sep 2017 14:14:36 +0000 (17:14 +0300)
Change-Id: I1f82c311b4ab4bb9b40327040b409d265d66d68a
Signed-off-by: Ilia Abashin <abashinos@gmail.com>
app/discover/link_finders/find_links_metadata_parser.py

index 1f28262..a1e290c 100644 (file)
@@ -1,3 +1,12 @@
+###############################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems)   #
+# and others                                                                  #
+#                                                                             #
+# All rights reserved. This program and the accompanying materials            #
+# are made available under the terms of the Apache License, Version 2.0       #
+# which accompanies this distribution, and is available at                    #
+# http://www.apache.org/licenses/LICENSE-2.0                                  #
+###############################################################################
 from utils.metadata_parser import MetadataParser
 from utils.util import ClassResolver
 
@@ -13,6 +22,7 @@ class FindLinksMetadataParser(MetadataParser):
     def __init__(self):
         super().__init__()
         self.finders_package = None
+        self.base_finder_class = None
         self.base_finder = None
         self.link_finders = []
 
@@ -23,11 +33,17 @@ class FindLinksMetadataParser(MetadataParser):
                 .get_instance_of_class(package_name=self.finders_package,
                                        module_name=module_name,
                                        class_name=finder_class)
+
         except ValueError:
             instance = None
 
         if instance:
-            self.link_finders.append(instance)
+            if isinstance(instance, self.base_finder.__class__):
+                self.link_finders.append(instance)
+            else:
+                self.add_error('Link finder "{}" should subclass '
+                               'base link finder "{}"'
+                               .format(finder_class, self.base_finder_class))
         else:
             self.add_error('Failed to import link finder class "{}"'
                            .format(finder_class))
@@ -35,16 +51,22 @@ class FindLinksMetadataParser(MetadataParser):
     def validate_metadata(self, metadata: dict):
         super().validate_metadata(metadata)
         self.finders_package = metadata[self.FINDERS_PACKAGE]
-        self.base_finder = metadata[self.BASE_FINDER]
+        self.base_finder_class = metadata[self.BASE_FINDER]
         base_finder_module = ClassResolver\
-            .get_module_file_by_class_name(self.base_finder)
+            .get_module_file_by_class_name(self.base_finder_class)
 
-        base_finder_class = ClassResolver.get_class_name_by_module(
-            ".".join((self.finders_package, base_finder_module)))
+        try:
+            self.base_finder = ClassResolver\
+                .get_instance_of_class(package_name=self.finders_package,
+                                       module_name=base_finder_module,
+                                       class_name=self.base_finder_class)
+        except ValueError:
+            self.base_finder = None
 
-        if not base_finder_class:
-            self.add_error("Couldn't find base link finder class")
-            return
+        if not self.base_finder:
+            self.add_error("Couldn't create base link finder instance"
+                           "for class name '{}'".format(self.base_finder_class))
+            return False
 
         for link_finder in metadata[self.LINK_FINDERS]:
             self.validate_link_finder(finder_class=link_finder)