)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Combined two issues since they are both minor changes."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ib7fb79ba5bef8a50cdb500db6e62694aca6aa640"},{"line_number":21,"context_line":"Closes-bug: #1229811"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2FfX8%3D","line":21,"updated":"2013-09-26 05:33:39.000000000","message":"L.11 says this patch is a partial fix of bug 1229811.\nIf so, please use \"Partial-Bug\" instead of \"Closes-Bug\".\n\nFor more detail please refer to https://wiki.openstack.org/wiki/Gerrit_Workflow#Committing_Changes","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":18,"context_line":"Combined two issues since they are both minor changes."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ib7fb79ba5bef8a50cdb500db6e62694aca6aa640"},{"line_number":21,"context_line":"Closes-bug: #1229811"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAS3%2F%2FeKA%3D","line":21,"in_reply_to":"AAAAS3%2F%2FfX8%3D","updated":"2013-09-26 06:42:28.000000000","message":"Thanks for pointing this out. Will change.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"}],"openstack_dashboard/api/neutron.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4abfe86f7a8c52dd067aebbb66370e7ddca0f1c4","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    elif type_p \u003d\u003d \u0027policy\u0027:"},{"line_number":665,"context_line":"        bindings \u003d neutronclient(request).list_policy_profile_bindings("},{"line_number":666,"context_line":"            **params).get(\u0027policy_profile_bindings\u0027)"},{"line_number":667,"context_line":"    return bindings"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"def router_create(request, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F3yA%3D","line":667,"updated":"2014-03-13 09:00:04.000000000","message":"I am not sure this change is appropriate. It prevents us from using attribute access for binding object.","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"4c6a7417c5900ae69af003b9b0e83e45e1beebd2","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    elif type_p \u003d\u003d \u0027policy\u0027:"},{"line_number":665,"context_line":"        bindings \u003d neutronclient(request).list_policy_profile_bindings("},{"line_number":666,"context_line":"            **params).get(\u0027policy_profile_bindings\u0027)"},{"line_number":667,"context_line":"    return bindings"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"def router_create(request, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2Fy34%3D","line":667,"in_reply_to":"AAAAWH%2F%2F0No%3D","updated":"2014-03-13 19:05:30.000000000","message":"Yes - I\u0027d prefer that too. I misunderstood your original comment. I\u0027ll revert the change here and do the mapping in views.py\nI\u0027ll make sure the return is the same as the original.","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7f0cec2c5641b5cf12d51b95cf814caedf9cc968","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    elif type_p \u003d\u003d \u0027policy\u0027:"},{"line_number":665,"context_line":"        bindings \u003d neutronclient(request).list_policy_profile_bindings("},{"line_number":666,"context_line":"            **params).get(\u0027policy_profile_bindings\u0027)"},{"line_number":667,"context_line":"    return bindings"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"def router_create(request, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F0No%3D","line":667,"in_reply_to":"AAAAWH%2F%2F2HE%3D","updated":"2014-03-13 16:25:05.000000000","message":"IMO it is better to keep the previous one here and generate a mapping dict from profile to tenant in views.py. Thought?","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"bed431176772f079830352c6c3f5dcd31bc71f61","unresolved":false,"context_lines":[{"line_number":664,"context_line":"    elif type_p \u003d\u003d \u0027policy\u0027:"},{"line_number":665,"context_line":"        bindings \u003d neutronclient(request).list_policy_profile_bindings("},{"line_number":666,"context_line":"            **params).get(\u0027policy_profile_bindings\u0027)"},{"line_number":667,"context_line":"    return bindings"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"def router_create(request, **kwargs):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F2HE%3D","line":667,"in_reply_to":"AAAAWH%2F%2F3yA%3D","updated":"2014-03-13 12:24:59.000000000","message":"Sure. I can agree with that. Will make the change here in the API.\n\nAlthough now the API will be returning the created dictionary of \u0027profile_id\u0027: \u0027tenant_id\u0027","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"}],"openstack_dashboard/dashboards/project/instances/workflows/create_instance.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":609,"context_line":"        # Create port with Network Name and Port Profile"},{"line_number":610,"context_line":"        # for the use with the plugin supporting port profiles."},{"line_number":611,"context_line":"        # neutron port-create \u003cNetwork name\u003e --n1kv:profile \u003cPort Profile ID\u003e"},{"line_number":612,"context_line":"        # for net_id in context[\u0027network_id\u0027]:"},{"line_number":613,"context_line":"        if api.neutron.is_port_profiles_supported():"},{"line_number":614,"context_line":"            net_ids \u003d context[\u0027network_id\u0027]"},{"line_number":615,"context_line":"            nics \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfU4%3D","line":612,"updated":"2013-09-26 05:33:39.000000000","message":"L.611-612 looks unnecessary.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":609,"context_line":"        # Create port with Network Name and Port Profile"},{"line_number":610,"context_line":"        # for the use with the plugin supporting port profiles."},{"line_number":611,"context_line":"        # neutron port-create \u003cNetwork name\u003e --n1kv:profile \u003cPort Profile ID\u003e"},{"line_number":612,"context_line":"        # for net_id in context[\u0027network_id\u0027]:"},{"line_number":613,"context_line":"        if api.neutron.is_port_profiles_supported():"},{"line_number":614,"context_line":"            net_ids \u003d context[\u0027network_id\u0027]"},{"line_number":615,"context_line":"            nics \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJ8%3D","line":612,"in_reply_to":"AAAAS3%2F%2FfU4%3D","updated":"2013-09-26 06:42:28.000000000","message":"Done","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            nics \u003d []"},{"line_number":616,"context_line":"            for nid in net_ids:"},{"line_number":617,"context_line":"                LOG.debug(_(\"Horizon-\u003eCreate Port with \""},{"line_number":618,"context_line":"                            \"%(netid)s %(profile_id)s\"),"},{"line_number":619,"context_line":"                          {\u0027netid\u0027: nid,"},{"line_number":620,"context_line":"                           \u0027profile_id\u0027: context[\u0027profile_id\u0027]})"},{"line_number":621,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfZY%3D","line":618,"updated":"2013-09-26 05:33:39.000000000","message":"A patch removing _() (gettext_lazy) is proposed. Please remove _().\n\n\"Horizon-\u003e\" does not looks useful.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            nics \u003d []"},{"line_number":616,"context_line":"            for nid in net_ids:"},{"line_number":617,"context_line":"                LOG.debug(_(\"Horizon-\u003eCreate Port with \""},{"line_number":618,"context_line":"                            \"%(netid)s %(profile_id)s\"),"},{"line_number":619,"context_line":"                          {\u0027netid\u0027: nid,"},{"line_number":620,"context_line":"                           \u0027profile_id\u0027: context[\u0027profile_id\u0027]})"},{"line_number":621,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJ4%3D","line":618,"in_reply_to":"AAAAS3%2F%2FfZY%3D","updated":"2013-09-26 06:42:28.000000000","message":"Done","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                                                   policy_profile_id\u003d"},{"line_number":624,"context_line":"                                                   context[\u0027profile_id\u0027])"},{"line_number":625,"context_line":"                except Exception:"},{"line_number":626,"context_line":"                    msg \u003d (_(\u0027Port not created for profile-id (%s).\u0027) %"},{"line_number":627,"context_line":"                           context[\u0027profile_id\u0027])"},{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfY8%3D","line":626,"updated":"2013-09-26 05:33:39.000000000","message":"ditto","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"182bbba2b6644c7e887d86a3fba6957d769a9278","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                                                   policy_profile_id\u003d"},{"line_number":624,"context_line":"                                                   context[\u0027profile_id\u0027])"},{"line_number":625,"context_line":"                except Exception:"},{"line_number":626,"context_line":"                    msg \u003d (_(\u0027Port not created for profile-id (%s).\u0027) %"},{"line_number":627,"context_line":"                           context[\u0027profile_id\u0027])"},{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FM6k%3D","line":626,"in_reply_to":"AAAAS3%2F%2FeJ0%3D","updated":"2013-10-02 13:16:57.000000000","message":"Sorry. This is my bad. This message is used as an exception message. Please keep it translatable.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":623,"context_line":"                                                   policy_profile_id\u003d"},{"line_number":624,"context_line":"                                                   context[\u0027profile_id\u0027])"},{"line_number":625,"context_line":"                except Exception:"},{"line_number":626,"context_line":"                    msg \u003d (_(\u0027Port not created for profile-id (%s).\u0027) %"},{"line_number":627,"context_line":"                           context[\u0027profile_id\u0027])"},{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJ0%3D","line":626,"in_reply_to":"AAAAS3%2F%2FfY8%3D","updated":"2013-09-26 06:42:28.000000000","message":"Done","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":625,"context_line":"                except Exception:"},{"line_number":626,"context_line":"                    msg \u003d (_(\u0027Port not created for profile-id (%s).\u0027) %"},{"line_number":627,"context_line":"                           context[\u0027profile_id\u0027])"},{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"                if port and port.id:"},{"line_number":631,"context_line":"                    nics.append({\"port-id\": port.id})"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfZE%3D","line":628,"updated":"2013-09-26 05:33:39.000000000","message":"When exception is raised, port is not defined.\nI am not sure the processing should abort here or launch an instance anyway. If the former, add redirect to handle(). If the latter, add continue here.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":625,"context_line":"                except Exception:"},{"line_number":626,"context_line":"                    msg \u003d (_(\u0027Port not created for profile-id (%s).\u0027) %"},{"line_number":627,"context_line":"                           context[\u0027profile_id\u0027])"},{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"                if port and port.id:"},{"line_number":631,"context_line":"                    nics.append({\"port-id\": port.id})"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJw%3D","line":628,"in_reply_to":"AAAAS3%2F%2FfZE%3D","updated":"2013-09-26 06:42:28.000000000","message":"Done","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"                if port and port.id:"},{"line_number":631,"context_line":"                    nics.append({\"port-id\": port.id})"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        try:"},{"line_number":634,"context_line":"            api.nova.server_create(request,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfYs%3D","line":631,"updated":"2013-09-26 05:33:39.000000000","message":"It is better to update the unit tests corresponding to this change. particularly it is better to cover a case where an exception is raised.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":628,"context_line":"                    exceptions.handle(request, msg)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":"                if port and port.id:"},{"line_number":631,"context_line":"                    nics.append({\"port-id\": port.id})"},{"line_number":632,"context_line":""},{"line_number":633,"context_line":"        try:"},{"line_number":634,"context_line":"            api.nova.server_create(request,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJo%3D","line":631,"in_reply_to":"AAAAS3%2F%2FfYs%3D","updated":"2013-09-26 06:42:28.000000000","message":"Agreed. Will update UT and send new patch,","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"}],"openstack_dashboard/dashboards/router/nexus1000v/tables.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"38c7088bbc201c9fae8409ab9de6c0d512d7082f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"class EditPolicyProfile(tables.LinkAction):"},{"line_number":80,"context_line":"    name \u003d \"edit\""},{"line_number":81,"context_line":"    verbose_name \u003d _(\"Edit Policy Profile\")"},{"line_number":82,"context_line":"    url \u003d \"horizon:project:images_and_snapshots:images:update\""},{"line_number":83,"context_line":"    classes \u003d (\"ajax-modal\", \"btn-edit\")"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FfWs%3D","line":82,"updated":"2013-09-26 05:33:39.000000000","message":"Is it a correct url?\nIt seems policy profile and image are unrelated.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58eafca35248e74a7e96454a03248cbacc5d9b3d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"class EditPolicyProfile(tables.LinkAction):"},{"line_number":80,"context_line":"    name \u003d \"edit\""},{"line_number":81,"context_line":"    verbose_name \u003d _(\"Edit Policy Profile\")"},{"line_number":82,"context_line":"    url \u003d \"horizon:project:images_and_snapshots:images:update\""},{"line_number":83,"context_line":"    classes \u003d (\"ajax-modal\", \"btn-edit\")"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAS3%2F%2FeJg%3D","line":82,"in_reply_to":"AAAAS3%2F%2FfWs%3D","updated":"2013-09-26 06:42:28.000000000","message":"Ah thanks for catching this. This section shouldn\u0027t be here. It is unused here.","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f225cf90d632bc0fc0c62e894b438b3cc6cdccdb","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        row_actions \u003d (EditNetworkProfile, DeleteNetworkProfile,)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class EditPolicyProfile(tables.LinkAction):"},{"line_number":82,"context_line":"    name \u003d \"edit\""},{"line_number":83,"context_line":"    verbose_name \u003d _(\"Edit Policy Profile\")"},{"line_number":84,"context_line":"    url \u003d \"horizon:project:images:images:update\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2Fu1M%3D","side":"PARENT","line":81,"updated":"2014-03-14 06:14:13.000000000","message":"Please mention that this class is removed in the commit message.\n\nThis class is not used anywhere, so I think you remove it in this patch.\nIf there is no note in the commit message, it seems unrelated to the bug fix.","commit_id":"6a818a1c25a73f6e5445ae7fd645a4ff50be726a"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"3d98b493eae1aaf6d3b29d15d2d3d83766aaab6b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        row_actions \u003d (EditNetworkProfile, DeleteNetworkProfile,)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"class EditPolicyProfile(tables.LinkAction):"},{"line_number":82,"context_line":"    name \u003d \"edit\""},{"line_number":83,"context_line":"    verbose_name \u003d _(\"Edit Policy Profile\")"},{"line_number":84,"context_line":"    url \u003d \"horizon:project:images:images:update\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAWH%2F%2Fuvc%3D","side":"PARENT","line":81,"in_reply_to":"AAAAWH%2F%2Fu1M%3D","updated":"2014-03-14 06:33:40.000000000","message":"Done","commit_id":"6a818a1c25a73f6e5445ae7fd645a4ff50be726a"}],"openstack_dashboard/dashboards/router/nexus1000v/views.py":[{"author":{"_account_id":6914,"name":"Tatiana Ovchinnikova","email":"t.v.ovtchinnikova@gmail.com","username":"tmazur"},"change_message_id":"f16ef9f704ca966d5e0f7934d1f45a4174469d5d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":60,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":61,"context_line":"        for p in profiles:"},{"line_number":62,"context_line":"        # Set tenant name"},{"line_number":63,"context_line":"            if bindings:"},{"line_number":64,"context_line":"                for b in bindings:"},{"line_number":65,"context_line":"                    if (p.id \u003d\u003d b.profile_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAATn%2F%2Fjbk%3D","line":62,"updated":"2013-11-01 13:37:32.000000000","message":"\"project name\"?","commit_id":"67e74d4ffe6681b72a8730e0c76adc57d2eccb3f"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"78d04183b9c9927e89655dfa230503ee09cb66d2","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        exceptions.handle(request, msg)"},{"line_number":59,"context_line":"    if profiles:"},{"line_number":60,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FGaE%3D","line":61,"updated":"2014-03-09 20:33:26.000000000","message":"It looks better to prepare a dict to lookup bindings. If so, we can avoid double for-loop below.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"1fd12d8ad27c34f11ef015ac946dfba949752dec","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        exceptions.handle(request, msg)"},{"line_number":59,"context_line":"    if profiles:"},{"line_number":60,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAWH%2F%2F31M%3D","line":61,"in_reply_to":"AAAAVn%2F%2B0t8%3D","updated":"2014-03-13 08:47:21.000000000","message":"Yes.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"d6725622b80464995ca2527ca15e3d236ccb579e","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        exceptions.handle(request, msg)"},{"line_number":59,"context_line":"    if profiles:"},{"line_number":60,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B0t8%3D","line":61,"in_reply_to":"AAAAVn%2F%2B1R8%3D","updated":"2014-03-11 22:52:05.000000000","message":"Oh! I think I understand.. you mean something like this yes?\n\n        bindings \u003d api.neutron.profile_bindings_list(request, type_p)\n        bindings_dict \u003d datastructures.SortedDict(\n            [(b.profile_id, b.tenant_id) for b in bindings])\n        for p in profiles:\n            project_id \u003d bindings_dict.get(p.id)\n            project \u003d tenant_dict.get(project_id)\n            p.project_name \u003d getattr(project, \u0027name\u0027, None)","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58b678229a27e6d6e70d933178434ae993fcddf9","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        exceptions.handle(request, msg)"},{"line_number":59,"context_line":"    if profiles:"},{"line_number":60,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B1R8%3D","line":61,"in_reply_to":"AAAAVn%2F%2FGaE%3D","updated":"2014-03-11 21:22:48.000000000","message":"Hmm I\u0027m a little confused about this. I\u0027m not sure how you would avoid a 2 stage look up. I could remove the for loop within the for loop.. but I\u0027d still need a second loop outside.\n\nMaybe an examination of the data will shed some light.\nThis is what I have:\nProfiles - [ \u003cProfile: {u\u0027segment_range\u0027: u\u0027600-630\u0027, u\u0027segment_type\u0027: u\u0027vlan\u0027, u\u0027name\u0027: u\u0027ab_vlan_np2\u0027, u\u0027sub_type\u0027: None, u\u0027physical_network\u0027: u\u0027ab_vlan_pp2\u0027, u\u0027id\u0027: u\u00278ca5865e-96bb-443f-89bf-fe02e0422778\u0027, u\u0027multicast_ip_range\u0027: u\u0027\u0027}\u003e,\u003cProfile: {u\u0027segment_range\u0027: u\u00277350-7360\u0027, u\u0027segment_type\u0027: u\u0027overlay\u0027, u\u0027name\u0027: u\u0027ab_vxlan_np2\u0027, u\u0027sub_type\u0027: u\u0027native_vxlan\u0027, u\u0027physical_network\u0027: None, u\u0027id\u0027: u\u0027adefe446-4fcf-4355-92ed-9a4d2b4fc956\u0027, u\u0027multicast_ip_range\u0027: u\u0027242.0.1.0-242.0.1.10\u0027}\u003e]\nBindings - [\u003cProfile: {u\u0027tenant_id\u0027: u\u0027cb8d0ccca93249c8a8cebf320bf52932\u0027, u\u0027profile_id\u0027: u\u00278ca5865e-96bb-443f-89bf-fe02e0422778\u0027}\u003e, \u003cProfile: {u\u0027tenant_id\u0027: u\u0027cb8d0ccca93249c8a8cebf320bf52932\u0027, u\u0027profile_id\u0027: u\u0027adefe446-4fcf-4355-92ed-9a4d2b4fc956\u0027}\u003e]\n\nI\u0027m trying to now add a project_name field to Profile so that I can display the name in the table. So I take the \"id\" field in profile and I have to search through bindings to see which matches \"profile_id\" within bindings. Once I find the match, I then take the tenant_id from bindings and use the keystone.tenant_list to get the appropriate tenant and then copy the name attribute from that tenant. \n\nI\u0027m not sure how I can traverse through both the profile dict and the bindings dict without a second for loop. \n\nI could do a n + n instead of a n*n and move the second for loop outside the first. I\u0027d still need a second for loop though.\n\nMake sense?","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"78d04183b9c9927e89655dfa230503ee09cb66d2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"},{"line_number":65,"context_line":"                for b in bindings:"},{"line_number":66,"context_line":"                    if (p.id \u003d\u003d b.profile_id):"},{"line_number":67,"context_line":"                        project \u003d tenant_dict.get(b.tenant_id, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FGag%3D","line":64,"updated":"2014-03-09 20:33:26.000000000","message":"Does profile_bindings_list always return a list or is there a case where it returns None? If it always returns a list, this line is unnecessary.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58b678229a27e6d6e70d933178434ae993fcddf9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":62,"context_line":"        for p in profiles:"},{"line_number":63,"context_line":"        # Set project name"},{"line_number":64,"context_line":"            if bindings:"},{"line_number":65,"context_line":"                for b in bindings:"},{"line_number":66,"context_line":"                    if (p.id \u003d\u003d b.profile_id):"},{"line_number":67,"context_line":"                        project \u003d tenant_dict.get(b.tenant_id, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B1Ro%3D","line":64,"in_reply_to":"AAAAVn%2F%2FGag%3D","updated":"2014-03-11 21:22:48.000000000","message":"Sure. This can be removed.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"78d04183b9c9927e89655dfa230503ee09cb66d2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            if bindings:"},{"line_number":65,"context_line":"                for b in bindings:"},{"line_number":66,"context_line":"                    if (p.id \u003d\u003d b.profile_id):"},{"line_number":67,"context_line":"                        project \u003d tenant_dict.get(b.tenant_id, None)"},{"line_number":68,"context_line":"                        p.project_name \u003d getattr(project, \u0027name\u0027, None)"},{"line_number":69,"context_line":"    return profiles"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FGa8%3D","line":67,"updated":"2014-03-09 20:33:26.000000000","message":"None is unnecessary.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58b678229a27e6d6e70d933178434ae993fcddf9","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            if bindings:"},{"line_number":65,"context_line":"                for b in bindings:"},{"line_number":66,"context_line":"                    if (p.id \u003d\u003d b.profile_id):"},{"line_number":67,"context_line":"                        project \u003d tenant_dict.get(b.tenant_id, None)"},{"line_number":68,"context_line":"                        p.project_name \u003d getattr(project, \u0027name\u0027, None)"},{"line_number":69,"context_line":"    return profiles"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B1Rk%3D","line":67,"in_reply_to":"AAAAVn%2F%2FGa8%3D","updated":"2014-03-11 21:22:48.000000000","message":"Done","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4abfe86f7a8c52dd067aebbb66370e7ddca0f1c4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":62,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":63,"context_line":"        bindings_dict \u003d datastructures.SortedDict("},{"line_number":64,"context_line":"            [(b[\u0027profile_id\u0027], b[\u0027tenant_id\u0027]) for b in bindings])"},{"line_number":65,"context_line":"        for p in profiles:"},{"line_number":66,"context_line":"            project_id \u003d bindings_dict.get(p.id)"},{"line_number":67,"context_line":"            project \u003d tenant_dict.get(project_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F3ts%3D","line":64,"updated":"2014-03-13 09:00:04.000000000","message":"If you revert the change in api/neutron.py, it needs to be:\n\n  SortedDict([(b.profile_id, b.tenant_id) for b in bindings])","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"4c6a7417c5900ae69af003b9b0e83e45e1beebd2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":62,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":63,"context_line":"        bindings_dict \u003d datastructures.SortedDict("},{"line_number":64,"context_line":"            [(b[\u0027profile_id\u0027], b[\u0027tenant_id\u0027]) for b in bindings])"},{"line_number":65,"context_line":"        for p in profiles:"},{"line_number":66,"context_line":"            project_id \u003d bindings_dict.get(p.id)"},{"line_number":67,"context_line":"            project \u003d tenant_dict.get(project_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2Fy3w%3D","line":64,"in_reply_to":"AAAAWH%2F%2F0Mk%3D","updated":"2014-03-13 19:05:30.000000000","message":"Done","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7f0cec2c5641b5cf12d51b95cf814caedf9cc968","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":62,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":63,"context_line":"        bindings_dict \u003d datastructures.SortedDict("},{"line_number":64,"context_line":"            [(b[\u0027profile_id\u0027], b[\u0027tenant_id\u0027]) for b in bindings])"},{"line_number":65,"context_line":"        for p in profiles:"},{"line_number":66,"context_line":"            project_id \u003d bindings_dict.get(p.id)"},{"line_number":67,"context_line":"            project \u003d tenant_dict.get(project_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F0Mk%3D","line":64,"in_reply_to":"AAAAWH%2F%2F2G8%3D","updated":"2014-03-13 16:25:05.000000000","message":"I think it is better to create SortedDict here. API layer should not be changed depending on changes in dashboard layer.","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"bed431176772f079830352c6c3f5dcd31bc71f61","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        tenant_dict \u003d _get_tenant_list(request)"},{"line_number":62,"context_line":"        bindings \u003d api.neutron.profile_bindings_list(request, type_p)"},{"line_number":63,"context_line":"        bindings_dict \u003d datastructures.SortedDict("},{"line_number":64,"context_line":"            [(b[\u0027profile_id\u0027], b[\u0027tenant_id\u0027]) for b in bindings])"},{"line_number":65,"context_line":"        for p in profiles:"},{"line_number":66,"context_line":"            project_id \u003d bindings_dict.get(p.id)"},{"line_number":67,"context_line":"            project \u003d tenant_dict.get(project_id)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAWH%2F%2F2G8%3D","line":64,"in_reply_to":"AAAAWH%2F%2F3ts%3D","updated":"2014-03-13 12:24:59.000000000","message":"Yep - will make that change in neutron.py","commit_id":"aa9514ed729e64427d657a8d8f26e1780372eaac"}],"openstack_dashboard/test/settings.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"78d04183b9c9927e89655dfa230503ee09cb66d2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    # using run_tests will require the registration of the \"router\" dashboard."},{"line_number":71,"context_line":"    # TODO (absubram): Need to make this permanent when a better solution"},{"line_number":72,"context_line":"    # for run_tests is implemented to use with and without the n1k sub-plugin."},{"line_number":73,"context_line":"    #\u0027dashboards\u0027: (\u0027project\u0027, \u0027admin\u0027, \u0027settings\u0027, \u0027router\u0027,),"},{"line_number":74,"context_line":"    \u0027default_dashboard\u0027: \u0027project\u0027,"},{"line_number":75,"context_line":"    \"password_validator\": {"},{"line_number":76,"context_line":"        \"regex\": \u0027^.{8,18}$\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FGZw%3D","line":73,"updated":"2014-03-09 20:33:26.000000000","message":"The plugin support for dashboard is already merged. You can enable your tests by using it. IMO you need to enable tests for router dashboard ASAP because the current situation means router dashboard is not tested and nobody except from Cisco can test the patch. Please see commit f169ee58ab17d1b0dde9afd5b27c8bd276de0c50 for the detail.\n\nI am okay to go this patch without test change, but if you plan to submit multiple patches for router dashboard, please enable tests to confirm it works. It will released as a part of Horizon official release so we need to ensure its quality.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58b678229a27e6d6e70d933178434ae993fcddf9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    # using run_tests will require the registration of the \"router\" dashboard."},{"line_number":71,"context_line":"    # TODO (absubram): Need to make this permanent when a better solution"},{"line_number":72,"context_line":"    # for run_tests is implemented to use with and without the n1k sub-plugin."},{"line_number":73,"context_line":"    #\u0027dashboards\u0027: (\u0027project\u0027, \u0027admin\u0027, \u0027settings\u0027, \u0027router\u0027,),"},{"line_number":74,"context_line":"    \u0027default_dashboard\u0027: \u0027project\u0027,"},{"line_number":75,"context_line":"    \"password_validator\": {"},{"line_number":76,"context_line":"        \"regex\": \u0027^.{8,18}$\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B3gA%3D","line":73,"in_reply_to":"AAAAVn%2F%2FGZw%3D","updated":"2014-03-11 21:22:48.000000000","message":"Yes and the plugin based code is what is used for actual running of the dashboard. This is in the test/settings.py file. I\u0027m just leaving this since the other dashboards still use this setting?\n\nAbout the UT - I absolutely concur. It was an issue that was raised before. I have a bug - https://bugs.launchpad.net/horizon/+bug/1229819\nAnd it is the first thing we\u0027re targeting for J.\n\nIn the meantime the patches I\u0027m trying to get in are minor ones that came about during the review of the initial commit in H. The UT are definitely run before submitting for review. But yes - I need to manually run them right now. We need to have it turned on somehow by default and always so that other don\u0027t break this dashboard inadvertently.","commit_id":"7ceed154a94ffab0a7060045939bb1f442360c7c"}],"openstack_dashboard/test/test_data/neutron_data.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"78d04183b9c9927e89655dfa230503ee09cb66d2","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    TEST.policy_profile_binding.add(neutron.Profile("},{"line_number":150,"context_line":"        policy_profile_binding_dict))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    # 2nd network profile for network when using the cisco n1k plugin"},{"line_number":153,"context_line":"    net_profile_dict \u003d {\u0027name\u0027: \u0027net_profile_test2\u0027,"},{"line_number":154,"context_line":"                        \u0027segment_type\u0027: \u0027overlay\u0027,"},{"line_number":155,"context_line":"                        \u0027sub_type\u0027: \u0027native_vxlan\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2FGZg%3D","side":"PARENT","line":152,"updated":"2014-03-09 20:33:26.000000000","message":"Why is the second profile removed? I think it will change what is tested.","commit_id":"6a818a1c25a73f6e5445ae7fd645a4ff50be726a"},{"author":{"_account_id":6620,"name":"Abishek Subramanian","email":"absubram@cisco.com","username":"absubram"},"change_message_id":"58b678229a27e6d6e70d933178434ae993fcddf9","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    TEST.policy_profile_binding.add(neutron.Profile("},{"line_number":150,"context_line":"        policy_profile_binding_dict))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    # 2nd network profile for network when using the cisco n1k plugin"},{"line_number":153,"context_line":"    net_profile_dict \u003d {\u0027name\u0027: \u0027net_profile_test2\u0027,"},{"line_number":154,"context_line":"                        \u0027segment_type\u0027: \u0027overlay\u0027,"},{"line_number":155,"context_line":"                        \u0027sub_type\u0027: \u0027native_vxlan\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAVn%2F%2B3j0%3D","side":"PARENT","line":152,"in_reply_to":"AAAAVn%2F%2FGZg%3D","updated":"2014-03-11 21:22:48.000000000","message":"Akhiro,\n\nI\u0027ve just moved this below in the file. My other reviews add additional profiles. I didn\u0027t want to take up the space in the \"1st network\". So pushed 2nd and other additional profiles to the bottom of the file. I\u0027m adding 4 more profiles.","commit_id":"6a818a1c25a73f6e5445ae7fd645a4ff50be726a"}]}
