)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"c9cc874476b0c8b353bd304323028261c1033f68","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Co-Authored-By: Michal Dulko \u003cmichal.dulko@intel.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I09f593f9f9aa8befa40d989b731159b78a429071"},{"line_number":18,"context_line":"Partial-Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"ba3cc151_8fc79311","line":18,"updated":"2015-07-07 18:20:19.000000000","message":"When I clicked on this link it didn\u0027t bring me to a blueprint. It brought me to a launchpad search. I think this should get fixed before merging.","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"9c8dcb479550e5083d9c1bdd3d91166e656c5dfd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Co-Authored-By: Michal Dulko \u003cmichal.dulko@intel.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I09f593f9f9aa8befa40d989b731159b78a429071"},{"line_number":18,"context_line":"Partial-Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"ba3cc151_cfaa7b19","line":18,"in_reply_to":"ba3cc151_8fc79311","updated":"2015-07-07 18:25:56.000000000","message":"The Gerrit link does not work properly.  The actual URL is https://blueprints.launchpad.net/cinder/+spec/cinder-objects.","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"af5f2dfd374e00a8610478f6215ed74958a12075","unresolved":false,"context_lines":[{"line_number":15,"context_line":"Co-Authored-By: Michal Dulko \u003cmichal.dulko@intel.com\u003e"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I09f593f9f9aa8befa40d989b731159b78a429071"},{"line_number":18,"context_line":"Partial-Implements: blueprint cinder-objects"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"ba3cc151_420b842a","line":18,"in_reply_to":"ba3cc151_cfaa7b19","updated":"2015-07-08 09:31:20.000000000","message":"On the latest OpenStack summit Cinder team agreed to use blueprint from previous release to tag objectification work. This should therefore stay as it is.","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"}],"cinder/api/contrib/hosts.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    if zone:"},{"line_number":107,"context_line":"        services \u003d [s for s in services if s[\u0027availability_zone\u0027] \u003d\u003d zone]"},{"line_number":108,"context_line":"    hosts \u003d []"},{"line_number":109,"context_line":"    for host in services:"},{"line_number":110,"context_line":"        delta \u003d curr_time - (host[\u0027updated_at\u0027] or host[\u0027created_at\u0027])"},{"line_number":111,"context_line":"        alive \u003d abs(delta.total_seconds()) \u003c\u003d CONF.service_down_time"},{"line_number":112,"context_line":"        status \u003d (alive and \"available\") or \"unavailable\""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_b2cbdd70","line":109,"updated":"2015-03-13 14:02:11.000000000","message":"services is a list of objects, hence you can use the dot notation instead of foo[\u0027bar\u0027].  This will help in the future when we remove the CinderObjectDictCompat.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        # Getting total available/used resource"},{"line_number":218,"context_line":"        # TODO(jdg): Add summary info for Snapshots"},{"line_number":219,"context_line":"        volume_refs \u003d db.volume_get_all_by_host(context, host_ref[\u0027host\u0027])"},{"line_number":220,"context_line":"        (count, sum) \u003d db.volume_data_get_for_host(context,"},{"line_number":221,"context_line":"                                                   host_ref[\u0027host\u0027])"},{"line_number":222,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_d29bf170","line":219,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        # TODO(jdg): Add summary info for Snapshots"},{"line_number":219,"context_line":"        volume_refs \u003d db.volume_get_all_by_host(context, host_ref[\u0027host\u0027])"},{"line_number":220,"context_line":"        (count, sum) \u003d db.volume_data_get_for_host(context,"},{"line_number":221,"context_line":"                                                   host_ref[\u0027host\u0027])"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        snap_count_total \u003d 0"},{"line_number":224,"context_line":"        snap_sum_total \u003d 0"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_7284050b","line":221,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"}],"cinder/api/contrib/services.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if binary_key:"},{"line_number":105,"context_line":"            services \u003d [s for s in services if s[\u0027binary\u0027] \u003d\u003d binary_key]"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        svcs \u003d []"},{"line_number":108,"context_line":"        for svc in services:"},{"line_number":109,"context_line":"            delta \u003d now - (svc[\u0027updated_at\u0027] or svc[\u0027created_at\u0027])"},{"line_number":110,"context_line":"            alive \u003d abs(delta.total_seconds()) \u003c\u003d CONF.service_down_time"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_92a3399d","line":107,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation for svc","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"}],"cinder/backup/api.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        services \u003d objects.ServiceList.get_all_by_topic("},{"line_number":106,"context_line":"            ctxt, topic, disabled\u003dFalse)"},{"line_number":107,"context_line":"        for srv in services:"},{"line_number":108,"context_line":"            if (srv[\u0027availability_zone\u0027] \u003d\u003d volume[\u0027availability_zone\u0027] and"},{"line_number":109,"context_line":"                    srv[\u0027host\u0027] \u003d\u003d volume_host and"},{"line_number":110,"context_line":"                    utils.service_is_up(srv)):"},{"line_number":111,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_32bc4dbb","line":108,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation for srv","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        topic \u003d CONF.backup_topic"},{"line_number":120,"context_line":"        ctxt \u003d context.get_admin_context()"},{"line_number":121,"context_line":"        services \u003d objects.ServiceList.get_all_by_topic(ctxt, topic)"},{"line_number":122,"context_line":"        return [srv[\u0027host\u0027] for srv in services if not srv[\u0027disabled\u0027]]"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def create(self, context, name, description, volume_id,"},{"line_number":125,"context_line":"               container, incremental\u003dFalse, availability_zone\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_b2c75d44","line":122,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation for srv","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"}],"cinder/cmd/manage.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":444,"context_line":"                              _(\u0027Status\u0027),"},{"line_number":445,"context_line":"                              _(\u0027State\u0027),"},{"line_number":446,"context_line":"                              _(\u0027Updated At\u0027)))"},{"line_number":447,"context_line":"        for svc in services:"},{"line_number":448,"context_line":"            alive \u003d utils.service_is_up(svc)"},{"line_number":449,"context_line":"            art \u003d \":-)\" if alive else \"XXX\""},{"line_number":450,"context_line":"            status \u003d \u0027enabled\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_12de6911","line":447,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation for svc","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"}],"cinder/cmd/rtstool.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def main(argv\u003dNone):"},{"line_number":248,"context_line":"    objects.register_all()"},{"line_number":249,"context_line":"    if argv is None:"},{"line_number":250,"context_line":"        argv \u003d sys.argv"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_e149c3d1","line":248,"updated":"2015-08-18 12:12:07.000000000","message":"We don\u0027t need this here, right?","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def main(argv\u003dNone):"},{"line_number":248,"context_line":"    objects.register_all()"},{"line_number":249,"context_line":"    if argv is None:"},{"line_number":250,"context_line":"        argv \u003d sys.argv"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_9856f8d0","line":248,"in_reply_to":"fa1b9901_e149c3d1","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"}],"cinder/objects/__init__.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"def register_all():"},{"line_number":24,"context_line":"    # NOTE(danms): You must make sure your object gets imported in this"},{"line_number":25,"context_line":"    # function in order for it to be registered by services that may"},{"line_number":26,"context_line":"    # need to receive it via RPC."},{"line_number":27,"context_line":"    __import__(\u0027cinder.objects.volume\u0027)"},{"line_number":28,"context_line":"    __import__(\u0027cinder.objects.service\u0027)"},{"line_number":29,"context_line":"    __import__(\u0027cinder.objects.snapshot\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_92db39ec","line":26,"updated":"2015-03-13 14:02:11.000000000","message":"Just a note, but you do not have to change anything here.  Maybe, we should organize the imports alphabetically later.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"2be9bd8f7dd81d19e8fe2e611e9c6a937ea75beb","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    __import__(\u0027cinder.objects.volume\u0027)"},{"line_number":28,"context_line":"    __import__(\u0027cinder.objects.service\u0027)"},{"line_number":29,"context_line":"    __import__(\u0027cinder.objects.snapshot\u0027)"},{"line_number":30,"context_line":"    __import__(\u0027cinder.objects.backup\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5afe65bd_041f2760","line":30,"updated":"2015-06-03 19:00:41.000000000","message":"Backup object is not merged yet [1] ! You will run into failures if your object gets merged in before backup object does. Please remove this and only include the objects you plan to add i.e. service.\n\n[1]https://github.com/openstack/cinder/blob/master/cinder/objects/__init__.py","commit_id":"3a271fd9185d6b3ab38f581b339ebb215f1bf766"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"90929de354369735204ee8ec36f7b4e1dadb9576","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    __import__(\u0027cinder.objects.volume\u0027)"},{"line_number":28,"context_line":"    __import__(\u0027cinder.objects.service\u0027)"},{"line_number":29,"context_line":"    __import__(\u0027cinder.objects.snapshot\u0027)"},{"line_number":30,"context_line":"    __import__(\u0027cinder.objects.backup\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"3afb71cf_4fee89b5","line":30,"in_reply_to":"5afe65bd_041f2760","updated":"2015-06-07 13:34:45.000000000","message":"As Thang replied - this line is introduced by the fact that this patch is dependent. Download the patch and take a look at git logs there.","commit_id":"3a271fd9185d6b3ab38f581b339ebb215f1bf766"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"68f2c4c22a660f02cd145a5d964c9912fcdb3421","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    __import__(\u0027cinder.objects.volume\u0027)"},{"line_number":28,"context_line":"    __import__(\u0027cinder.objects.service\u0027)"},{"line_number":29,"context_line":"    __import__(\u0027cinder.objects.snapshot\u0027)"},{"line_number":30,"context_line":"    __import__(\u0027cinder.objects.backup\u0027)"}],"source_content_type":"text/x-python","patch_set":28,"id":"5afe65bd_84f437f2","line":30,"in_reply_to":"5afe65bd_041f2760","updated":"2015-06-03 19:05:19.000000000","message":"This patch is dependent on the backup object patch.  This comment makes no sense.","commit_id":"3a271fd9185d6b3ab38f581b339ebb215f1bf766"}],"cinder/objects/base.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    This adds the fields that we use in common for all persistent objects."},{"line_number":641,"context_line":"    \"\"\""},{"line_number":642,"context_line":"    fields \u003d {"},{"line_number":643,"context_line":"        \u0027created_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":644,"context_line":"        \u0027updated_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":645,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":646,"context_line":"        \u0027deleted\u0027: fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_d28f71cb","line":643,"updated":"2015-03-13 14:02:11.000000000","message":"Is the reason for adding tzinfo_aware option still true - typeerror \"can\u0027t subtract offset-naive and offset-aware datetimes\" when calculating the service_down_time?\n\nIf so, could you add a note here for future reference?","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fc3a59d5519900487908ebb7b46eb7945b80c4c2","unresolved":false,"context_lines":[{"line_number":640,"context_line":"    This adds the fields that we use in common for all persistent objects."},{"line_number":641,"context_line":"    \"\"\""},{"line_number":642,"context_line":"    fields \u003d {"},{"line_number":643,"context_line":"        \u0027created_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":644,"context_line":"        \u0027updated_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":645,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":646,"context_line":"        \u0027deleted\u0027: fields.BooleanField(default\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":10,"id":"baa041b7_f16e3dc8","line":643,"in_reply_to":"9a80dd14_d28f71cb","updated":"2015-04-07 07:32:41.000000000","message":"Done","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"8e4627c4967d1242c8c626733410e04748383806","unresolved":false,"context_lines":[{"line_number":642,"context_line":"    fields \u003d {"},{"line_number":643,"context_line":"        \u0027created_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":644,"context_line":"        \u0027updated_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"},{"line_number":645,"context_line":"        # NOTE(xek): updated_at column contain timestamps for periodic updates"},{"line_number":646,"context_line":"        # of the Service object - see sqlalchemy Service model."},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        \u0027deleted_at\u0027: fields.DateTimeField(nullable\u003dTrue, tzinfo_aware\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"dac4157f_602dbf45","line":645,"updated":"2015-04-21 12:08:24.000000000","message":"These comments should go outside the dict.  It just makes it more readable.","commit_id":"9ee48e738bf4ce34369da495fd3442fa117add9e"}],"cinder/objects/fields.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"ae114a0dbaa74ca11529490da1020424039f365b","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"class DateTime(FieldType):"},{"line_number":279,"context_line":"    def __init__(self, tzinfo_aware\u003dTrue, *args, **kwargs):"},{"line_number":280,"context_line":"        self.tzinfo_aware \u003d tzinfo_aware"},{"line_number":281,"context_line":"        super(DateTime, self).__init__(*args, **kwargs)"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_8a495d33","line":279,"updated":"2015-03-03 03:14:09.000000000","message":"I might not understand the reason you have an option to ignore the timezone.  You want to have your objects be synced to the same timezone, so that debugging a distributed service is easier.","commit_id":"dec024530bfe64319f382e09c6321c43088f6dc1"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"339f53fae5c8f81c4ec98af747330b2044b29e2e","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"class DateTime(FieldType):"},{"line_number":279,"context_line":"    def __init__(self, tzinfo_aware\u003dTrue, *args, **kwargs):"},{"line_number":280,"context_line":"        self.tzinfo_aware \u003d tzinfo_aware"},{"line_number":281,"context_line":"        super(DateTime, self).__init__(*args, **kwargs)"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_d1d86120","line":279,"in_reply_to":"ba7be1f8_8a495d33","updated":"2015-03-03 08:35:12.000000000","message":"I hit a typeerror \"can\u0027t subtract offset-naive and offset-aware datetimes\" when calculating the service_down_time.\n\nThe original times are without a timezone, so I\u0027m not changing this in this patch.","commit_id":"dec024530bfe64319f382e09c6321c43088f6dc1"}],"cinder/objects/service.py":[{"author":{"_account_id":10263,"name":"Vilobh Meshram","email":"vilobhmm@yahoo-inc.com","username":"vilobhmm"},"change_message_id":"6eaf8a0bd6b8f5acce785850626842d14184338e","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    @base.remotable_classmethod"},{"line_number":117,"context_line":"    def get_all_by_host(cls, context, host):"},{"line_number":118,"context_line":"        services \u003d db.service_get_all_by_host(context, host)"},{"line_number":119,"context_line":"        return base.obj_make_list(context, cls(context), Service, services)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_094500b3","line":118,"updated":"2015-03-10 17:16:55.000000000","message":"Is there even a call like db.service_get_all_by_host ? Or are you planning to add a new one ? But even in that case I don\u0027t see a change in db.api.py","commit_id":"7454455f3b55a9b5b47289151c4bf4a19fa4b28b"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"9b2c43844683073b252023a6dfc959ec5997f289","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    @base.remotable_classmethod"},{"line_number":117,"context_line":"    def get_all_by_host(cls, context, host):"},{"line_number":118,"context_line":"        services \u003d db.service_get_all_by_host(context, host)"},{"line_number":119,"context_line":"        return base.obj_make_list(context, cls(context), Service, services)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    @base.remotable_classmethod"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_985af34e","line":118,"in_reply_to":"9a80dd14_094500b3","updated":"2015-03-11 12:03:09.000000000","message":"You are right, removing it.","commit_id":"7454455f3b55a9b5b47289151c4bf4a19fa4b28b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1fd042ad5d46d4b8d5b5c496f529f16249733a44","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @base.remotable_classmethod"},{"line_number":110,"context_line":"    def get_all(cls, context, filters\u003dNone):"},{"line_number":111,"context_line":"        if filters is None:"},{"line_number":112,"context_line":"            services \u003d db.service_get_all(context)"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            services \u003d db.service_get_all(context, filters)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_3c90a942","line":111,"updated":"2015-03-13 12:57:59.000000000","message":"This if isn\u0027t required, you can just pass filters to the db.service_get_all.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"fc3a59d5519900487908ebb7b46eb7945b80c4c2","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @base.remotable_classmethod"},{"line_number":110,"context_line":"    def get_all(cls, context, filters\u003dNone):"},{"line_number":111,"context_line":"        if filters is None:"},{"line_number":112,"context_line":"            services \u003d db.service_get_all(context)"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            services \u003d db.service_get_all(context, filters)"}],"source_content_type":"text/x-python","patch_set":10,"id":"baa041b7_1f72cd49","line":111,"in_reply_to":"9a80dd14_35d6f74f","updated":"2015-04-07 07:32:41.000000000","message":"Ok, I\u0027m changing the tests to make this pass.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @base.remotable_classmethod"},{"line_number":110,"context_line":"    def get_all(cls, context, filters\u003dNone):"},{"line_number":111,"context_line":"        if filters is None:"},{"line_number":112,"context_line":"            services \u003d db.service_get_all(context)"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            services \u003d db.service_get_all(context, filters)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_35d6f74f","line":111,"in_reply_to":"9a80dd14_3c90a942","updated":"2015-03-13 14:02:11.000000000","message":"+1.  The if/else statement is not required.  You can just do - services \u003d db.service_get_all(context, filters)","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1fd042ad5d46d4b8d5b5c496f529f16249733a44","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @base.remotable_classmethod"},{"line_number":119,"context_line":"    def get_all_by_topic(cls, context, topic, disabled\u003dNone):"},{"line_number":120,"context_line":"        if disabled is None:"},{"line_number":121,"context_line":"            services \u003d db.service_get_all_by_topic(context, topic)"},{"line_number":122,"context_line":"        else:"},{"line_number":123,"context_line":"            services \u003d db.service_get_all_by_topic(context, topic, disabled)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_9c9b5565","line":120,"updated":"2015-03-13 12:57:59.000000000","message":"ditto","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"08e28382b3ccef40b1610dd66043baf30ee94aab","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        db_service \u003d db.service_create(context, updates)"},{"line_number":90,"context_line":"        self._from_db_object(context, self, db_service)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def save(self, context):"},{"line_number":93,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":94,"context_line":"        if updates:"},{"line_number":95,"context_line":"            db.service_update(context, self.id, updates)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aaa499b_8218f385","line":92,"updated":"2015-04-13 14:02:48.000000000","message":"This should have @base.remotable decorator.  It lets the context be injected on save using the embedded one (_context), if the context is not provided.","commit_id":"89819a235147919e52a9c76256254a4f23c674b5"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"3367fb202f66c388307fc996449e4bc02fbbba04","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \u0027host\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":38,"context_line":"        \u0027binary\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":39,"context_line":"        \u0027topic\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":40,"context_line":"        \u0027report_count\u0027: fields.IntegerField(nullable\u003dFalse, default\u003d0),"},{"line_number":41,"context_line":"        \u0027disabled\u0027: fields.BooleanField(default\u003dFalse),"},{"line_number":42,"context_line":"        \u0027availability_zone\u0027: fields.StringField(nullable\u003dTrue,"},{"line_number":43,"context_line":"                                                default\u003d\u0027cinder\u0027),"}],"source_content_type":"text/x-python","patch_set":17,"id":"9af37de9_78515062","line":40,"updated":"2015-05-10 22:16:49.000000000","message":"By default, fields are not nullable, i.e. nullable \u003d False.  So you do not have to put \"nullable\u003dFalse\" here.","commit_id":"558a5356620ee098be9867e2911d71ffd7dfe591"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"42089d8152d9d008d5e80af38eb2115cf089570a","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        return cls._from_db_object(context, cls(context), db_service)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @base.remotable"},{"line_number":84,"context_line":"    def create(self, context):"},{"line_number":85,"context_line":"        if self.obj_attr_is_set(\u0027id\u0027):"},{"line_number":86,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027create\u0027,"},{"line_number":87,"context_line":"                                              reason\u003d_(\u0027already created\u0027))"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_dad71522","line":84,"updated":"2015-05-14 02:03:01.000000000","message":"With the latest change to use oslo_versionedobjects, we should now be using the context (i.e. self._context) that is stashed in the object, instead of using and accepting the context passed in.  Please remove the context argument for create, delete, and save methods.  We should no longer be passing context into these methods, but instead use the context stashed in the object, i.e. self._context.  Thank you","commit_id":"e9f7009ece5c0cd66d20b5791eca2e422a2ef878"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"42089d8152d9d008d5e80af38eb2115cf089570a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    }"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    @base.remotable_classmethod"},{"line_number":116,"context_line":"    def get_all(cls, context, filters\u003dNone):"},{"line_number":117,"context_line":"        services \u003d db.service_get_all(context, filters)"},{"line_number":118,"context_line":"        return base.obj_make_list(context, cls(context), objects.Service,"},{"line_number":119,"context_line":"                                  services)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a016987_1aeecdec","line":116,"updated":"2015-05-14 02:03:01.000000000","message":"It is fine to have the context passed in for remotable_classmethod. We only need to remove the context as a parameter for remotable methods.","commit_id":"e9f7009ece5c0cd66d20b5791eca2e422a2ef878"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"9b5bb6280a8d2f408a306d28da6333bfe97a811f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":31,"context_line":"class Service(base.CinderPersistentObject, base.CinderObject,"},{"line_number":32,"context_line":"              base.CinderObjectDictCompat,"},{"line_number":33,"context_line":"              base.CinderComparableObject):"},{"line_number":34,"context_line":"    # Version 1.0: Initial version"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_a2a18048","line":33,"updated":"2015-05-27 16:21:39.000000000","message":"Any reason why base.CinderComparableObject is here?  From the description it is needed only - When objects are to be compared with each other (in tests for example), this mixin can be used.","commit_id":"8b0fe247b56b416d423fbdd116af3d8d3fa08f0c"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"5c540ae9fe7b12aef9177789b4ebb171eb460f98","unresolved":false,"context_lines":[{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":31,"context_line":"class Service(base.CinderPersistentObject, base.CinderObject,"},{"line_number":32,"context_line":"              base.CinderObjectDictCompat,"},{"line_number":33,"context_line":"              base.CinderComparableObject):"},{"line_number":34,"context_line":"    # Version 1.0: Initial version"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_a84dc89a","line":33,"in_reply_to":"7a016987_a2a18048","updated":"2015-05-28 08:26:48.000000000","message":"Take a look at test_host_manager.py - I needed to compare Service objects there as now HostManager stores objects instead of SQLAlchemy models.","commit_id":"8b0fe247b56b416d423fbdd116af3d8d3fa08f0c"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"966e3c16ef7c0a5a8e89f63c0a98ea00f7e9eb03","unresolved":false,"context_lines":[{"line_number":30,"context_line":"@base.CinderObjectRegistry.register"},{"line_number":31,"context_line":"class Service(base.CinderPersistentObject, base.CinderObject,"},{"line_number":32,"context_line":"              base.CinderObjectDictCompat,"},{"line_number":33,"context_line":"              base.CinderComparableObject):"},{"line_number":34,"context_line":"    # Version 1.0: Initial version"},{"line_number":35,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7a016987_3db6ae8a","line":33,"in_reply_to":"7a016987_a84dc89a","updated":"2015-05-28 14:09:04.000000000","message":"Ok, got it.  It was not clear there was a comparison being done for objects in self.assertEqual(expected, _mock_service_is_up.call_args_list).","commit_id":"8b0fe247b56b416d423fbdd116af3d8d3fa08f0c"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f302f6fdec8d23761b021f7e3638001a1630563a","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable"},{"line_number":102,"context_line":"    def destroy(self):"},{"line_number":103,"context_line":"        db.service_destroy(self._context, self.id)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa32b979_09244ab0","line":103,"updated":"2015-06-25 21:54:30.000000000","message":"\u0027service_destroy\u0027 requires admin context so this call could fail","commit_id":"0a5f5ffd69c7cea507b960c5b1c0348176bad996"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"cdd4be5ffdd85ec579f30158fc82028e4e73b54c","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable"},{"line_number":102,"context_line":"    def destroy(self):"},{"line_number":103,"context_line":"        db.service_destroy(self._context, self.id)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":31,"id":"ba3cc151_19b478f0","line":103,"in_reply_to":"fa32b979_09244ab0","updated":"2015-06-29 20:26:38.000000000","message":"+1, just need a \"with self.obj_as_admin():\" here.","commit_id":"0a5f5ffd69c7cea507b960c5b1c0348176bad996"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if updates:"},{"line_number":97,"context_line":"            db.service_update(self._context, self.id, updates)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.obj_reset_changes()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable"},{"line_number":102,"context_line":"    def destroy(self):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_210d7b3e","line":99,"updated":"2015-08-18 12:12:07.000000000","message":"This should be indented to be inside `if updates`","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        if updates:"},{"line_number":97,"context_line":"            db.service_update(self._context, self.id, updates)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.obj_reset_changes()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @base.remotable"},{"line_number":102,"context_line":"    def destroy(self):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_1858a831","line":99,"in_reply_to":"fa1b9901_210d7b3e","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"}],"cinder/scheduler/host_manager.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"fdf7f9b9f95383aa61efbf4e6ec10b51a754d7d0","unresolved":false,"context_lines":[{"line_number":481,"context_line":"        active_hosts \u003d set()"},{"line_number":482,"context_line":"        no_capabilities_hosts \u003d set()"},{"line_number":483,"context_line":"        for service in volume_services.objects:"},{"line_number":484,"context_line":"            host \u003d service[\u0027host\u0027]"},{"line_number":485,"context_line":"            if not utils.service_is_up(service):"},{"line_number":486,"context_line":"                LOG.warning(_LW(\"volume service is down. (host: %s)\"), host)"},{"line_number":487,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba3cc151_81d67f25","line":484,"updated":"2015-07-07 21:48:37.000000000","message":"service.host","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"}],"cinder/service.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        try:"},{"line_number":147,"context_line":"            service_ref \u003d objects.Service.get_by_args("},{"line_number":148,"context_line":"                ctxt, self.host, self.binary)"},{"line_number":149,"context_line":"            self.service_id \u003d service_ref[\u0027id\u0027]"},{"line_number":150,"context_line":"        except exception.NotFound:"},{"line_number":151,"context_line":"            self._create_service_ref(ctxt)"},{"line_number":152,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_55552bc0","line":149,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                  \u0027availability_zone\u0027: zone}"},{"line_number":206,"context_line":"        service_ref \u003d objects.Service(context\u003dcontext, **kwargs)"},{"line_number":207,"context_line":"        service_ref.create()"},{"line_number":208,"context_line":"        self.service_id \u003d service_ref[\u0027id\u0027]"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __getattr__(self, key):"},{"line_number":211,"context_line":"        manager \u003d self.__dict__.get(\u0027manager\u0027, None)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_95f963ca","line":208,"updated":"2015-03-13 14:02:11.000000000","message":"Use dot notation","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1fd042ad5d46d4b8d5b5c496f529f16249733a44","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    def kill(self):"},{"line_number":253,"context_line":"        \"\"\"Destroy the service object in the datastore.\"\"\""},{"line_number":254,"context_line":"        self.stop()"},{"line_number":255,"context_line":"        try:"},{"line_number":256,"context_line":"            db.service_destroy(context.get_admin_context(), self.service_id)"},{"line_number":257,"context_line":"        except exception.NotFound:"},{"line_number":258,"context_line":"            LOG.warn(_(\u0027Service killed that has no database entry\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_5ccd5d30","line":255,"updated":"2015-03-13 12:57:59.000000000","message":"I guess you missed this spot. Should service keep its own object instead of just service_id? I\u0027m not sure how to solve this.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"176398f389283bada3321eff7b063e81a43b067d","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    def kill(self):"},{"line_number":253,"context_line":"        \"\"\"Destroy the service object in the datastore.\"\"\""},{"line_number":254,"context_line":"        self.stop()"},{"line_number":255,"context_line":"        try:"},{"line_number":256,"context_line":"            db.service_destroy(context.get_admin_context(), self.service_id)"},{"line_number":257,"context_line":"        except exception.NotFound:"},{"line_number":258,"context_line":"            LOG.warn(_(\u0027Service killed that has no database entry\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_55960b3f","line":255,"in_reply_to":"9a80dd14_5ccd5d30","updated":"2015-03-13 14:02:11.000000000","message":"That might simplify a few things.  You can stash the object in the Service class, and every time you query the service by objects.Service.get_by_id, you can just do a service_obj.refresh().\n\nI think that is worth a separate patch though.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"1fd042ad5d46d4b8d5b5c496f529f16249733a44","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                self._create_service_ref(ctxt)"},{"line_number":298,"context_line":"                service_ref \u003d objects.Service.get_by_id(ctxt, self.service_id)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"            service_ref.report_count \u003d service_ref.report_count + 1"},{"line_number":301,"context_line":"            if zone !\u003d service_ref.availability_zone:"},{"line_number":302,"context_line":"                service_ref.availability_zone \u003d zone"},{"line_number":303,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a80dd14_1cecc5ba","line":300,"updated":"2015-03-13 12:57:59.000000000","message":"Just a nit, you can use +\u003d here.","commit_id":"dcc55305f07bc644d2da92b3a3e26bbaea75983f"}],"cinder/tests/test_cmd.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"ae114a0dbaa74ca11529490da1020424039f365b","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            self.assertEqual(expected_out, fake_out.getvalue())"},{"line_number":637,"context_line":"            get_admin_context.assert_called_with()"},{"line_number":638,"context_line":"            service_get_all.assert_called_with(ctxt)"},{"line_number":639,"context_line":"            # service_is_up.assert_called_with(service)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @mock.patch(\u0027oslo_config.cfg.ConfigOpts.register_cli_opt\u0027)"},{"line_number":642,"context_line":"    def test_main_argv_lt_2(self, register_cli_opt):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_4a292536","line":639,"updated":"2015-03-03 03:14:09.000000000","message":"You could delete this line.","commit_id":"dec024530bfe64319f382e09c6321c43088f6dc1"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"339f53fae5c8f81c4ec98af747330b2044b29e2e","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            self.assertEqual(expected_out, fake_out.getvalue())"},{"line_number":637,"context_line":"            get_admin_context.assert_called_with()"},{"line_number":638,"context_line":"            service_get_all.assert_called_with(ctxt)"},{"line_number":639,"context_line":"            # service_is_up.assert_called_with(service)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":"    @mock.patch(\u0027oslo_config.cfg.ConfigOpts.register_cli_opt\u0027)"},{"line_number":642,"context_line":"    def test_main_argv_lt_2(self, register_cli_opt):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba7be1f8_5158f189","line":639,"in_reply_to":"ba7be1f8_4a292536","updated":"2015-03-03 08:35:12.000000000","message":"Ok, I\u0027m removing it\u0027 since service_is_up is called with the Service object, not a dict.","commit_id":"dec024530bfe64319f382e09c6321c43088f6dc1"}],"cinder/tests/unit/api/contrib/test_services.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"3db39144ebd192c5ab53b318bf55b22922ee0057","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"def fake_utcnow(with_timezone\u003dFalse):"},{"line_number":157,"context_line":"    tzinfo \u003d pytz.UTC if with_timezone else None"},{"line_number":158,"context_line":"    return datetime.datetime(2012, 10, 29, 13, 42, 11, tzinfo\u003dtzinfo)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"ba3cc151_3fe0e3f9","line":157,"updated":"2015-07-01 12:34:24.000000000","message":"Why not use iso8601.iso8601.Utc()?  iso8601 is already in the requirement - https://github.com/openstack/cinder/blob/master/requirements.txt#L10.","commit_id":"c2512779b24ef63ce6e29d5ecb41a4c6f50a2933"}],"cinder/tests/unit/fake_service.py":[{"author":{"_account_id":16708,"name":"Kendall Nelson","display_name":"Kendall (diablo_rojo)","email":"kennelson11@gmail.com","username":"kjnelson"},"change_message_id":"c9cc874476b0c8b353bd304323028261c1033f68","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        elif field.default !\u003d fields.UnspecifiedDefault:"},{"line_number":44,"context_line":"            db_service[name] \u003d field.default"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            raise Exception(\u0027fake_db_service needs help with %s\u0027 % name)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if updates:"},{"line_number":49,"context_line":"        db_service.update(updates)"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba3cc151_8f04737e","line":46,"updated":"2015-07-07 18:20:19.000000000","message":"\".\" at EOL","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"af5f2dfd374e00a8610478f6215ed74958a12075","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        elif field.default !\u003d fields.UnspecifiedDefault:"},{"line_number":44,"context_line":"            db_service[name] \u003d field.default"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            raise Exception(\u0027fake_db_service needs help with %s\u0027 % name)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if updates:"},{"line_number":49,"context_line":"        db_service.update(updates)"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba3cc151_25df6a6a","line":46,"in_reply_to":"ba3cc151_8f04737e","updated":"2015-07-08 09:31:20.000000000","message":"This is used just for unit tests, so I don\u0027t see the point in wasting time for such nits, but okay.","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"}],"cinder/tests/unit/objects/test_service.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f302f6fdec8d23761b021f7e3638001a1630563a","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from cinder import objects"},{"line_number":19,"context_line":"from cinder.tests.unit import fake_service"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestService(test_objects._LocalTest):"},{"line_number":23,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa32b979_572aee91","line":20,"updated":"2015-06-25 21:54:30.000000000","message":"These tests have the same issue which was fixed in https://review.openstack.org/#/c/193861/","commit_id":"0a5f5ffd69c7cea507b960c5b1c0348176bad996"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":47,"context_line":"        service_get.return_value \u003d db_service"},{"line_number":48,"context_line":"        service \u003d objects.Service.get_by_id(self.context, 1)"},{"line_number":49,"context_line":"        self._compare(self, db_service, service)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @mock.patch(\u0027cinder.db.service_get_by_host_and_topic\u0027)"},{"line_number":52,"context_line":"    def test_get_by_host_and_topic(self, service_get_by_host_and_topic):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_64ddc141","line":49,"updated":"2015-08-18 12:12:07.000000000","message":"You should assert that db.service_get is called with the right id","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":47,"context_line":"        service_get.return_value \u003d db_service"},{"line_number":48,"context_line":"        service \u003d objects.Service.get_by_id(self.context, 1)"},{"line_number":49,"context_line":"        self._compare(self, db_service, service)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @mock.patch(\u0027cinder.db.service_get_by_host_and_topic\u0027)"},{"line_number":52,"context_line":"    def test_get_by_host_and_topic(self, service_get_by_host_and_topic):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_7878c48f","line":49,"in_reply_to":"fa1b9901_64ddc141","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        service_get_by_host_and_topic.return_value \u003d db_service"},{"line_number":55,"context_line":"        service \u003d objects.Service.get_by_host_and_topic("},{"line_number":56,"context_line":"            self.context, \u0027fake-host\u0027, \u0027fake-topic\u0027)"},{"line_number":57,"context_line":"        self._compare(self, db_service, service)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @mock.patch(\u0027cinder.db.service_get_by_args\u0027)"},{"line_number":60,"context_line":"    def test_get_by_args(self, service_get_by_args):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_a4baf9df","line":57,"updated":"2015-08-18 12:12:07.000000000","message":"Assert that db.service_get_by_host_and_topic is called with the right arguments in the right order","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        service_get_by_host_and_topic.return_value \u003d db_service"},{"line_number":55,"context_line":"        service \u003d objects.Service.get_by_host_and_topic("},{"line_number":56,"context_line":"            self.context, \u0027fake-host\u0027, \u0027fake-topic\u0027)"},{"line_number":57,"context_line":"        self._compare(self, db_service, service)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @mock.patch(\u0027cinder.db.service_get_by_args\u0027)"},{"line_number":60,"context_line":"    def test_get_by_args(self, service_get_by_args):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_38724cae","line":57,"in_reply_to":"fa1b9901_a4baf9df","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        service_get_by_args.return_value \u003d db_service"},{"line_number":63,"context_line":"        service \u003d objects.Service.get_by_args("},{"line_number":64,"context_line":"            self.context, \u0027fake-host\u0027, \u0027fake-key\u0027)"},{"line_number":65,"context_line":"        self._compare(self, db_service, service)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @mock.patch(\u0027cinder.db.service_create\u0027)"},{"line_number":68,"context_line":"    def test_create(self, service_create):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_44cc3d89","line":65,"updated":"2015-08-18 12:12:07.000000000","message":"Assert db call","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        service_get_by_args.return_value \u003d db_service"},{"line_number":63,"context_line":"        service \u003d objects.Service.get_by_args("},{"line_number":64,"context_line":"            self.context, \u0027fake-host\u0027, \u0027fake-key\u0027)"},{"line_number":65,"context_line":"        self._compare(self, db_service, service)"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @mock.patch(\u0027cinder.db.service_create\u0027)"},{"line_number":68,"context_line":"    def test_create(self, service_create):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_d869d0bf","line":65,"in_reply_to":"fa1b9901_44cc3d89","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        service_create.return_value \u003d db_service"},{"line_number":71,"context_line":"        service \u003d objects.Service(context\u003dself.context)"},{"line_number":72,"context_line":"        service.create()"},{"line_number":73,"context_line":"        self.assertEqual(db_service[\u0027id\u0027], service.id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @mock.patch(\u0027cinder.db.service_update\u0027)"},{"line_number":76,"context_line":"    def test_save(self, service_update):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_c4bb6dc3","line":73,"updated":"2015-08-18 12:12:07.000000000","message":"Assert db call","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        service_create.return_value \u003d db_service"},{"line_number":71,"context_line":"        service \u003d objects.Service(context\u003dself.context)"},{"line_number":72,"context_line":"        service.create()"},{"line_number":73,"context_line":"        self.assertEqual(db_service[\u0027id\u0027], service.id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @mock.patch(\u0027cinder.db.service_update\u0027)"},{"line_number":76,"context_line":"    def test_save(self, service_update):"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_f864d4e5","line":73,"in_reply_to":"fa1b9901_c4bb6dc3","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        service \u003d objects.Service._from_db_object("},{"line_number":89,"context_line":"            self.context, objects.Service(), db_service)"},{"line_number":90,"context_line":"        service.destroy()"},{"line_number":91,"context_line":"        self.assertTrue(service_destroy.called)"},{"line_number":92,"context_line":"        admin_context \u003d service_destroy.call_args[0][0]"},{"line_number":93,"context_line":"        self.assertTrue(admin_context.is_admin)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_24f90981","line":91,"range":{"start_line":91,"start_character":40,"end_line":91,"end_character":46},"updated":"2015-08-18 12:12:07.000000000","message":"Assert arguments used","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        service \u003d objects.Service._from_db_object("},{"line_number":89,"context_line":"            self.context, objects.Service(), db_service)"},{"line_number":90,"context_line":"        service.destroy()"},{"line_number":91,"context_line":"        self.assertTrue(service_destroy.called)"},{"line_number":92,"context_line":"        admin_context \u003d service_destroy.call_args[0][0]"},{"line_number":93,"context_line":"        self.assertTrue(admin_context.is_admin)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_b85e5c10","line":91,"in_reply_to":"fa1b9901_24f90981","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":100,"context_line":"        service_get_all.return_value \u003d [db_service]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        services \u003d objects.ServiceList.get_all(self.context)"},{"line_number":103,"context_line":"        self.assertEqual(1, len(services))"},{"line_number":104,"context_line":"        TestService._compare(self, db_service, services[0])"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_843a5535","line":102,"range":{"start_line":102,"start_character":52,"end_line":102,"end_character":59},"updated":"2015-08-18 12:12:07.000000000","message":"Should test that filters are passed down to db","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":100,"context_line":"        service_get_all.return_value \u003d [db_service]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        services \u003d objects.ServiceList.get_all(self.context)"},{"line_number":103,"context_line":"        self.assertEqual(1, len(services))"},{"line_number":104,"context_line":"        TestService._compare(self, db_service, services[0])"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_187d086e","line":102,"in_reply_to":"fa1b9901_843a5535","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":109,"context_line":"        service_get_all_by_topic.return_value \u003d [db_service]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        services \u003d objects.ServiceList.get_all_by_topic(self.context, \u0027fake\u0027)"},{"line_number":112,"context_line":"        self.assertEqual(1, len(services))"},{"line_number":113,"context_line":"        TestService._compare(self, db_service, services[0])"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_443d1d2a","line":111,"range":{"start_line":111,"start_character":55,"end_line":111,"end_character":56},"updated":"2015-08-18 12:12:07.000000000","message":"Should test that disabled is passed down to db","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        db_service \u003d fake_service.fake_db_service()"},{"line_number":109,"context_line":"        service_get_all_by_topic.return_value \u003d [db_service]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        services \u003d objects.ServiceList.get_all_by_topic(self.context, \u0027fake\u0027)"},{"line_number":112,"context_line":"        self.assertEqual(1, len(services))"},{"line_number":113,"context_line":"        TestService._compare(self, db_service, services[0])"}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_f892949e","line":111,"in_reply_to":"fa1b9901_443d1d2a","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"}],"cinder/tests/unit/scheduler/test_host_manager.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c93dbaba1b63a650b8491574e9ab76670eb2e542","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                                                          disabled\u003dFalse)"},{"line_number":295,"context_line":"        expected \u003d []"},{"line_number":296,"context_line":"        for service in service_objs:"},{"line_number":297,"context_line":"            expected.append(mock.call(service))"},{"line_number":298,"context_line":"        self.assertEqual(expected, _mock_service_is_up.call_args_list)"},{"line_number":299,"context_line":"        self.assertTrue(_mock_warning.call_count \u003e 0)"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_df557ac6","line":297,"range":{"start_line":297,"start_character":12,"end_line":297,"end_character":20},"updated":"2015-08-18 12:12:07.000000000","message":"nit: We don\u0027t need these 3 lines","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"},{"author":{"_account_id":12825,"name":"Szymon Wróblewski","email":"szymon.wroblewski@ovhcloud.com","username":"bluex"},"change_message_id":"abf9bc77dfcd378c0e44fafaad2ee673cc590a78","unresolved":false,"context_lines":[{"line_number":294,"context_line":"                                                          disabled\u003dFalse)"},{"line_number":295,"context_line":"        expected \u003d []"},{"line_number":296,"context_line":"        for service in service_objs:"},{"line_number":297,"context_line":"            expected.append(mock.call(service))"},{"line_number":298,"context_line":"        self.assertEqual(expected, _mock_service_is_up.call_args_list)"},{"line_number":299,"context_line":"        self.assertTrue(_mock_warning.call_count \u003e 0)"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"fa1b9901_18f428f0","line":297,"in_reply_to":"fa1b9901_df557ac6","updated":"2015-08-19 14:48:32.000000000","message":"Done","commit_id":"c7bb80a0cd5ec82ec881258afe345ffbf228e07c"}],"cinder/volume/api.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"08e28382b3ccef40b1610dd66043baf30ee94aab","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"        found \u003d False"},{"line_number":1152,"context_line":"        for service in services:"},{"line_number":1153,"context_line":"            svc_host \u003d volume_utils.extract_host(host, \u0027backend\u0027)"},{"line_number":1154,"context_line":"            if utils.service_is_up(service) and service[\u0027host\u0027] \u003d\u003d svc_host:"},{"line_number":1155,"context_line":"                found \u003d True"},{"line_number":1156,"context_line":"        if not found:"},{"line_number":1157,"context_line":"            msg \u003d _(\u0027No available service named %s\u0027) % host"}],"source_content_type":"text/x-python","patch_set":14,"id":"7aaa499b_fd3e3cb7","line":1154,"updated":"2015-04-13 14:02:48.000000000","message":"service.host","commit_id":"89819a235147919e52a9c76256254a4f23c674b5"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"fdf7f9b9f95383aa61efbf4e6ec10b51a754d7d0","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            topic \u003d CONF.volume_topic"},{"line_number":146,"context_line":"            ctxt \u003d context.get_admin_context()"},{"line_number":147,"context_line":"            services \u003d objects.ServiceList.get_all_by_topic(ctxt, topic)"},{"line_number":148,"context_line":"            az_data \u003d [(s[\u0027availability_zone\u0027], s[\u0027disabled\u0027])"},{"line_number":149,"context_line":"                       for s in services]"},{"line_number":150,"context_line":"            disabled_map \u003d {}"},{"line_number":151,"context_line":"            for (az_name, disabled) in az_data:"}],"source_content_type":"text/x-python","patch_set":36,"id":"ba3cc151_e1a3cb9c","line":148,"updated":"2015-07-07 21:48:37.000000000","message":"s.availability_zone, s.disabled","commit_id":"350fa7b4f5b528a6b2a97d12e54c6504d3c10319"}]}
