)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"8e86dcdf038f7a98db3bd401f389390838eb13c7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Jianghua Wang \u003cjianghua.wang@citrix.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-24 00:02:14 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"XenAPI: Not support two key network meters"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Some deployments depend on the meters of network.*.bytes to"},{"line_number":10,"context_line":"do health check.But xenapi currently not support those meters."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5a8bc5a2_2e1e015f","line":7,"updated":"2016-10-06 12:36:43.000000000","message":"XenAPI: Add support for two key network meters","commit_id":"6caf215fcee8c60c1fdf14e8050913530707ac51"}],"ceilometer/compute/virt/xenapi/inspector.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"850bb216f93a133c617ef166a4b3c75e0c697f89","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            self.host_ref, plugin, fn, args)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _call_plugin_serialized(self, plugin, fn, *args, **kwargs):"},{"line_number":124,"context_line":"        params \u003d {\u0027params\u0027: pickle.dumps(dict(args\u003dargs, kwargs\u003dkwargs))}"},{"line_number":125,"context_line":"        rv \u003d self._call_plugin(plugin, fn, params)"},{"line_number":126,"context_line":"        return pickle.loads(rv)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _lookup_by_name(self, instance_name):"},{"line_number":129,"context_line":"        vm_refs \u003d self._call_xenapi(\"VM.get_by_name_label\", instance_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a629dbe_ce4f2732","line":126,"range":{"start_line":124,"start_character":0,"end_line":126,"end_character":31},"updated":"2016-11-11 14:20:49.000000000","message":"we have to pickle stuff? do you have a reference for this? just for my personal knowledge.","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"fa2620f8550010e95b499252c4052ca3190110b1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            self.host_ref, plugin, fn, args)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _call_plugin_serialized(self, plugin, fn, *args, **kwargs):"},{"line_number":124,"context_line":"        params \u003d {\u0027params\u0027: pickle.dumps(dict(args\u003dargs, kwargs\u003dkwargs))}"},{"line_number":125,"context_line":"        rv \u003d self._call_plugin(plugin, fn, params)"},{"line_number":126,"context_line":"        return pickle.loads(rv)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _lookup_by_name(self, instance_name):"},{"line_number":129,"context_line":"        vm_refs \u003d self._call_xenapi(\"VM.get_by_name_label\", instance_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_3c7359e9","line":126,"range":{"start_line":124,"start_character":0,"end_line":126,"end_character":31},"in_reply_to":"9a629dbe_ce4f2732","updated":"2016-11-21 07:17:09.000000000","message":"The pickling is for consistency with the \u0027best practice\u0027 for calling XenAPI plugins.  The XML RPC interfaces cannot be easily modified in a backward compatible way, so to avoid the need to add new methods when (for example) a new parameter with a default is added, we pickle all of the arguments.\n\nI believe it also makes it possible to deal with some values (Such as None) being passed as a parameter, where there is no encoding in the standard XML RPC datatypes.  Note that the remote end of this interface is ocaml, so standard extensions (such as allow_none) may not work.","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"24eb28245329e0795e89d97f302963b77cb9efec","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            self.host_ref, plugin, fn, args)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _call_plugin_serialized(self, plugin, fn, *args, **kwargs):"},{"line_number":124,"context_line":"        params \u003d {\u0027params\u0027: pickle.dumps(dict(args\u003dargs, kwargs\u003dkwargs))}"},{"line_number":125,"context_line":"        rv \u003d self._call_plugin(plugin, fn, params)"},{"line_number":126,"context_line":"        return pickle.loads(rv)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _lookup_by_name(self, instance_name):"},{"line_number":129,"context_line":"        vm_refs \u003d self._call_xenapi(\"VM.get_by_name_label\", instance_name)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_cbad729c","line":126,"range":{"start_line":124,"start_character":0,"end_line":126,"end_character":31},"in_reply_to":"9a629dbe_ce4f2732","updated":"2016-11-18 10:46:46.000000000","message":"this is ported from nova:https://github.com/openstack/nova/blob/master/nova/virt/xenapi/client/session.py#L236\n\nfor this specific invoking bandwidth, I don\u0027t think it\u0027s a must to use pickle. But that\u0027s the way used in nova. I\u0027d like to keep it the same. Future, these common xenapi stuff will be put into a common library os-xenapi: https://github.com/openstack/os-xenapi/","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"850bb216f93a133c617ef166a4b3c75e0c697f89","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"9a629dbe_2e57c3ca","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"updated":"2016-11-11 14:20:49.000000000","message":"drop if and just put:\n   for vif_ref in vif_refs or []:","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"da98b45520a2e3b835ac0ec1885e17dc76761d47","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_d16b31ef","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"in_reply_to":"7a77a97e_186409b7","updated":"2016-11-21 02:00:15.000000000","message":"Interesting. Thanks for the suggestion. But I think [] makes more sense at here as vif_refs is expected a list. the appending [] is for just in case _call_xenapi return None.","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":19594,"name":"Yarko Tymciurak","email":"yarko.tymciurak@intel.com","username":"yarkot"},"change_message_id":"d85a91650bf7b9fa00c88519c7554a18ac6d7b02","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_34c50c5b","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"in_reply_to":"7a77a97e_1f120f59","updated":"2016-11-21 22:29:17.000000000","message":"I think its fine to keep it as you\u0027ve suggested.  I just want to be sure that it is clear there is no \"quirk\" (python is dynamically typed) or programming reason to use the empty list (and extra space) - its simply a human-communication / consistency thing (and that\u0027s fine).\n\nThe `for...in` requires an iterable (a sequence).\n\nIf `vif_refs` already is `[]`, then you\u0027re all set - `for...in` has an iterable on its right hand side (but this form happens to return the second iterable).\n\nIf `vif_refs` happens to be `None`, you need an iterable to satisfy `for...in`, and it is basically a do-nothing which allows the `for` loop to fail/exit.  You are in effect writing:\n\n    for vif_ref in (vif_refs or []):\n\nwhich is ensuring this case succeeds:\n\n    for vif_ref in (None or []):\n\nin which case, the iterable `[]` fails to return a result, `vif_ref` *doesn\u0027t get set*, and the `for` loop exits.","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"fa2620f8550010e95b499252c4052ca3190110b1","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_1f120f59","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"in_reply_to":"7a77a97e_d16b31ef","updated":"2016-11-21 07:17:09.000000000","message":"Agreed that we should always be using the same type - as vif_refs can be a list then we should default to the empty list, not rely on a quirk of python that we could use a tuple instead.  Timings show there is very little difference between the two.","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"24eb28245329e0795e89d97f302963b77cb9efec","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_8b9b7a17","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"in_reply_to":"9a629dbe_2e57c3ca","updated":"2016-11-18 10:46:46.000000000","message":"Done","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":19594,"name":"Yarko Tymciurak","email":"yarko.tymciurak@intel.com","username":"yarkot"},"change_message_id":"83021ba82e93902b405f1d284be7af55f6f5838a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        vif_refs \u003d self._call_xenapi(\"VM.get_VIFs\", vm_ref)"},{"line_number":181,"context_line":"        bw_all \u003d self._call_plugin_serialized(\u0027bandwidth\u0027,"},{"line_number":182,"context_line":"                                              \u0027fetch_all_bandwidth\u0027)"},{"line_number":183,"context_line":"        if vif_refs:"},{"line_number":184,"context_line":"            for vif_ref in vif_refs:"},{"line_number":185,"context_line":"                vif_rec \u003d self._call_xenapi(\"VIF.get_record\", vif_ref)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"                interface \u003d virt_inspector.Interface("}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_186409b7","line":184,"range":{"start_line":183,"start_character":0,"end_line":184,"end_character":36},"in_reply_to":"9a629dbe_2e57c3ca","updated":"2016-11-18 19:55:12.000000000","message":"just for the record, if you\u0027re going to ensure an iterable for the `for` loop, the smallest one is a tuple, so that:\n\n    for vif_ref in vif_refs or ():\n\nis a touch smaller:\n\n    \u003e\u003e\u003e sys.getsizeof(())\n    48\n    \u003e\u003e\u003e sys.getsizeof(\"\")\n    49\n    \u003e\u003e\u003e sys.getsizeof([])\n    64","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"850bb216f93a133c617ef166a4b3c75e0c697f89","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    parameters\u003dNone)"},{"line_number":192,"context_line":"                bw_vif \u003d bw_all[dom_id][vif_rec[\u0027device\u0027]]"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                # Todo \u003cjianghuaw\u003e: Currently the plugin can only support"},{"line_number":195,"context_line":"                # rx_bytes and tx_bytes, so temporarily set others as -1."},{"line_number":196,"context_line":"                stats \u003d virt_inspector.InterfaceStats("},{"line_number":197,"context_line":"                    rx_bytes\u003dbw_vif[\u0027bw_in\u0027], rx_packets\u003d-1, rx_drop\u003d-1,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a629dbe_6e753b62","line":194,"range":{"start_line":194,"start_character":18,"end_line":194,"end_character":34},"updated":"2016-11-11 14:20:49.000000000","message":"TODO(jianghuaw)","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"24eb28245329e0795e89d97f302963b77cb9efec","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                    parameters\u003dNone)"},{"line_number":192,"context_line":"                bw_vif \u003d bw_all[dom_id][vif_rec[\u0027device\u0027]]"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                # Todo \u003cjianghuaw\u003e: Currently the plugin can only support"},{"line_number":195,"context_line":"                # rx_bytes and tx_bytes, so temporarily set others as -1."},{"line_number":196,"context_line":"                stats \u003d virt_inspector.InterfaceStats("},{"line_number":197,"context_line":"                    rx_bytes\u003dbw_vif[\u0027bw_in\u0027], rx_packets\u003d-1, rx_drop\u003d-1,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a77a97e_6b98de1c","line":194,"range":{"start_line":194,"start_character":18,"end_line":194,"end_character":34},"in_reply_to":"9a629dbe_6e753b62","updated":"2016-11-18 10:46:46.000000000","message":"Done","commit_id":"3ccc8431408fde4611be738a98d4817a14797ddc"}],"ceilometer/tests/unit/compute/virt/xenapi/test_inspector.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"0f8dc9807dfdddc989f53273ad64d1877b89a4b7","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        session \u003d self.inspector.session"},{"line_number":164,"context_line":"        with contextlib.ExitStack() as stack:"},{"line_number":165,"context_line":"            stack.enter_context("},{"line_number":166,"context_line":"                mock.patch.object(session, \u0027xenapi_request\u0027,"},{"line_number":167,"context_line":"                                  side_effect\u003drequest_returns))"},{"line_number":168,"context_line":"            stack.enter_context("},{"line_number":169,"context_line":"                mock.patch.object(self.inspector,"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a8bc5a2_c2e864b7","line":166,"updated":"2016-09-23 15:20:29.000000000","message":"mock already provides it\u0027s own context functionality so you don\u0027t need contextlib.\n\njust do:\n\n  with mock.patch.object(blah):\n      stuff","commit_id":"4bfeb787aa8bc383bc4fcc26b85bd93556c626f9"}]}
