{"action":"created","comment":{"url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/comments/45748054","id":45748054,"diff_hunk":"@@ -117,145 +90,56 @@ def set_max_queue_size(self, max_queue_size):\n         \"\"\"\n         self.max_queue_size = max_queue_size\n \n-    def load_and_init(self):\n+    def load_and_init(self, mod_confs):\n         \"\"\"Import, instanciate & \"init\" the modules we have been requested\n \n         :return: None\n         \"\"\"\n-        self.load()\n+        self.load(mod_confs)\n         self.get_instances()\n \n-    @classmethod\n-    def try_best_load(cls, name, package=None):\n-        \"\"\"Try to load module in the bast way possible (using importlib)\n-\n-        :param name: module name to load\n-        :type name: str\n-        :param package: package name to load module from\n-        :type package:\n-        :return: None | module\n-        :rtype:\n+    @staticmethod\n+    def find_module_properties_and_get_instance(module, mod_name):\n         \"\"\"\n-        try:\n-            mod = importlib.import_module(name, package)\n-        except Exception as err:\n-            logger.warning(\"Cannot import %s : %s\",\n-                           '%s.%s' % (package, name) if package else name,\n-                           err)\n-            return\n-        # if the module have a 'properties' and a 'get_instance'\n-        # then we are happy and we'll use that:\n-        try:\n-            mod.properties\n-            mod.get_instance\n-        except AttributeError:\n-            return\n-        return mod\n-\n-    @classmethod\n-    def try_very_bad_load(cls, mod_dir):\n-        \"\"\"Try to load module in a bad way (Inserting mod_dir to sys.path)\n-        then try to import module (module.py file) in this directory with importlib\n+        Get properties and get_instance of a module\n \n-        :param mod_dir: module directory to load\n-        :type mod_dir: str\n+        :param module: module object\n+        :type module: object\n+        :param mod_name: Name of the module\n+        :type mod_name: str\n         :return: None\n         \"\"\"\n-        prev_module = sys.modules.get('module')  # cache locally any previously imported 'module' ..\n-        logger.warning(\n-            \"Trying to load %r as an (very-)old-style alignak \\\"module\\\" : \"\n-            \"by adding its path to sys.path. This can be (very) bad in case \"\n-            \"of name conflicts within the files part of %s and others \"\n-            \"top-level python modules; I'll try to limit that.\",\n-            # by removing the mod_dir from sys.path after while.\n-            mod_dir, mod_dir\n-        )\n-        sys.path.insert(0, mod_dir)\n         try:\n-            return importlib.import_module('module')\n-        except Exception as err:\n-            logger.exception(\"Could not import bare 'module.py' from %s : %s\", mod_dir, err)\n+            module.properties\n+            module.get_instance\n+        except AttributeError:\n+            pass\n+        else:\n+            # good module style\n             return\n-        finally:\n-            sys.path.remove(mod_dir)\n-            if prev_module is not None:  # and restore it after we have loaded our one (or not)\n-                sys.modules['module'] = prev_module\n-\n-    @classmethod\n-    def try_load(cls, mod_name, mod_dir=None):\n-        \"\"\"Try in three different ways to load a module\n+        submod = importlib.import_module('.module', mod_name)\n+        # old style:\n+        module.properties = submod.properties\n+        module.get_instance = submod.get_instance\n \n-        :param mod_name: module name to load\n-        :type mod_name: str\n-        :param mod_dir: module directory where module is\n-        :type mod_dir: str | None\n-        :return: module\n-        :rtype: object\n+    def load(self, mod_confs):\n         \"\"\"\n-        msg = ''\n-        mod = cls.try_best_load(mod_name)\n-        if mod:\n-            msg = \"Correctly loaded %s as a very-new-style alignak module :)\"\n-        else:\n-            mod = cls.try_best_load('.module', mod_name)\n-            if mod:\n-                msg = \"Correctly loaded %s as an old-new-style alignak module :|\"\n-            elif mod_dir:\n-                mod = cls.try_very_bad_load(mod_dir)\n-                if mod:\n-                    msg = \"Correctly loaded %s as a very old-style alignak module :s\"\n-        if msg:\n-            logger.info(msg, mod_name)\n-        return mod\n-\n-    def load(self):\n-        \"\"\"Try to import the requested modules ; put the imported modules in self.imported_modules.\n-        The previous imported modules, if any, are cleaned before.\n-\n-        :return: None\n+        Try to import the requested modules ; put the imported modules in self.imported_modules.\n         \"\"\"\n-        if self.modules_path not in sys.path:\n-            sys.path.append(self.modules_path)\n-\n-        alignak_modules_path = sys.modules['alignak'].__path__[0] + '/modules'\n-        if alignak_modules_path not in sys.path:\n-            sys.path.append(alignak_modules_path)\n-\n-        modules_paths = [alignak_modules_path, self.modules_path]\n-\n-        modules_files = []\n-        for path in modules_paths:\n-            for fname in listdir(path):\n-                if isdir(join(path, fname)):\n-                    modules_files.append({'path': path, 'name': fname})\n-\n-        del self.imported_modules[:]\n-        for module in modules_files:\n-            mod_file = abspath(join(module['path'], module['name'], 'module.py'))\n-            mod_dir = os.path.normpath(os.path.dirname(mod_file))\n-            mod = self.try_load(module['name'], mod_dir)\n-            if not mod:\n-                continue\n-            try:\n-                is_our_type = self.modules_type in mod.properties['daemons']\n-            except Exception as err:\n-                logger.warning(\"Bad module file for %s : cannot check its properties['daemons']\"\n-                               \"attribute : %s\", mod_file, err)\n-            else:  # We want to keep only the modules of our type\n-                if is_our_type:\n-                    self.imported_modules.append(mod)\n \n         # Now we want to find in theses modules the ones we are looking for\n         del self.modules_assoc[:]\n-        for mod_conf in self.modules:\n-            module_type = uniform_module_type(mod_conf.module_type)\n-            for module in self.imported_modules:\n-                if uniform_module_type(module.properties['type']) == module_type:\n-                    self.modules_assoc.append((mod_conf, module))\n-                    break\n-            else:  # No module is suitable, we emit a Warning\n-                logger.warning(\"The module type %s for %s was not found in modules!\",\n-                               module_type, mod_conf.get_name())\n+        for mod_conf in mod_confs:\n+            try:\n+                module = importlib.import_module(mod_conf.module_type)\n+                self.find_module_properties_and_get_instance(module, mod_conf.module_type)","path":"alignak/modulesmanager.py","position":230,"original_position":230,"commit_id":"c720464b0b5ddffb9e405306509ea7ef7f2119e3","original_commit_id":"c720464b0b5ddffb9e405306509ea7ef7f2119e3","user":{"login":"gst","id":38055,"avatar_url":"https://avatars.githubusercontent.com/u/38055?v=3","gravatar_id":"","url":"https://api.github.com/users/gst","html_url":"https://github.com/gst","followers_url":"https://api.github.com/users/gst/followers","following_url":"https://api.github.com/users/gst/following{/other_user}","gists_url":"https://api.github.com/users/gst/gists{/gist_id}","starred_url":"https://api.github.com/users/gst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gst/subscriptions","organizations_url":"https://api.github.com/users/gst/orgs","repos_url":"https://api.github.com/users/gst/repos","events_url":"https://api.github.com/users/gst/events{/privacy}","received_events_url":"https://api.github.com/users/gst/received_events","type":"User","site_admin":false},"body":"> Are you mixing module_type and module name on purpose (see the name variable in find_module_properties_and_get_instace) ?\r\n\r\nNo. re-read find_module_properties_and_get_instance() docstring ;)\r\nHint: the alignak \"module_type\" (there is also the alignak \"module_name\" effectively, which makes it even more confusing) vs python module name (distinction/difference or not) **is** confusing.. I really wish we could have renamed (sooner than latter) the \"module\" concept name to something less confusing..\r\n\r\nBut anyway, the function should be (clarified/reworked/) finished actually, it isn't suffisient **at all** I'm afraid / sure.. (the try/except/else is actually to be able to detect \"new-style\" vs \"old-style\" shinken/alignak module but it doesn't do more than that, while it should..)\r\n","created_at":"2015-11-24T15:18:40Z","updated_at":"2015-11-24T15:18:40Z","html_url":"https://github.com/Alignak-monitoring/alignak/pull/240#discussion_r45748054","pull_request_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240","_links":{"self":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/comments/45748054"},"html":{"href":"https://github.com/Alignak-monitoring/alignak/pull/240#discussion_r45748054"},"pull_request":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240"}}},"pull_request":{"url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240","id":49313246,"html_url":"https://github.com/Alignak-monitoring/alignak/pull/240","diff_url":"https://github.com/Alignak-monitoring/alignak/pull/240.diff","patch_url":"https://github.com/Alignak-monitoring/alignak/pull/240.patch","issue_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/240","number":240,"state":"open","locked":false,"title":"Simplify modules manager","user":{"login":"gst","id":38055,"avatar_url":"https://avatars.githubusercontent.com/u/38055?v=3","gravatar_id":"","url":"https://api.github.com/users/gst","html_url":"https://github.com/gst","followers_url":"https://api.github.com/users/gst/followers","following_url":"https://api.github.com/users/gst/following{/other_user}","gists_url":"https://api.github.com/users/gst/gists{/gist_id}","starred_url":"https://api.github.com/users/gst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gst/subscriptions","organizations_url":"https://api.github.com/users/gst/orgs","repos_url":"https://api.github.com/users/gst/repos","events_url":"https://api.github.com/users/gst/events{/privacy}","received_events_url":"https://api.github.com/users/gst/received_events","type":"User","site_admin":false},"body":"Simplify modules manager. So we:\r\n* Remove modules_dir and load in a folder\r\n* Will be able to load modules declared like before, but load packages (so can be installed by pip) with name like alignak_module_*\r\n\r\nSo we remove the compatibility with shinken modules, but we will fork most important / used and packages them properly and diffused through pip.\r\n\r\nYou can see the code of packages working with this feature:\r\n* mod-example: https://github.com/Alignak-monitoring/mod-example/tree/rollback_namespace_package_feature\r\n* mod-alignakbackend: https://github.com/Alignak-monitoring-contrib/mod-alignakbackend\r\n* mod-nsca: https://github.com/Alignak-monitoring-contrib/mod-nsca","created_at":"2015-10-30T19:35:37Z","updated_at":"2015-11-24T15:18:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9c87c80ee40758c376dba30949f5e8608ea203d8","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240/commits","review_comments_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240/comments","review_comment_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/240/comments","statuses_url":"https://api.github.com/repos/Alignak-monitoring/alignak/statuses/c720464b0b5ddffb9e405306509ea7ef7f2119e3","head":{"label":"Alignak-monitoring:simplify_modules_manager","ref":"simplify_modules_manager","sha":"c720464b0b5ddffb9e405306509ea7ef7f2119e3","user":{"login":"Alignak-monitoring","id":12305279,"avatar_url":"https://avatars.githubusercontent.com/u/12305279?v=3","gravatar_id":"","url":"https://api.github.com/users/Alignak-monitoring","html_url":"https://github.com/Alignak-monitoring","followers_url":"https://api.github.com/users/Alignak-monitoring/followers","following_url":"https://api.github.com/users/Alignak-monitoring/following{/other_user}","gists_url":"https://api.github.com/users/Alignak-monitoring/gists{/gist_id}","starred_url":"https://api.github.com/users/Alignak-monitoring/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alignak-monitoring/subscriptions","organizations_url":"https://api.github.com/users/Alignak-monitoring/orgs","repos_url":"https://api.github.com/users/Alignak-monitoring/repos","events_url":"https://api.github.com/users/Alignak-monitoring/events{/privacy}","received_events_url":"https://api.github.com/users/Alignak-monitoring/received_events","type":"Organization","site_admin":false},"repo":{"id":35242228,"name":"alignak","full_name":"Alignak-monitoring/alignak","owner":{"login":"Alignak-monitoring","id":12305279,"avatar_url":"https://avatars.githubusercontent.com/u/12305279?v=3","gravatar_id":"","url":"https://api.github.com/users/Alignak-monitoring","html_url":"https://github.com/Alignak-monitoring","followers_url":"https://api.github.com/users/Alignak-monitoring/followers","following_url":"https://api.github.com/users/Alignak-monitoring/following{/other_user}","gists_url":"https://api.github.com/users/Alignak-monitoring/gists{/gist_id}","starred_url":"https://api.github.com/users/Alignak-monitoring/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alignak-monitoring/subscriptions","organizations_url":"https://api.github.com/users/Alignak-monitoring/orgs","repos_url":"https://api.github.com/users/Alignak-monitoring/repos","events_url":"https://api.github.com/users/Alignak-monitoring/events{/privacy}","received_events_url":"https://api.github.com/users/Alignak-monitoring/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Alignak-monitoring/alignak","description":"Monitoring tool, highly flexible and new standard oriented","fork":false,"url":"https://api.github.com/repos/Alignak-monitoring/alignak","forks_url":"https://api.github.com/repos/Alignak-monitoring/alignak/forks","keys_url":"https://api.github.com/repos/Alignak-monitoring/alignak/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Alignak-monitoring/alignak/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Alignak-monitoring/alignak/teams","hooks_url":"https://api.github.com/repos/Alignak-monitoring/alignak/hooks","issue_events_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/events{/number}","events_url":"https://api.github.com/repos/Alignak-monitoring/alignak/events","assignees_url":"https://api.github.com/repos/Alignak-monitoring/alignak/assignees{/user}","branches_url":"https://api.github.com/repos/Alignak-monitoring/alignak/branches{/branch}","tags_url":"https://api.github.com/repos/Alignak-monitoring/alignak/tags","blobs_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/refs{/sha}","trees_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Alignak-monitoring/alignak/statuses/{sha}","languages_url":"https://api.github.com/repos/Alignak-monitoring/alignak/languages","stargazers_url":"https://api.github.com/repos/Alignak-monitoring/alignak/stargazers","contributors_url":"https://api.github.com/repos/Alignak-monitoring/alignak/contributors","subscribers_url":"https://api.github.com/repos/Alignak-monitoring/alignak/subscribers","subscription_url":"https://api.github.com/repos/Alignak-monitoring/alignak/subscription","commits_url":"https://api.github.com/repos/Alignak-monitoring/alignak/commits{/sha}","git_commits_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/commits{/sha}","comments_url":"https://api.github.com/repos/Alignak-monitoring/alignak/comments{/number}","issue_comment_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/comments{/number}","contents_url":"https://api.github.com/repos/Alignak-monitoring/alignak/contents/{+path}","compare_url":"https://api.github.com/repos/Alignak-monitoring/alignak/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Alignak-monitoring/alignak/merges","archive_url":"https://api.github.com/repos/Alignak-monitoring/alignak/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Alignak-monitoring/alignak/downloads","issues_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues{/number}","pulls_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls{/number}","milestones_url":"https://api.github.com/repos/Alignak-monitoring/alignak/milestones{/number}","notifications_url":"https://api.github.com/repos/Alignak-monitoring/alignak/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Alignak-monitoring/alignak/labels{/name}","releases_url":"https://api.github.com/repos/Alignak-monitoring/alignak/releases{/id}","created_at":"2015-05-07T20:35:42Z","updated_at":"2015-11-24T03:05:13Z","pushed_at":"2015-11-24T00:12:27Z","git_url":"git://github.com/Alignak-monitoring/alignak.git","ssh_url":"git@github.com:Alignak-monitoring/alignak.git","clone_url":"https://github.com/Alignak-monitoring/alignak.git","svn_url":"https://github.com/Alignak-monitoring/alignak","homepage":"https://alignak-monitoring.github.io","size":43896,"stargazers_count":18,"watchers_count":18,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":55,"forks":10,"open_issues":55,"watchers":18,"default_branch":"develop"}},"base":{"label":"Alignak-monitoring:develop","ref":"develop","sha":"0cf348d1e64a215f83c671738bf3fa3a0906751b","user":{"login":"Alignak-monitoring","id":12305279,"avatar_url":"https://avatars.githubusercontent.com/u/12305279?v=3","gravatar_id":"","url":"https://api.github.com/users/Alignak-monitoring","html_url":"https://github.com/Alignak-monitoring","followers_url":"https://api.github.com/users/Alignak-monitoring/followers","following_url":"https://api.github.com/users/Alignak-monitoring/following{/other_user}","gists_url":"https://api.github.com/users/Alignak-monitoring/gists{/gist_id}","starred_url":"https://api.github.com/users/Alignak-monitoring/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alignak-monitoring/subscriptions","organizations_url":"https://api.github.com/users/Alignak-monitoring/orgs","repos_url":"https://api.github.com/users/Alignak-monitoring/repos","events_url":"https://api.github.com/users/Alignak-monitoring/events{/privacy}","received_events_url":"https://api.github.com/users/Alignak-monitoring/received_events","type":"Organization","site_admin":false},"repo":{"id":35242228,"name":"alignak","full_name":"Alignak-monitoring/alignak","owner":{"login":"Alignak-monitoring","id":12305279,"avatar_url":"https://avatars.githubusercontent.com/u/12305279?v=3","gravatar_id":"","url":"https://api.github.com/users/Alignak-monitoring","html_url":"https://github.com/Alignak-monitoring","followers_url":"https://api.github.com/users/Alignak-monitoring/followers","following_url":"https://api.github.com/users/Alignak-monitoring/following{/other_user}","gists_url":"https://api.github.com/users/Alignak-monitoring/gists{/gist_id}","starred_url":"https://api.github.com/users/Alignak-monitoring/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Alignak-monitoring/subscriptions","organizations_url":"https://api.github.com/users/Alignak-monitoring/orgs","repos_url":"https://api.github.com/users/Alignak-monitoring/repos","events_url":"https://api.github.com/users/Alignak-monitoring/events{/privacy}","received_events_url":"https://api.github.com/users/Alignak-monitoring/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Alignak-monitoring/alignak","description":"Monitoring tool, highly flexible and new standard oriented","fork":false,"url":"https://api.github.com/repos/Alignak-monitoring/alignak","forks_url":"https://api.github.com/repos/Alignak-monitoring/alignak/forks","keys_url":"https://api.github.com/repos/Alignak-monitoring/alignak/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Alignak-monitoring/alignak/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Alignak-monitoring/alignak/teams","hooks_url":"https://api.github.com/repos/Alignak-monitoring/alignak/hooks","issue_events_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/events{/number}","events_url":"https://api.github.com/repos/Alignak-monitoring/alignak/events","assignees_url":"https://api.github.com/repos/Alignak-monitoring/alignak/assignees{/user}","branches_url":"https://api.github.com/repos/Alignak-monitoring/alignak/branches{/branch}","tags_url":"https://api.github.com/repos/Alignak-monitoring/alignak/tags","blobs_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/refs{/sha}","trees_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Alignak-monitoring/alignak/statuses/{sha}","languages_url":"https://api.github.com/repos/Alignak-monitoring/alignak/languages","stargazers_url":"https://api.github.com/repos/Alignak-monitoring/alignak/stargazers","contributors_url":"https://api.github.com/repos/Alignak-monitoring/alignak/contributors","subscribers_url":"https://api.github.com/repos/Alignak-monitoring/alignak/subscribers","subscription_url":"https://api.github.com/repos/Alignak-monitoring/alignak/subscription","commits_url":"https://api.github.com/repos/Alignak-monitoring/alignak/commits{/sha}","git_commits_url":"https://api.github.com/repos/Alignak-monitoring/alignak/git/commits{/sha}","comments_url":"https://api.github.com/repos/Alignak-monitoring/alignak/comments{/number}","issue_comment_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/comments{/number}","contents_url":"https://api.github.com/repos/Alignak-monitoring/alignak/contents/{+path}","compare_url":"https://api.github.com/repos/Alignak-monitoring/alignak/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Alignak-monitoring/alignak/merges","archive_url":"https://api.github.com/repos/Alignak-monitoring/alignak/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Alignak-monitoring/alignak/downloads","issues_url":"https://api.github.com/repos/Alignak-monitoring/alignak/issues{/number}","pulls_url":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls{/number}","milestones_url":"https://api.github.com/repos/Alignak-monitoring/alignak/milestones{/number}","notifications_url":"https://api.github.com/repos/Alignak-monitoring/alignak/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Alignak-monitoring/alignak/labels{/name}","releases_url":"https://api.github.com/repos/Alignak-monitoring/alignak/releases{/id}","created_at":"2015-05-07T20:35:42Z","updated_at":"2015-11-24T03:05:13Z","pushed_at":"2015-11-24T00:12:27Z","git_url":"git://github.com/Alignak-monitoring/alignak.git","ssh_url":"git@github.com:Alignak-monitoring/alignak.git","clone_url":"https://github.com/Alignak-monitoring/alignak.git","svn_url":"https://github.com/Alignak-monitoring/alignak","homepage":"https://alignak-monitoring.github.io","size":43896,"stargazers_count":18,"watchers_count":18,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":10,"mirror_url":null,"open_issues_count":55,"forks":10,"open_issues":55,"watchers":18,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240"},"html":{"href":"https://github.com/Alignak-monitoring/alignak/pull/240"},"issue":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/240"},"comments":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/issues/240/comments"},"review_comments":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240/comments"},"review_comment":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/pulls/240/commits"},"statuses":{"href":"https://api.github.com/repos/Alignak-monitoring/alignak/statuses/c720464b0b5ddffb9e405306509ea7ef7f2119e3"}}}}