)]}'
{"nova/objects/monitor_metric.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1a7c71f911c7ae12a05fe3a2e37b0d4ac543751d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    fields \u003d {"},{"line_number":25,"context_line":"        \u0027name\u0027: fields.MonitorMetricTypeField(),"},{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_bf63dab0","line":25,"updated":"2015-06-30 08:05:55.000000000","message":"Using \u0027fields.MonitorMetricTypeField\u0027 means we didn\u0027t encourage user developer his private monitor plugin.\n\nWhen user add own monitor and with new type, he need bump the obj version. That sounds like we didn\u0027t encourage user to do that.","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42ebdadbe50f8a3bc32726520de030d1722b4dee","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    fields \u003d {"},{"line_number":25,"context_line":"        \u0027name\u0027: fields.MonitorMetricTypeField(),"},{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_ca57e200","line":25,"in_reply_to":"ba3cc151_bf63dab0","updated":"2015-06-30 17:59:19.000000000","message":"Alex, yes, the idea is to prevent developers from making up new plugins that use new random metric keys without first adding the new metric key names to MonitorMetricTypeField and adding a new monitor plugin base class for that subset of metrics.\n\nNo problem having alternate implementations of those monitor plugins, but if there is no standardization of what the metric keys (e.g. \"cpu.percent\", \"cpu.frequency\", etc) are, then it\u0027s a Wild West scenario where the operator can\u0027t rely on two monitor plugins of the same type returning the same data. :(","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d7162a98cc656248c732439b081edd55f00e942b","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \u0027name\u0027: fields.MonitorMetricTypeField(),"},{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # NOTE(jaypipes): This method exists to convert the object to the"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_91886224","line":28,"updated":"2015-06-29 19:15:50.000000000","message":"We *could* do some more validation on this particular bit if we wanted to make sure it\u0027s always a class path...","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42ebdadbe50f8a3bc32726520de030d1722b4dee","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \u0027name\u0027: fields.MonitorMetricTypeField(),"},{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # NOTE(jaypipes): This method exists to convert the object to the"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_ca6e02c9","line":28,"in_reply_to":"ba3cc151_91886224","updated":"2015-06-30 17:59:19.000000000","message":"Honestly, I\u0027m not even sure it\u0027s supposed to be a class path :( I\u0027m not sure what the standardization of this field is supposed to be. It seems to be copied verbatim from the Ceilometer definition of a metric.","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e76ce726898edd53ebfb7ab82d9d1ac8d34f2453","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # NOTE(jaypipes): This method exists to convert the object to the"},{"line_number":32,"context_line":"    # format expected by the RPC notifier for metrics events."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_da9fcc5d","line":29,"updated":"2015-06-30 08:44:09.000000000","message":"should we use \u0027nullable\u003dFalse\u0027 for all the fields?","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42ebdadbe50f8a3bc32726520de030d1722b4dee","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        \u0027value\u0027: fields.IntegerField(),"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: fields.DateTimeField(),"},{"line_number":28,"context_line":"        \u0027source\u0027: fields.StringField(),"},{"line_number":29,"context_line":"    }"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    # NOTE(jaypipes): This method exists to convert the object to the"},{"line_number":32,"context_line":"    # format expected by the RPC notifier for metrics events."}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_ea7186a9","line":29,"in_reply_to":"ba3cc151_da9fcc5d","updated":"2015-06-30 17:59:19.000000000","message":"Done","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"0e320f2d8c609dd1039a732e31dd6f471fdffd58","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":36,"context_line":"            \u0027value\u0027: self.value,"},{"line_number":37,"context_line":"            # NOTE(jaypipes): This is what jsonutils.dumps() does to"},{"line_number":38,"context_line":"            # datetime.datetime objects, which is what timestamp is i"},{"line_number":39,"context_line":"            # this object as well as the original simple dict metrics"},{"line_number":40,"context_line":"            \u0027timestamp\u0027: timeutils.strtime(self.timestamp),"},{"line_number":41,"context_line":"            \u0027source\u0027: self.source"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa32b979_463e902a","line":38,"updated":"2015-06-26 19:26:57.000000000","message":"\"is i\"?  \"is in\"?  (attonit)","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42ebdadbe50f8a3bc32726520de030d1722b4dee","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":36,"context_line":"            \u0027value\u0027: self.value,"},{"line_number":37,"context_line":"            # NOTE(jaypipes): This is what jsonutils.dumps() does to"},{"line_number":38,"context_line":"            # datetime.datetime objects, which is what timestamp is i"},{"line_number":39,"context_line":"            # this object as well as the original simple dict metrics"},{"line_number":40,"context_line":"            \u0027timestamp\u0027: timeutils.strtime(self.timestamp),"},{"line_number":41,"context_line":"            \u0027source\u0027: self.source"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_8a69dac0","line":38,"in_reply_to":"fa32b979_463e902a","updated":"2015-06-30 17:59:19.000000000","message":"Done","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d7162a98cc656248c732439b081edd55f00e942b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":36,"context_line":"            \u0027value\u0027: self.value,"},{"line_number":37,"context_line":"            # NOTE(jaypipes): This is what jsonutils.dumps() does to"},{"line_number":38,"context_line":"            # datetime.datetime objects, which is what timestamp is i"},{"line_number":39,"context_line":"            # this object as well as the original simple dict metrics"},{"line_number":40,"context_line":"            \u0027timestamp\u0027: timeutils.strtime(self.timestamp),"},{"line_number":41,"context_line":"            \u0027source\u0027: self.source"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_7114bef4","line":38,"in_reply_to":"fa32b979_463e902a","updated":"2015-06-29 19:15:50.000000000","message":"This is no smaller than micronit.\n\n/me is a stickler about typos","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d7162a98cc656248c732439b081edd55f00e942b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            # NOTE(jaypipes): This is what jsonutils.dumps() does to"},{"line_number":38,"context_line":"            # datetime.datetime objects, which is what timestamp is i"},{"line_number":39,"context_line":"            # this object as well as the original simple dict metrics"},{"line_number":40,"context_line":"            \u0027timestamp\u0027: timeutils.strtime(self.timestamp),"},{"line_number":41,"context_line":"            \u0027source\u0027: self.source"},{"line_number":42,"context_line":"        }"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_71e27e05","line":40,"updated":"2015-06-29 19:15:50.000000000","message":"So, DateTmeField stores a TZ-aware datetime. If you use strtime() on it you will get a different format than if you give it a TZ-naive one. Are we sure that the thing that does the parsing of this can tolerate the TZ-aware format?","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"42ebdadbe50f8a3bc32726520de030d1722b4dee","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            # NOTE(jaypipes): This is what jsonutils.dumps() does to"},{"line_number":38,"context_line":"            # datetime.datetime objects, which is what timestamp is i"},{"line_number":39,"context_line":"            # this object as well as the original simple dict metrics"},{"line_number":40,"context_line":"            \u0027timestamp\u0027: timeutils.strtime(self.timestamp),"},{"line_number":41,"context_line":"            \u0027source\u0027: self.source"},{"line_number":42,"context_line":"        }"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba3cc151_2a868e65","line":40,"in_reply_to":"ba3cc151_71e27e05","updated":"2015-06-30 17:59:19.000000000","message":"I\u0027ll try and figure this out. It\u0027s not really tested or documented anywhere at this point.","commit_id":"3fb0f9ba84d618f9290372fa4b691d41c3147cfd"}],"nova/tests/unit/objects/test_monitor_metric.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"57e483f53f9bd2e803bac457e0af97aed4385660","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                    source\u003d\u0027nova.virt.libvirt.driver\u0027)"},{"line_number":37,"context_line":"        self.assertEqual(_monitor_metric_spec, obj.to_dict())"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_monitor_metric_list_to_lost(self):"},{"line_number":40,"context_line":"        obj \u003d objects.MonitorMetric(name\u003d\u0027cpu.frequency\u0027,"},{"line_number":41,"context_line":"                                    value\u003d1000,"},{"line_number":42,"context_line":"                                    timestamp\u003d_ts_now,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba3cc151_86bee7d2","line":39,"range":{"start_line":39,"start_character":37,"end_line":39,"end_character":38},"updated":"2015-07-06 13:36:06.000000000","message":"list?","commit_id":"e4734a33eb9142992274f4ed76fe736a71117022"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"930766a6252f8bc427085090e413a628b163ea8a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                                    source\u003d\u0027nova.virt.libvirt.driver\u0027)"},{"line_number":37,"context_line":"        self.assertEqual(_monitor_metric_spec, obj.to_dict())"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_monitor_metric_list_to_list(self):"},{"line_number":40,"context_line":"        obj \u003d objects.MonitorMetric(name\u003d\u0027cpu.frequency\u0027,"},{"line_number":41,"context_line":"                                    value\u003d1000,"},{"line_number":42,"context_line":"                                    timestamp\u003d_ts_now,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba3cc151_395e1c77","line":39,"range":{"start_line":39,"start_character":28,"end_line":39,"end_character":40},"updated":"2015-07-06 14:02:09.000000000","message":"Heh, now that I read this without the typo, I\u0027m not sure what \"list-to-list\" means, but that\u0027s cool. At least it\u0027s not lost.","commit_id":"28258a18e97cd22c63b1e2e351af4522021c3870"}]}
