)]}'
{"etc/nova/nova.conf.sample":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"5d066c57c71460ba1bec2b7b945546970760d25a","unresolved":false,"context_lines":[{"line_number":651,"context_line":"# Options defined in nova.compute.manager"},{"line_number":652,"context_line":"#"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"# Monitor classes available to the compute which may be"},{"line_number":655,"context_line":"# specified more than once. (multi valued)"},{"line_number":656,"context_line":"#compute_available_monitors\u003dnova.compute.monitors.all_monitors"},{"line_number":657,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":26,"id":"AAAASn%2F%2Fbf4%3D","line":654,"updated":"2013-09-04 20:34:15.000000000","message":"why not put this in [compute_monitors] ?\n\nhttps://review.openstack.org/#/c/44007/4/etc/nova/nova.conf.sample","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"3b45b208da7ddb884477b46d05cf3194660262c7","unresolved":false,"context_lines":[{"line_number":651,"context_line":"# Options defined in nova.compute.manager"},{"line_number":652,"context_line":"#"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"# Monitor classes available to the compute which may be"},{"line_number":655,"context_line":"# specified more than once. (multi valued)"},{"line_number":656,"context_line":"#compute_available_monitors\u003dnova.compute.monitors.all_monitors"},{"line_number":657,"context_line":""}],"source_content_type":"application/octet-stream","patch_set":26,"id":"AAAASn%2F%2FY1M%3D","line":654,"in_reply_to":"AAAASn%2F%2Fbf4%3D","updated":"2013-09-05 10:53:16.000000000","message":"Done","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"}],"nova/compute/manager.py":[{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"aa6fa60f5d913d837551432529e3b5988f243817","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    cfg.MultiStrOpt(\u0027compute_available_plugins\u0027,"},{"line_number":181,"context_line":"            default\u003d[\u0027nova.compute.plugins.all_plugins\u0027],"},{"line_number":182,"context_line":"            help\u003d\u0027Plugin classes available to the compute which may \u0027"},{"line_number":183,"context_line":"                    \u0027be specified more than one.\u0027),"},{"line_number":184,"context_line":"    cfg.ListOpt(\u0027compute_default_plugins\u0027,"},{"line_number":185,"context_line":"                default\u003d["},{"line_number":186,"context_line":"                  \u0027LibvirtCPUMonitorPlugin\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FgSY%3D","line":183,"updated":"2013-07-17 09:16:07.000000000","message":"\"more than once.\"","commit_id":"1ba30d450ce30277b678c23009373bb35b5bb928"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"aa6fa60f5d913d837551432529e3b5988f243817","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                    \u0027be specified more than one.\u0027),"},{"line_number":184,"context_line":"    cfg.ListOpt(\u0027compute_default_plugins\u0027,"},{"line_number":185,"context_line":"                default\u003d["},{"line_number":186,"context_line":"                  \u0027LibvirtCPUMonitorPlugin\u0027,"},{"line_number":187,"context_line":"                  ],"},{"line_number":188,"context_line":"                help\u003d\u0027Which plagin class names to use for getting compute\u0027"},{"line_number":189,"context_line":"                     \u0027resources when not specified in the request.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FgQI%3D","line":186,"updated":"2013-07-17 09:16:07.000000000","message":"I don\u0027t think something which is hypervisor specific can ever be part of a default list","commit_id":"1ba30d450ce30277b678c23009373bb35b5bb928"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"aa6fa60f5d913d837551432529e3b5988f243817","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                default\u003d["},{"line_number":186,"context_line":"                  \u0027LibvirtCPUMonitorPlugin\u0027,"},{"line_number":187,"context_line":"                  ],"},{"line_number":188,"context_line":"                help\u003d\u0027Which plagin class names to use for getting compute\u0027"},{"line_number":189,"context_line":"                     \u0027resources when not specified in the request.\u0027),"},{"line_number":190,"context_line":"    ]"},{"line_number":191,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FgSM%3D","line":188,"updated":"2013-07-17 09:16:07.000000000","message":"plagin -\u003e plugin","commit_id":"1ba30d450ce30277b678c23009373bb35b5bb928"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"aa6fa60f5d913d837551432529e3b5988f243817","unresolved":false,"context_lines":[{"line_number":4208,"context_line":"        to have an authoritative list of what is permissible. This"},{"line_number":4209,"context_line":"        function checks the plugin names and metrics names against a"},{"line_number":4210,"context_line":"        predefined set of acceptable plugins."},{"line_number":4211,"context_line":"        \"\"\""},{"line_number":4212,"context_line":"        plugin_cls_names \u003d CONF.compute_default_plugins"},{"line_number":4213,"context_line":"        if not isinstance(plugin_cls_names, (list, tuple)):"},{"line_number":4214,"context_line":"            plugin_cls_names \u003d [plugin_cls_names]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FgOA%3D","line":4211,"updated":"2013-07-17 09:16:07.000000000","message":"Since the list of plugins is something configured by the cloud provider, why does there need to be a built-in \"authorized\" list of permissible plugins ?  \n\nBoth values are \"available\" and \"default\" are coming from the same configuration file - and unlike the scheduler / host-manager (that this seems to be based on) the list isn\u0027t passed in from some other module.\n\nThis just seems to be too complex, when a simple list of plugins to use would be fine.\n\nA default (which would only be used if there is nothing specified, (and not as itseems to be used here as an authorized list ) only makes sense if there are hypervisor agnostic plugins","commit_id":"1ba30d450ce30277b678c23009373bb35b5bb928"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"220e381a77983386e39d4d2de5f7aa6f9fb04d38","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                    \u0027be specified more than once.\u0027),"},{"line_number":194,"context_line":"    cfg.ListOpt(\u0027compute_default_plugins\u0027,"},{"line_number":195,"context_line":"                default\u003d["},{"line_number":196,"context_line":"                  \u0027LibvirtCPUMonitorPlugin\u0027,"},{"line_number":197,"context_line":"                  ],"},{"line_number":198,"context_line":"                help\u003d\u0027Which plugin class names to use for getting compute\u0027"},{"line_number":199,"context_line":"                     \u0027resources when not specified in the request.\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F6DY%3D","line":196,"updated":"2013-07-22 01:12:52.000000000","message":"@Dan Prince \nhi?\nLibvirtCPUMonitorPlugin is designed on KVM , maybe do not work on the xenserver, just an example based on libvirt, because the default of compute_driver  is libvirt.LibvirtDriver . so the cloud provider can customize plugins based on defferent compute drivers.\n\nthanks","commit_id":"f49e9991fc7897847643b178eac40be2314d690c"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"5ab8bfbf6d0d4ae186cee426a45063e23257a289","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                    \u0027be specified more than once.\u0027),"},{"line_number":194,"context_line":"    cfg.ListOpt(\u0027compute_default_plugins\u0027,"},{"line_number":195,"context_line":"                default\u003d["},{"line_number":196,"context_line":"                  \u0027LibvirtCPUMonitorPlugin\u0027,"},{"line_number":197,"context_line":"                  ],"},{"line_number":198,"context_line":"                help\u003d\u0027Which plugin class names to use for getting compute\u0027"},{"line_number":199,"context_line":"                     \u0027resources when not specified in the request.\u0027),"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F2oQ%3D","line":196,"in_reply_to":"AAAAQn%2F%2F6DY%3D","updated":"2013-07-22 01:14:07.000000000","message":"Done","commit_id":"f49e9991fc7897847643b178eac40be2314d690c"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"d03b66ba589ab82ec14f8216e5fd0fd33ed15830","unresolved":false,"context_lines":[{"line_number":4659,"context_line":"                            good_plugins.append(cls(self))"},{"line_number":4660,"context_line":"                            found_class \u003d True"},{"line_number":4661,"context_line":"                    except Exception as ex:"},{"line_number":4662,"context_line":"                        LOG.warn(_(\"The plugin maybe not work : %s \"), ex)"},{"line_number":4663,"context_line":"                        pass"},{"line_number":4664,"context_line":"                    break"},{"line_number":4665,"context_line":"            if not found_class:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAARH%2F%2F%2Ffc%3D","line":4662,"updated":"2013-08-14 03:10:57.000000000","message":"Nit: perhaps word as \"The plugin may not work : %s\" (i.e., s/maybe/may).","commit_id":"76a6953b84b7b15f9f2b824f9d0563132d9561e2"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"76d2dedaeb5090b410c523afbb2e3af0be7d93bc","unresolved":false,"context_lines":[{"line_number":4661,"context_line":"                    except Exception as ex:"},{"line_number":4662,"context_line":"                        LOG.warn(_(\"The plugin maybe not work : %s \"), ex)"},{"line_number":4663,"context_line":"                        pass"},{"line_number":4664,"context_line":"                    break"},{"line_number":4665,"context_line":"            if not found_class:"},{"line_number":4666,"context_line":"                bad_plugins.append(plugin_name)"},{"line_number":4667,"context_line":"        if bad_plugins:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAARH%2F%2F%2FRE%3D","line":4664,"updated":"2013-08-14 05:19:31.000000000","message":"I will modify it next patch set.thanks","commit_id":"76a6953b84b7b15f9f2b824f9d0563132d9561e2"},{"author":{"_account_id":7664,"name":"Joe Cropper","email":"jwcroppe@us.ibm.com","username":"jwcroppe"},"change_message_id":"d03b66ba589ab82ec14f8216e5fd0fd33ed15830","unresolved":false,"context_lines":[{"line_number":4703,"context_line":"        new_resource_tracker_dict \u003d {}"},{"line_number":4704,"context_line":"        nodenames \u003d set(self.driver.get_available_nodes())"},{"line_number":4705,"context_line":"        for nodename in nodenames:"},{"line_number":4706,"context_line":"            metrics \u003d self._get_host_metrics(context, nodename)"},{"line_number":4707,"context_line":"            rt \u003d self._get_resource_tracker(nodename)"},{"line_number":4708,"context_line":"            rt.update_available_resource(context, metrics)"},{"line_number":4709,"context_line":"            new_resource_tracker_dict[nodename] \u003d rt"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAARH%2F%2F%2FdA%3D","line":4706,"updated":"2013-08-14 03:10:57.000000000","message":"Is this at all affected by the blueprint that eliminates the RPC fanout calls from compute node to scheduler (https://blueprints.launchpad.net/nova/+spec/no-compute-fanout-to-scheduler)?  i.e., do we need to get all metrics from the nova DB now?","commit_id":"76a6953b84b7b15f9f2b824f9d0563132d9561e2"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"76d2dedaeb5090b410c523afbb2e3af0be7d93bc","unresolved":false,"context_lines":[{"line_number":4704,"context_line":"        nodenames \u003d set(self.driver.get_available_nodes())"},{"line_number":4705,"context_line":"        for nodename in nodenames:"},{"line_number":4706,"context_line":"            metrics \u003d self._get_host_metrics(context, nodename)"},{"line_number":4707,"context_line":"            rt \u003d self._get_resource_tracker(nodename)"},{"line_number":4708,"context_line":"            rt.update_available_resource(context, metrics)"},{"line_number":4709,"context_line":"            new_resource_tracker_dict[nodename] \u003d rt"},{"line_number":4710,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAARH%2F%2F%2FV0%3D","line":4707,"updated":"2013-08-14 05:19:31.000000000","message":"It was discussed at the nova-scheduler meeting, we now store the metrics to the DB. https://blueprints.launchpad.net/nova/+spec/utilization-aware-scheduling","commit_id":"76a6953b84b7b15f9f2b824f9d0563132d9561e2"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"45079805ade4211c4eb270733dd1456e8aaa6dad","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.driver \u003d driver.load_compute_driver(self.virtapi, compute_driver)"},{"line_number":430,"context_line":"        self.use_legacy_block_device_info \u003d \\"},{"line_number":431,"context_line":"                            self.driver.need_legacy_block_device_info"},{"line_number":432,"context_line":"        # Must affer loading the driver"},{"line_number":433,"context_line":"        self.monitor_handler \u003d monitors.ResourceMonitorHandler()"},{"line_number":434,"context_line":"        self.monitor_classes \u003d self.monitor_handler.get_matching_classes("},{"line_number":435,"context_line":"                CONF.compute_available_monitors)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FiOk%3D","line":432,"updated":"2013-09-03 18:33:51.000000000","message":"affer?","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"3b45b208da7ddb884477b46d05cf3194660262c7","unresolved":false,"context_lines":[{"line_number":429,"context_line":"        self.driver \u003d driver.load_compute_driver(self.virtapi, compute_driver)"},{"line_number":430,"context_line":"        self.use_legacy_block_device_info \u003d \\"},{"line_number":431,"context_line":"                            self.driver.need_legacy_block_device_info"},{"line_number":432,"context_line":"        # Must affer loading the driver"},{"line_number":433,"context_line":"        self.monitor_handler \u003d monitors.ResourceMonitorHandler()"},{"line_number":434,"context_line":"        self.monitor_classes \u003d self.monitor_handler.get_matching_classes("},{"line_number":435,"context_line":"                CONF.compute_available_monitors)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FY1E%3D","line":432,"in_reply_to":"AAAASn%2F%2FiOk%3D","updated":"2013-09-05 10:53:16.000000000","message":"Done","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"45079805ade4211c4eb270733dd1456e8aaa6dad","unresolved":false,"context_lines":[{"line_number":4670,"context_line":"                                  \"instance: %s\"),"},{"line_number":4671,"context_line":"                                unicode(e), instance\u003dinstance)"},{"line_number":4672,"context_line":""},{"line_number":4673,"context_line":"    def _choose_monitors(self):"},{"line_number":4674,"context_line":"        \"\"\"This function checks the monitor names and metrics names against a"},{"line_number":4675,"context_line":"        predefined set of acceptable monitors."},{"line_number":4676,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FiOA%3D","line":4673,"updated":"2013-09-03 18:33:51.000000000","message":"I tried to comment on this before, but my comments seem to be lost...\n\nAll this code is pretty closely related to what resource tracker does.  Can we take all the monitor functionality here in compute manager and move it down into resource tracker?  Inside update_available_resource would make sense, I think.","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"3b45b208da7ddb884477b46d05cf3194660262c7","unresolved":false,"context_lines":[{"line_number":4670,"context_line":"                                  \"instance: %s\"),"},{"line_number":4671,"context_line":"                                unicode(e), instance\u003dinstance)"},{"line_number":4672,"context_line":""},{"line_number":4673,"context_line":"    def _choose_monitors(self):"},{"line_number":4674,"context_line":"        \"\"\"This function checks the monitor names and metrics names against a"},{"line_number":4675,"context_line":"        predefined set of acceptable monitors."},{"line_number":4676,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FY04%3D","line":4673,"in_reply_to":"AAAASn%2F%2FbjE%3D","updated":"2013-09-05 10:53:16.000000000","message":"Done","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"989d0aedc6d91facf38b784b70427815f5c2ee51","unresolved":false,"context_lines":[{"line_number":4670,"context_line":"                                  \"instance: %s\"),"},{"line_number":4671,"context_line":"                                unicode(e), instance\u003dinstance)"},{"line_number":4672,"context_line":""},{"line_number":4673,"context_line":"    def _choose_monitors(self):"},{"line_number":4674,"context_line":"        \"\"\"This function checks the monitor names and metrics names against a"},{"line_number":4675,"context_line":"        predefined set of acceptable monitors."},{"line_number":4676,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FbjE%3D","line":4673,"in_reply_to":"AAAASn%2F%2FgDs%3D","updated":"2013-09-04 20:27:51.000000000","message":"how many ResourceTrackers do we have?","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"ce50e486d1e3b4cbf0cdc4b1d3bae93ba5f329a6","unresolved":false,"context_lines":[{"line_number":4670,"context_line":"                                  \"instance: %s\"),"},{"line_number":4671,"context_line":"                                unicode(e), instance\u003dinstance)"},{"line_number":4672,"context_line":""},{"line_number":4673,"context_line":"    def _choose_monitors(self):"},{"line_number":4674,"context_line":"        \"\"\"This function checks the monitor names and metrics names against a"},{"line_number":4675,"context_line":"        predefined set of acceptable monitors."},{"line_number":4676,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FgDs%3D","line":4673,"in_reply_to":"AAAASn%2F%2FiOA%3D","updated":"2013-09-04 02:11:27.000000000","message":"@Brian Elliott\n\nif I move the code to resource tracker,  Every ResourceTracker() has to do the choose_monitors(). Does not look good, can you give some advice ?\nthank you very much.","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"3b45b208da7ddb884477b46d05cf3194660262c7","unresolved":false,"context_lines":[{"line_number":4670,"context_line":"                                  \"instance: %s\"),"},{"line_number":4671,"context_line":"                                unicode(e), instance\u003dinstance)"},{"line_number":4672,"context_line":""},{"line_number":4673,"context_line":"    def _choose_monitors(self):"},{"line_number":4674,"context_line":"        \"\"\"This function checks the monitor names and metrics names against a"},{"line_number":4675,"context_line":"        predefined set of acceptable monitors."},{"line_number":4676,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FY1A%3D","line":4673,"in_reply_to":"AAAASn%2F%2FiOA%3D","updated":"2013-09-05 10:53:16.000000000","message":"Done","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"}],"nova/compute/monitors/__init__.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"53c8e19190ab92545d9ce83ca4efd93e674b5cbb","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        good_monitors \u003d []"},{"line_number":134,"context_line":"        bad_monitors \u003d []"},{"line_number":135,"context_line":"        metric_names \u003d set()"},{"line_number":136,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":137,"context_line":"            found_class \u003d False"},{"line_number":138,"context_line":"            for cls in monitor_classes:"},{"line_number":139,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAATn%2F%2BYYg%3D","line":136,"updated":"2013-11-26 17:28:49.000000000","message":"I still feel like there should still be a way to simplify this loop, but I can\u0027t really put my finger on how…","commit_id":"b95203fa9f14c4a4caaf56f8b3c5dd7502d41946"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"89c512283b8675f0c499ba6b19dca10719bc59a0","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        good_monitors \u003d []"},{"line_number":134,"context_line":"        bad_monitors \u003d []"},{"line_number":135,"context_line":"        metric_names \u003d set()"},{"line_number":136,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":137,"context_line":"            found_class \u003d False"},{"line_number":138,"context_line":"            for cls in monitor_classes:"},{"line_number":139,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAATn%2F%2BWqA%3D","line":136,"in_reply_to":"AAAATn%2F%2BYYg%3D","updated":"2013-11-27 01:17:46.000000000","message":"@Kevin, here I want to find the correct monitor in monitor_classes list and also find the wrong class name in nonitor _cls_names list. So may be need two loops here.\nthanks","commit_id":"b95203fa9f14c4a4caaf56f8b3c5dd7502d41946"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"a2b683b604b417c429b28011e5e2da8caeaa6938","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from nova.openstack.common import timeutils"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"compute_monitors_opts \u003d ["},{"line_number":36,"context_line":"    cfg.MultiStrOpt(\u0027compute_available_monitors\u0027,"},{"line_number":37,"context_line":"                    default\u003d[\u0027nova.compute.monitors.all_monitors\u0027],"},{"line_number":38,"context_line":"                    help\u003d\u0027Monitor classes available to the compute which may \u0027"},{"line_number":39,"context_line":"                         \u0027be specified more than once.\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BRdg%3D","line":36,"updated":"2013-11-28 02:27:56.000000000","message":"I don\u0027t see much value of this option, shouldn\u0027t it load all monitors if not specified by the following compute_default_monitors option?","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"2e715ec387b4d503e4aa42e8870ac1348e3f815f","unresolved":false,"context_lines":[{"line_number":33,"context_line":"from nova.openstack.common import timeutils"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"compute_monitors_opts \u003d ["},{"line_number":36,"context_line":"    cfg.MultiStrOpt(\u0027compute_available_monitors\u0027,"},{"line_number":37,"context_line":"                    default\u003d[\u0027nova.compute.monitors.all_monitors\u0027],"},{"line_number":38,"context_line":"                    help\u003d\u0027Monitor classes available to the compute which may \u0027"},{"line_number":39,"context_line":"                         \u0027be specified more than once.\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BRao%3D","line":36,"in_reply_to":"AAAATn%2F%2BRdg%3D","updated":"2013-11-28 03:34:40.000000000","message":"@ Qiu Yu: it is the same way as in scheduler filters.","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":2468,"name":"unicell","email":"unicell@gmail.com","username":"unicell"},"change_message_id":"a2b683b604b417c429b28011e5e2da8caeaa6938","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    default\u003d[\u0027nova.compute.monitors.all_monitors\u0027],"},{"line_number":38,"context_line":"                    help\u003d\u0027Monitor classes available to the compute which may \u0027"},{"line_number":39,"context_line":"                         \u0027be specified more than once.\u0027),"},{"line_number":40,"context_line":"    cfg.ListOpt(\u0027compute_default_monitors\u0027,"},{"line_number":41,"context_line":"                default\u003d["},{"line_number":42,"context_line":"                  \u0027ComputeDriverCPUMonitor\u0027,"},{"line_number":43,"context_line":"                  ],"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BRdY%3D","line":40,"updated":"2013-11-28 02:27:56.000000000","message":"Guess it should be compute_monitors. There\u0027s no meaning to put an \u0027default\u0027 in naming while also has a default value for it.","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"2e715ec387b4d503e4aa42e8870ac1348e3f815f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                    default\u003d[\u0027nova.compute.monitors.all_monitors\u0027],"},{"line_number":38,"context_line":"                    help\u003d\u0027Monitor classes available to the compute which may \u0027"},{"line_number":39,"context_line":"                         \u0027be specified more than once.\u0027),"},{"line_number":40,"context_line":"    cfg.ListOpt(\u0027compute_default_monitors\u0027,"},{"line_number":41,"context_line":"                default\u003d["},{"line_number":42,"context_line":"                  \u0027ComputeDriverCPUMonitor\u0027,"},{"line_number":43,"context_line":"                  ],"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BRXU%3D","line":40,"in_reply_to":"AAAATn%2F%2BRdY%3D","updated":"2013-11-28 03:34:40.000000000","message":"ditto, if not specified compute_default_monitors option, it will not load any monitor. because now compute also can use the already existing way to get  resources.","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        monitor_classes \u003d self.get_matching_classes("},{"line_number":129,"context_line":"             CONF.compute_available_monitors)"},{"line_number":130,"context_line":"        monitor_cls_names \u003d CONF.compute_default_monitors"},{"line_number":131,"context_line":"        if not isinstance(monitor_cls_names, (list, tuple)):"},{"line_number":132,"context_line":"            monitor_cls_names \u003d [monitor_cls_names]"},{"line_number":133,"context_line":"        good_monitors \u003d []"},{"line_number":134,"context_line":"        bad_monitors \u003d []"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKRY%3D","line":131,"updated":"2013-11-30 14:52:23.000000000","message":"looks like \u0027cfg.ListOpt\u0027 always return list, so this is needless?","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        monitor_classes \u003d self.get_matching_classes("},{"line_number":129,"context_line":"             CONF.compute_available_monitors)"},{"line_number":130,"context_line":"        monitor_cls_names \u003d CONF.compute_default_monitors"},{"line_number":131,"context_line":"        if not isinstance(monitor_cls_names, (list, tuple)):"},{"line_number":132,"context_line":"            monitor_cls_names \u003d [monitor_cls_names]"},{"line_number":133,"context_line":"        good_monitors \u003d []"},{"line_number":134,"context_line":"        bad_monitors \u003d []"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJGA%3D","line":131,"in_reply_to":"AAAATn%2F%2BKRY%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                        metric_names_tmp \u003d set(cls(manager).get_metric_names())"},{"line_number":144,"context_line":"                        if not metric_names \u0026 metric_names_tmp:"},{"line_number":145,"context_line":"                            metric_names \u003d metric_names | metric_names_tmp"},{"line_number":146,"context_line":"                            good_monitors.append(cls(manager))"},{"line_number":147,"context_line":"                            found_class \u003d True"},{"line_number":148,"context_line":"                    except Exception as ex:"},{"line_number":149,"context_line":"                        LOG.warn(_(\"The monitor may not work : %s \"), ex)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKPI%3D","line":146,"updated":"2013-11-30 14:52:23.000000000","message":"the monitor class was instanced twice. in this line and line 143. Can we just instance monitor once?","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                        metric_names_tmp \u003d set(cls(manager).get_metric_names())"},{"line_number":144,"context_line":"                        if not metric_names \u0026 metric_names_tmp:"},{"line_number":145,"context_line":"                            metric_names \u003d metric_names | metric_names_tmp"},{"line_number":146,"context_line":"                            good_monitors.append(cls(manager))"},{"line_number":147,"context_line":"                            found_class \u003d True"},{"line_number":148,"context_line":"                    except Exception as ex:"},{"line_number":149,"context_line":"                        LOG.warn(_(\"The monitor may not work : %s \"), ex)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJF8%3D","line":146,"in_reply_to":"AAAATn%2F%2BKPI%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                bad_monitors.append(monitor_name)"},{"line_number":153,"context_line":"        if bad_monitors:"},{"line_number":154,"context_line":"            bad_cls_name \u003d \"; \".join(bad_monitors)"},{"line_number":155,"context_line":"            LOG.warn(_(\" The monitor ( %s ) may not work.\") % bad_cls_name)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        return good_monitors"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKRE%3D","line":155,"updated":"2013-11-30 14:52:23.000000000","message":"nit, LOG.warn(_(\" The monitor ( %s ) may not work.\"),  bad_cls_name)","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                bad_monitors.append(monitor_name)"},{"line_number":153,"context_line":"        if bad_monitors:"},{"line_number":154,"context_line":"            bad_cls_name \u003d \"; \".join(bad_monitors)"},{"line_number":155,"context_line":"            LOG.warn(_(\" The monitor ( %s ) may not work.\") % bad_cls_name)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        return good_monitors"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJF4%3D","line":155,"in_reply_to":"AAAATn%2F%2BKRE%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"4cd53a9d6a1e228532496a4627129eecafe750e5","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            bad_cls_name \u003d \"; \".join(bad_monitors)"},{"line_number":154,"context_line":"            LOG.warn(_(\" The monitor ( %s ) may not work.\"), bad_cls_name)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return good_monitors"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def all_monitors():"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAATn%2F951g%3D","line":156,"updated":"2013-12-04 17:21:10.000000000","message":"This algorithm still bothers me, so I sat down and tried to understand what you\u0027re doing.  Here\u0027s my thought on how to implement this, using a dictionary to essentially precompute the inner loop:\n\n    def choose_monitors(self, manager):\n        monitor_classes \u003d self.get_matching_classes(\n            CONF.compute_available_monitors)\n        monitor_class_map \u003d dict((cls.__name__, cls)\n                                 for cls in monitor_classes)\n        monitor_cls_names \u003d CONF.compute_default_monitors\n        good_monitors \u003d []\n        bad_monitors \u003d []\n        metric_names \u003d set()\n        for monitor_name in monitor_cls_names:\n            if monitor_name not in monitor_class_map:\n                bad_monitors.append(monitor_name)\n                continue\n\n            try:\n                # make sure different monitors do not have the same\n                # metric name\n                monitor \u003d monitor_class_map[monitor_name](manager)\n                metric_names_tmp \u003d set(monitor.get_metric_names())\n                overlap \u003d metric_names \u0026 metric_names_tmp\n                if not overlap:\n                    metric_names \u003d metric_names | metric_names_tmp\n                    good_monitors.append(monitor)\n                else:\n                    msg \u003d (_(\"Excluding monitor %(monitor_name)s due to \"\n                             \"metric name overlap; overlapping metrics: %s\") %\n                           {\u0027monitor_name\u0027: monitor_name,\n                            \u0027overlap\u0027: \u0027, \u0027.join(overlap)})\n                    LOG.warn(msg)\n                    bad_monitors.append(monitor_name)\n            except Exception as ex:\n                msg \u003d (_(\"Monitor %(monitor_name)s cannot be used: %(ex)s\") %\n                       {\u0027monitor_name\u0027: monitor_name, \u0027ex\u0027: ex})\n                LOG.warn(msg)\n                bad_monitors.append(monitor_name)\n\n        if bad_monitors:\n            LOG.warn(_(\"The following monitors have been disabled: %s\"),\n                     \u0027, \u0027.join(bad_monitors))\n\n        return good_monitors\n\nI\u0027ve also rephrased your warning messages some, along with adding some more…","commit_id":"ec3cd5b5dc7494c33b370d15cc8357fa7a1aa40f"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"16a4325cc84f967f5f524c51b8a7e0448886df89","unresolved":false,"context_lines":[{"line_number":153,"context_line":"            bad_cls_name \u003d \"; \".join(bad_monitors)"},{"line_number":154,"context_line":"            LOG.warn(_(\" The monitor ( %s ) may not work.\"), bad_cls_name)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        return good_monitors"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def all_monitors():"}],"source_content_type":"text/x-python","patch_set":35,"id":"AAAATn%2F92mw%3D","line":156,"in_reply_to":"AAAATn%2F951g%3D","updated":"2013-12-05 08:25:14.000000000","message":"Done","commit_id":"ec3cd5b5dc7494c33b370d15cc8357fa7a1aa40f"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"f6fbb714464e7d2ff4b33370e195625d64673318","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        self.tracked_instances \u003d {}"},{"line_number":89,"context_line":"        self.tracked_migrations \u003d {}"},{"line_number":90,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":91,"context_line":"        self.monitor_handler \u003d monitors.ResourceMonitorHandler()"},{"line_number":92,"context_line":"        self.monitor_classes \u003d self.monitor_handler.get_matching_classes("},{"line_number":93,"context_line":"                CONF.compute_monitors.compute_available_monitors)"},{"line_number":94,"context_line":"        self.available_monitor_classes \u003d self._choose_monitors()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FWMc%3D","line":91,"updated":"2013-11-08 16:50:48.000000000","message":"This doesn\u0027t need to be part of the class.  self.monitor_handler is only referenced once to setup a list of monitor classes.\n\nHow about subclassing ResourceMonitorHandler and encapsulate all this gnarly class selection logic there instead?","commit_id":"76bf2d9ad55b92590ae934c0add525412f3b4077"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cb58bfb70eb21179c0935dfc07a14e002242d6d5","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                            found_class \u003d True"},{"line_number":302,"context_line":"                    except Exception as ex:"},{"line_number":303,"context_line":"                        LOG.warn(_(\"The monitor may not work : %s \"), ex)"},{"line_number":304,"context_line":"                        pass"},{"line_number":305,"context_line":"                    break"},{"line_number":306,"context_line":"            if not found_class:"},{"line_number":307,"context_line":"                bad_monitors.append(monitor_name)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATH%2F%2FIO8%3D","line":304,"updated":"2013-10-22 19:11:50.000000000","message":"\"pass\" unneeded","commit_id":"76bf2d9ad55b92590ae934c0add525412f3b4077"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cb58bfb70eb21179c0935dfc07a14e002242d6d5","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                        LOG.warn(_(\"The monitor may not work : %s \"), ex)"},{"line_number":304,"context_line":"                        pass"},{"line_number":305,"context_line":"                    break"},{"line_number":306,"context_line":"            if not found_class:"},{"line_number":307,"context_line":"                bad_monitors.append(monitor_name)"},{"line_number":308,"context_line":"        if bad_monitors:"},{"line_number":309,"context_line":"            bad_cls_name \u003d \"; \".join(bad_monitors)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATH%2F%2FIOw%3D","line":306,"updated":"2013-10-22 19:11:50.000000000","message":"Use an \"else\" clause on the inner \"for\" loop to eliminate the need for found_class","commit_id":"76bf2d9ad55b92590ae934c0add525412f3b4077"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cb58bfb70eb21179c0935dfc07a14e002242d6d5","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                metrics \u003d metrics + metric"},{"line_number":323,"context_line":"            except Exception:"},{"line_number":324,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":325,"context_line":"                pass"},{"line_number":326,"context_line":"        if metrics:"},{"line_number":327,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":328,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATH%2F%2FIOs%3D","line":325,"updated":"2013-10-22 19:11:50.000000000","message":"\"pass\" unneeded","commit_id":"76bf2d9ad55b92590ae934c0add525412f3b4077"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"2e28c83146ba2a284a6b0f6a88b32013f258e471","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        metric_names \u003d set()"},{"line_number":295,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":296,"context_line":"            found_class \u003d False"},{"line_number":297,"context_line":"            for cls in self.monitor_classes:"},{"line_number":298,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"},{"line_number":299,"context_line":"                    try:"},{"line_number":300,"context_line":"                        metric_names_tmp \u003d set(cls(self).get_metric_names())"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2BlFY%3D","line":297,"updated":"2013-11-22 21:11:47.000000000","message":"This reads to me like an O(n²) algorithm.  Surely there\u0027s a better way.  Could self.monitor_classes be a dictionary, to eliminate this inner loop?  I\u0027d also appreciate a more thorough explanation of what the metric_names and metric_names_tmp  stuff is trying to accomplish.","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"6a72d14f29a4a1cc8f01ea12078a59053189e694","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        metric_names \u003d set()"},{"line_number":295,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":296,"context_line":"            found_class \u003d False"},{"line_number":297,"context_line":"            for cls in self.monitor_classes:"},{"line_number":298,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"},{"line_number":299,"context_line":"                    try:"},{"line_number":300,"context_line":"                        metric_names_tmp \u003d set(cls(self).get_metric_names())"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2BbkY%3D","line":297,"in_reply_to":"AAAATn%2F%2BeXY%3D","updated":"2013-11-26 07:18:45.000000000","message":"@ Brian : Done.thanks!","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"6a72d14f29a4a1cc8f01ea12078a59053189e694","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        metric_names \u003d set()"},{"line_number":295,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":296,"context_line":"            found_class \u003d False"},{"line_number":297,"context_line":"            for cls in self.monitor_classes:"},{"line_number":298,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"},{"line_number":299,"context_line":"                    try:"},{"line_number":300,"context_line":"                        metric_names_tmp \u003d set(cls(self).get_metric_names())"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2Bbkc%3D","line":297,"in_reply_to":"AAAATn%2F%2BlFY%3D","updated":"2013-11-26 07:18:45.000000000","message":"@ Kevin: the get_matching_classes will return a list, so monitor_classes is a list also. and this is the same way like scheduler(https://github.com/openstack/nova/blob/master/nova/scheduler/host_manager.py#L300).\n\nthe metric_names and metric_names_tmp stuff is trying to make sure  different monitors do not have the same metric name.\n\nthanks!","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"ac8b864208d1e9a7c9678c86774c1f3815c803b3","unresolved":false,"context_lines":[{"line_number":294,"context_line":"        metric_names \u003d set()"},{"line_number":295,"context_line":"        for monitor_name in monitor_cls_names:"},{"line_number":296,"context_line":"            found_class \u003d False"},{"line_number":297,"context_line":"            for cls in self.monitor_classes:"},{"line_number":298,"context_line":"                if cls.__name__ \u003d\u003d monitor_name:"},{"line_number":299,"context_line":"                    try:"},{"line_number":300,"context_line":"                        metric_names_tmp \u003d set(cls(self).get_metric_names())"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2BeXY%3D","line":297,"in_reply_to":"AAAATn%2F%2BlFY%3D","updated":"2013-11-25 17:45:14.000000000","message":"IMO, this monitor selection logic is begging to be factored out of this class entirely.  Perhaps it could all be encapsulated in the resource monitor handler?","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"2e28c83146ba2a284a6b0f6a88b32013f258e471","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        for monitor_cls in self.available_monitor_classes:"},{"line_number":322,"context_line":"            try:"},{"line_number":323,"context_line":"                metric \u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":324,"context_line":"                metrics \u003d metrics + metric"},{"line_number":325,"context_line":"            except Exception:"},{"line_number":326,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":327,"context_line":"        if metrics:"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2BlFQ%3D","line":324,"updated":"2013-11-22 21:11:47.000000000","message":"Why not use:\n\n    metrics.append(monitor_cls.get_metrics(nodename\u003dnodename))\n\nThat seems much clearer to me, and more concise.","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"647d34c39e3bdac16f3298a722949d11d1c7a175","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        for monitor_cls in self.available_monitor_classes:"},{"line_number":322,"context_line":"            try:"},{"line_number":323,"context_line":"                metric \u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":324,"context_line":"                metrics \u003d metrics + metric"},{"line_number":325,"context_line":"            except Exception:"},{"line_number":326,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":327,"context_line":"        if metrics:"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2BYaU%3D","line":324,"in_reply_to":"AAAATn%2F%2Bbjo%3D","updated":"2013-11-26 17:23:13.000000000","message":"Ah, I assumed that \"metric\" was a single element.","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"6a72d14f29a4a1cc8f01ea12078a59053189e694","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        for monitor_cls in self.available_monitor_classes:"},{"line_number":322,"context_line":"            try:"},{"line_number":323,"context_line":"                metric \u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":324,"context_line":"                metrics \u003d metrics + metric"},{"line_number":325,"context_line":"            except Exception:"},{"line_number":326,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":327,"context_line":"        if metrics:"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2Bbjo%3D","line":324,"in_reply_to":"AAAATn%2F%2BlFQ%3D","updated":"2013-11-26 07:18:45.000000000","message":"@Kevin ,\nhere I want to merge the metrics(list)  and metric (list) into one list. thanks!","commit_id":"4a7892930a7c1814d2f5238997bb605995c4f709"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"37999cc1c5f7798c28c10d8cdb03235eaa6e7320","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"},{"line_number":283,"context_line":"            metrics_info[\u0027compute_id\u0027] \u003d CONF.my_ip"},{"line_number":284,"context_line":"            notifier.notify(context, \u0027compute.%s\u0027 % nodename,"},{"line_number":285,"context_line":"                            \u0027compute.metrics.update\u0027, notifier.INFO,"},{"line_number":286,"context_line":"                            metrics_info)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAATn%2F%2BZLQ%3D","line":283,"updated":"2013-11-26 15:38:18.000000000","message":"I think self.host is a better way to identify the compute instance.    I have no problem with also adding the IP address.","commit_id":"a7a771c952b198e3beb6af9ce87b1a41200cb483"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"59e58582c9e61030435eed8528e91c66b3e9acff","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"},{"line_number":283,"context_line":"            metrics_info[\u0027compute_id\u0027] \u003d CONF.my_ip"},{"line_number":284,"context_line":"            notifier.notify(context, \u0027compute.%s\u0027 % nodename,"},{"line_number":285,"context_line":"                            \u0027compute.metrics.update\u0027, notifier.INFO,"},{"line_number":286,"context_line":"                            metrics_info)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAATn%2F%2BYkU%3D","line":283,"in_reply_to":"AAAATn%2F%2BZLQ%3D","updated":"2013-11-26 16:57:18.000000000","message":"@Brian: Done, thanks!","commit_id":"a7a771c952b198e3beb6af9ce87b1a41200cb483"},{"author":{"_account_id":2835,"name":"Brian Elliott","email":"bdelliott@gmail.com","username":"belliott"},"change_message_id":"2dee392db3811fb911746e6240276fea80695298","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"},{"line_number":283,"context_line":"            metrics_info[\u0027compute_id\u0027] \u003d self.host"},{"line_number":284,"context_line":"            metrics_info[\u0027compute_ip\u0027] \u003d CONF.my_ip"},{"line_number":285,"context_line":"            notifier.notify(context, \u0027compute.%s\u0027 % nodename,"},{"line_number":286,"context_line":"                            \u0027compute.metrics.update\u0027, notifier.INFO,"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAATn%2F%2BTbA%3D","line":283,"updated":"2013-11-27 16:35:06.000000000","message":"Can we use metrics_info[\u0027host\u0027] for naming consistency?\n\nA compute is identified uniquely by host and node.  (It\u0027s not referred to as compute_id anywhere)","commit_id":"b95203fa9f14c4a4caaf56f8b3c5dd7502d41946"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"81ef5f3b9568db005a5f6f3c6ee942403a5bcef1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"},{"line_number":283,"context_line":"            metrics_info[\u0027compute_id\u0027] \u003d self.host"},{"line_number":284,"context_line":"            metrics_info[\u0027compute_ip\u0027] \u003d CONF.my_ip"},{"line_number":285,"context_line":"            notifier.notify(context, \u0027compute.%s\u0027 % nodename,"},{"line_number":286,"context_line":"                            \u0027compute.metrics.update\u0027, notifier.INFO,"}],"source_content_type":"text/x-python","patch_set":33,"id":"AAAATn%2F%2BTP8%3D","line":283,"in_reply_to":"AAAATn%2F%2BTbA%3D","updated":"2013-11-27 17:10:11.000000000","message":"@Brian ?Done?thanks a million.","commit_id":"b95203fa9f14c4a4caaf56f8b3c5dd7502d41946"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.tracked_migrations \u003d {}"},{"line_number":76,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":77,"context_line":"        monitor_handler \u003d monitors.ResourceMonitorHandler()"},{"line_number":78,"context_line":"        self.monitor_classes \u003d monitor_handler.choose_monitors(self)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @utils.synchronized(COMPUTE_RESOURCE_SEMAPHORE)"},{"line_number":81,"context_line":"    def instance_claim(self, context, instance_ref, limits\u003dNone):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKP0%3D","line":78,"updated":"2013-11-30 14:52:23.000000000","message":"maybe we call this \u0027self.monitors\u0027? the result is object, not class, the name a little confuse for me.","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        self.tracked_migrations \u003d {}"},{"line_number":76,"context_line":"        self.conductor_api \u003d conductor.API()"},{"line_number":77,"context_line":"        monitor_handler \u003d monitors.ResourceMonitorHandler()"},{"line_number":78,"context_line":"        self.monitor_classes \u003d monitor_handler.choose_monitors(self)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @utils.synchronized(COMPUTE_RESOURCE_SEMAPHORE)"},{"line_number":81,"context_line":"    def instance_claim(self, context, instance_ref, limits\u003dNone):"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJGQ%3D","line":78,"in_reply_to":"AAAATn%2F%2BKP0%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        \"\"\""},{"line_number":273,"context_line":"        metrics \u003d []"},{"line_number":274,"context_line":"        metrics_info \u003d {}"},{"line_number":275,"context_line":"        for monitor_cls in self.monitor_classes:"},{"line_number":276,"context_line":"            try:"},{"line_number":277,"context_line":"                metrics +\u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":278,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKPA%3D","line":275,"updated":"2013-11-30 14:52:23.000000000","message":"ditto, monitor_cls isn\u0027t class, it is object.","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":272,"context_line":"        \"\"\""},{"line_number":273,"context_line":"        metrics \u003d []"},{"line_number":274,"context_line":"        metrics_info \u003d {}"},{"line_number":275,"context_line":"        for monitor_cls in self.monitor_classes:"},{"line_number":276,"context_line":"            try:"},{"line_number":277,"context_line":"                metrics +\u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":278,"context_line":"            except Exception:"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJGM%3D","line":275,"in_reply_to":"AAAATn%2F%2BKPA%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"faae868d2494a50ab6b89a611b66ae5fdcb76801","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            try:"},{"line_number":277,"context_line":"                metrics +\u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":278,"context_line":"            except Exception:"},{"line_number":279,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BKQo%3D","line":279,"updated":"2013-11-30 14:52:23.000000000","message":"nit, we should use \u0027LOG.warn(_(\"Cannot get the metrics from %s. \"), monitor_cls)\u0027","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"83ea796747270f9d5088ffb391cae7f350068105","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            try:"},{"line_number":277,"context_line":"                metrics +\u003d monitor_cls.get_metrics(nodename\u003dnodename)"},{"line_number":278,"context_line":"            except Exception:"},{"line_number":279,"context_line":"                LOG.warn(_(\"Cannot get the metrics from %s. \") % monitor_cls)"},{"line_number":280,"context_line":"        if metrics:"},{"line_number":281,"context_line":"            metrics_info[\u0027nodename\u0027] \u003d nodename"},{"line_number":282,"context_line":"            metrics_info[\u0027metrics\u0027] \u003d metrics"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAATn%2F%2BJGI%3D","line":279,"in_reply_to":"AAAATn%2F%2BKQo%3D","updated":"2013-12-02 02:10:42.000000000","message":"Done","commit_id":"5fa5576b59b351b3880a4d1187bef90b6cc38285"}],"nova/tests/api/ec2/test_cloud.py":[{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"989d0aedc6d91facf38b784b70427815f5c2ee51","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.flags(compute_driver\u003d\u0027nova.virt.fake.FakeDriver\u0027,"},{"line_number":127,"context_line":"                   volume_api_class\u003d\u0027nova.tests.fake_volume.API\u0027)"},{"line_number":128,"context_line":"        fake_monitors \u003d [\u0027nova.tests.fake_compute_monitor.FakeMonitorClass\u0027]"},{"line_number":129,"context_line":"        self.flags(compute_available_monitors\u003dfake_monitors)"},{"line_number":130,"context_line":"        self.flags(compute_default_monitors\u003d[\u0027FakeMonitorClass\u0027])"},{"line_number":131,"context_line":"        self.useFixture(fixtures.FakeLogger(\u0027boto\u0027))"},{"line_number":132,"context_line":"        fake_utils.stub_out_utils_spawn_n(self.stubs)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FbiY%3D","line":129,"updated":"2013-09-04 20:27:51.000000000","message":"any reason why not to put this in the base TestCase?  we have this same block a few times","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"},{"author":{"_account_id":7641,"name":"Shuangtai Tian","email":"hitianst@gmail.com","username":"shuangtai"},"change_message_id":"3b45b208da7ddb884477b46d05cf3194660262c7","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.flags(compute_driver\u003d\u0027nova.virt.fake.FakeDriver\u0027,"},{"line_number":127,"context_line":"                   volume_api_class\u003d\u0027nova.tests.fake_volume.API\u0027)"},{"line_number":128,"context_line":"        fake_monitors \u003d [\u0027nova.tests.fake_compute_monitor.FakeMonitorClass\u0027]"},{"line_number":129,"context_line":"        self.flags(compute_available_monitors\u003dfake_monitors)"},{"line_number":130,"context_line":"        self.flags(compute_default_monitors\u003d[\u0027FakeMonitorClass\u0027])"},{"line_number":131,"context_line":"        self.useFixture(fixtures.FakeLogger(\u0027boto\u0027))"},{"line_number":132,"context_line":"        fake_utils.stub_out_utils_spawn_n(self.stubs)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAASn%2F%2FY0w%3D","line":129,"in_reply_to":"AAAASn%2F%2FbiY%3D","updated":"2013-09-05 10:53:16.000000000","message":"Done","commit_id":"47da91962bd3c00687a3861fddc75e7fc5591f98"}],"nova/tests/compute/test_resource_tracker.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"cb58bfb70eb21179c0935dfc07a14e002242d6d5","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"            self.info[\u0027event\u0027] \u003d event"},{"line_number":1110,"context_line":"            self.info[\u0027payload\u0027] \u003d payload"},{"line_number":1111,"context_line":""},{"line_number":1112,"context_line":"        self.stubs.Set(notifier_api, \u0027notify\u0027, fake_notify)"},{"line_number":1113,"context_line":"        metrics \u003d self.tracker._get_host_metrics(self.context,"},{"line_number":1114,"context_line":"                                                 self.node_name)"},{"line_number":1115,"context_line":"        self.assertEqual(metrics, [{\u0027timestamp\u0027: 1232,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATH%2F%2FIN4%3D","line":1112,"updated":"2013-10-22 19:11:50.000000000","message":"Should probably switch to using the mock library; I would do:\n\n    @mock.patch.object(notifier_api, \u0027notify\u0027)\n    def test_get_host_metrics(self, mock_notify):\n        …\n\n        def fake_notify(context, publisher, event, priority, payload):\n            …\n\n        mock_notify.side_effect \u003d fake_notify\n        metrics \u003d self.tracker._get_host_metrics(…)\n        …\n\nAn alternative would be:\n\n    def test_get_host_metrics(self):\n        …\n\n        def fake_notify(context, publisher, event, priority, payload):\n            …\n\n        with mock.patch.object(notifier_api, \u0027notify\u0027, side_effect\u003dfake_notify):\n            metrics \u003d self.tracker._get_host_metrics(…)\n\n        self.assertEqual(…)\n        …","commit_id":"76bf2d9ad55b92590ae934c0add525412f3b4077"}]}
