)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"9e514f98684949293f563de38bf64d2e1f4543e4","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch will add these fields to base resources(net,subnet,port,"},{"line_number":13,"context_line":"subnetpool)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint add-port-timestamp"},{"line_number":16,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa1b9901_7f2b2734","line":14,"updated":"2015-08-23 03:47:45.000000000","message":"APIImpact and DocImpact","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This patch will add these fields to base resources(net,subnet,port,"},{"line_number":13,"context_line":"subnetpool)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements: blueprint add-port-timestamp"},{"line_number":16,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa1b9901_e27b0f28","line":14,"in_reply_to":"fa1b9901_7f2b2734","updated":"2015-08-24 03:44:20.000000000","message":"Thanks for review. I will add them later","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhaobo \u003czhaobo6@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-25 14:41:27 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add timestamp for neutron base resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now neutron base resources didn\u0027t contain the fields of timestamp,"},{"line_number":10,"context_line":"like \u0027updated_at\u0027,\u0027created_at\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa1b9901_b40519c3","line":7,"updated":"2015-08-25 07:24:16.000000000","message":"Adding timestamps for Neutron core resources\n\nCurrently, neutron core resources (like net, subnet, port and subnetpool) doesn\u0027t saves time-stamps upon their creation and  updation. This information is critical for debugging purposes.\n\nThis patch introduce a new extension called \"resource timestamp\" extending which existing neutron\u0027s core resources can save their creation and updation timings.\n\nImplements: blueprint add-port-timestamp","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"9279b8aead050592ed59c69910fa0aac52d93d05","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     zhaobo \u003czhaobo6@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-08-25 14:41:27 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add timestamp for neutron base resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Now neutron base resources didn\u0027t contain the fields of timestamp,"},{"line_number":10,"context_line":"like \u0027updated_at\u0027,\u0027created_at\u0027."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa1b9901_2ab1a08f","line":7,"in_reply_to":"fa1b9901_b40519c3","updated":"2015-08-26 14:13:30.000000000","message":"Thank you very much.So help to me.Your description is more closer than mine.And the commit message before should be more sufficiency.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"8e6f36b2304d78dc4461726951fdb51e972ba088","unresolved":false,"context_lines":[{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Implements: blueprint add-port-timestamp"},{"line_number":18,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"da20952f_b7aadb6f","line":16,"updated":"2015-09-04 01:43:55.000000000","message":"Please add \"APIImpact\" tag","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"5fbeff636b37dbc08c30ac609f44e79b4daa0a20","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"da20952f_9c168547","line":20,"updated":"2015-09-07 12:42:10.000000000","message":"change \u0027 Implements\u0027 to \u0027Partially-Implements\u0027 as you have one more patch addressing lbaas changes. \"https://review.openstack.org/#/c/220804\"","commit_id":"cfb27962255725be5abb9fd3603c6a8b51552344"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"b30b8253a25594685bbaaf97082c28b197e8d29a","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da20952f_e71357b6","line":19,"updated":"2015-09-08 05:37:58.000000000","message":"I think this patch doesn\u0027t depends upon \u0027I2a01e57d38a69e8534d748518355e79c187a2544\u0027 but it\u0027s other way round.","commit_id":"ba67f1191854459cc8eed14b21951083107b9dfc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"e5c5cbaa9772d9c80709fc2fe8a4d80d4cd0b626","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da20952f_fd30c89f","line":19,"in_reply_to":"da20952f_da138ab6","updated":"2015-09-08 06:36:47.000000000","message":"Thanks very much.","commit_id":"ba67f1191854459cc8eed14b21951083107b9dfc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"e5c5cbaa9772d9c80709fc2fe8a4d80d4cd0b626","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da20952f_5dfbf4c0","line":19,"in_reply_to":"da20952f_e71357b6","updated":"2015-09-08 06:36:47.000000000","message":"Thanks, this patch must be depends upon \u0027I2a01e57d38a69e8534d748518355e79c187a2544\u0027, so that patch may be commit first, then this patch can do, and the jenkins will pass.","commit_id":"ba67f1191854459cc8eed14b21951083107b9dfc"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"fe68361b65e1956bd2e1e0dfcb31c1d652152c75","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"da20952f_da138ab6","line":19,"in_reply_to":"da20952f_e71357b6","updated":"2015-09-08 06:16:24.000000000","message":"if this patch dose not depends on \u0027I2a01e57d38a69e8534d748518355e79c187a2544\u0027, jenkins will fail in gate-neutron-lbaasv2-dsvm-api","commit_id":"ba67f1191854459cc8eed14b21951083107b9dfc"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"144a60c9964daa27801c5f0484b93256b6624057","unresolved":false,"context_lines":[{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba15a1d1_f281c84e","line":17,"updated":"2015-09-12 15:15:55.000000000","message":"I saw DocImpact tag in this spec. If this feature need to add documents, the tag is needed.","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c4f24ebb00a50ce52388da178aa8a8eb987bc7cc","unresolved":false,"context_lines":[{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba15a1d1_4a31d5a1","line":17,"in_reply_to":"ba15a1d1_f281c84e","updated":"2015-09-14 03:31:26.000000000","message":"Thanks very much for review. I will add it later.","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"0b5aaa6be8a3ddf6d61b402dbb20d64fa3b8f9fe","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"da20952f_59b27f4a","line":20,"updated":"2015-09-11 16:19:29.000000000","message":"The blueprint in Launchpad is not marked Approved or targeted for Liberty.  The spec was approved / merged back on 8/5, so not sure why blueprint was not updated.\n\nIt would be nice if this could be delivered in Liberty.","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c4f24ebb00a50ce52388da178aa8a8eb987bc7cc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba15a1d1_cae4050f","line":20,"in_reply_to":"ba15a1d1_f29a28c5","updated":"2015-09-14 03:31:26.000000000","message":"Thanks for kindly suggestion. I had send an email to Kyle about this.","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"144a60c9964daa27801c5f0484b93256b6624057","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba15a1d1_f29a28c5","line":20,"in_reply_to":"da20952f_59b27f4a","updated":"2015-09-12 15:15:55.000000000","message":"John\u0027s suggestion is very important. RC1 milestone[1] doesn\u0027t point this feature. You should ask Kyle about this. If neutron core team doesn\u0027t allow the feature to go forward in Liberty, this must be in Mitaka.\n\n[1]: https://launchpad.net/neutron/+milestone/liberty-rc1","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c4f24ebb00a50ce52388da178aa8a8eb987bc7cc","unresolved":false,"context_lines":[{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":20,"context_line":"Partially-Implements: blueprint add-port-timestamp"},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"ba15a1d1_8a17edec","line":20,"in_reply_to":"da20952f_59b27f4a","updated":"2015-09-14 03:31:26.000000000","message":"Thank you very much for your suggestion.","commit_id":"c9e342556fbd820e1eb480bdd63d27d3ebc77b5e"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"6963c6db592b7a4885cd5d0177fedefb561fad90","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add timestamp for neutron core resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a29b11f_de7d87e8","line":10,"updated":"2015-10-26 15:58:43.000000000","message":"nit: \"do not save\" rather than \"doesn\u0027t saves\"","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"551787441d321803f5fdfbd98be6de40d682b4ef","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add timestamp for neutron core resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"1a26ad4f_8ed67def","line":10,"in_reply_to":"3a29b11f_de7d87e8","updated":"2015-11-03 02:57:14.000000000","message":"Thanks very much. I will update it in the new patch.","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"6963c6db592b7a4885cd5d0177fedefb561fad90","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a29b11f_9e870fd7","line":11,"updated":"2015-10-26 15:58:43.000000000","message":"nit: \"can be\" rather than \"is\"","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"551787441d321803f5fdfbd98be6de40d682b4ef","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"1a26ad4f_2e064986","line":11,"in_reply_to":"3a29b11f_9e870fd7","updated":"2015-11-03 02:57:14.000000000","message":"Done","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"6963c6db592b7a4885cd5d0177fedefb561fad90","unresolved":false,"context_lines":[{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a29b11f_5e6ad71b","line":13,"updated":"2015-10-26 15:58:43.000000000","message":"nit: \"introduces\"","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"551787441d321803f5fdfbd98be6de40d682b4ef","unresolved":false,"context_lines":[{"line_number":10,"context_line":"doesn\u0027t saves time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"1a26ad4f_4e0b858e","line":13,"in_reply_to":"3a29b11f_5e6ad71b","updated":"2015-11-03 02:57:14.000000000","message":"Done","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"6963c6db592b7a4885cd5d0177fedefb561fad90","unresolved":false,"context_lines":[{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"3a29b11f_fe4de3c4","line":14,"updated":"2015-10-26 15:58:43.000000000","message":"nit: replace this and the next line with (appropriately line wrapped):\n\"existing the neutron core resources to allow their creation and modification times to be record\"","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"551787441d321803f5fdfbd98be6de40d682b4ef","unresolved":false,"context_lines":[{"line_number":11,"context_line":"information is critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduce a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"which existing neutron\u0027s core resources can save their creation and"},{"line_number":15,"context_line":"updation timings."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"1a26ad4f_eefb7179","line":14,"in_reply_to":"3a29b11f_fe4de3c4","updated":"2015-11-03 02:57:14.000000000","message":"Done","commit_id":"149e7066aad5bdc906c78a2476f7885948f51de6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9317ffd3430eedf88179c4dbe0ec01df24e4cbc4","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add timestamp for neutron core resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"do not save time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information can be critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduces a new extension called \"resource timestamp\" extending"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"1a26ad4f_c5f8d3c5","line":10,"updated":"2015-11-03 04:40:56.000000000","message":"updation \u003d\u003e updates","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"752cb964b742312a528b1ea3d323db02a0b00405","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add timestamp for neutron core resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"do not save time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information can be critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduces a new extension called \"resource timestamp\" extending"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"1a26ad4f_9ba558a3","line":10,"in_reply_to":"1a26ad4f_c5f8d3c5","updated":"2015-11-03 07:12:54.000000000","message":"@garyk, Thanks for review. The improvement of English is important to me.","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9317ffd3430eedf88179c4dbe0ec01df24e4cbc4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"do not save time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information can be critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduces a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"existing the neutron core resources to allow their creation and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"1a26ad4f_c51f7306","line":11,"updated":"2015-11-03 04:40:56.000000000","message":"i am not sure that i understand what is critical about this. can you please explain (maybe it was on the spec).\n\nmaybe i am jumping in on the boat a little late but are notifications not something that can be leveraged here. That is far less intrusive and more detailed.","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7299ec044c12b29c27e550ebd4ca57d2b26545b9","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"do not save time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information can be critical for debugging purposes."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This patch introduces a new extension called \"resource timestamp\" extending"},{"line_number":14,"context_line":"existing the neutron core resources to allow their creation and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":29,"id":"fa80f949_054ad2c5","line":11,"in_reply_to":"1a26ad4f_c51f7306","updated":"2015-11-04 10:50:35.000000000","message":"Have you considered adding the calls at https://github.com/openstack/neutron/blob/master/neutron/api/v2/base.py#L408?\nOr even a decorator on the method? Then it will not be intrusive to the code.","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2caf96457c8fbe61024fc5baca66c587f450a92c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add timestamp for neutron core resources"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently, neutron core resources (like net, subnet, port and subnetpool)"},{"line_number":10,"context_line":"do not save time-stamps upon their creation and updation. This"},{"line_number":11,"context_line":"information can be critical for debugging purposes."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":33,"id":"da85f559_19d25d35","line":9,"updated":"2015-11-13 06:40:56.000000000","message":"from the revised spec this should be a extension and not in the base resources","commit_id":"e66328b18ed63b48e1061660a3568b5259d9ad68"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"806b1d1818fc0fe3e39217bd4fcb75ef1f88f2d0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"modification times to be record. Now this patch add this resource schema."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"APIImpact"},{"line_number":18,"context_line":"DocImpact"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Depends-On: I2a01e57d38a69e8534d748518355e79c187a2544"},{"line_number":21,"context_line":"Partially-Implements: blueprint add-port-timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":38,"id":"9a8ffd7b_881f6b6b","line":18,"updated":"2015-11-26 10:39:29.000000000","message":"i think that you should add the reno files to the patch set too","commit_id":"1cb47e5d3a0ef3c08a4a93c7bc9f1e6890db34e6"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"56e063efd8fc91183b218e1cb1444cbfbf6a7b97","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Depends-On: I7bc449aa079d84869b2a707b36bbbfb22d540cc5"},{"line_number":22,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"},{"line_number":23,"context_line":"Partially-Implements: blueprint add-port-timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":83,"id":"9aed3d3a_41e7ae3f","line":23,"updated":"2016-03-01 03:08:19.000000000","message":"Nit: blueprint add-timestamp-attr","commit_id":"6cfad423a664edf25c9a1862ad64d2fba950cc9b"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"35e911e78d24ea45fa4fa3aaee70ab4184da5cf5","unresolved":false,"context_lines":[{"line_number":16,"context_line":"listen db events to add timestamp fields."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"APIImpact"},{"line_number":19,"context_line":"DocImpact"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I24114b464403435d9c1e1e123d2bc2f37c8fc6ea"},{"line_number":22,"context_line":"Partially-Implements: blueprint add-port-timestamp"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":87,"id":"7af24918_bce8e47d","line":19,"updated":"2016-03-02 05:06:13.000000000","message":"this needs a description. See [1]\n\n[1] http://lists.openstack.org/pipermail/openstack-dev/2016-March/087851.html","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"}],"etc/neutron.conf":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"2c05671a3d2d5e09677be91f70f344e2e8c13d79","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_09df8e3a","line":302,"updated":"2015-08-21 10:02:40.000000000","message":"I also can\u0027t find it in the approved spec.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"d41fe777744230753596f507fd910d7ab772a992","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_88571f25","line":302,"updated":"2015-08-21 08:17:18.000000000","message":"why should this be configurable?","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_a2c3d737","line":302,"in_reply_to":"fa1b9901_09df8e3a","updated":"2015-08-24 03:44:20.000000000","message":"Thanks for review.I will remove it.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_62b5bfce","line":302,"in_reply_to":"fa1b9901_322acf2d","updated":"2015-08-24 03:44:20.000000000","message":"Thanks, I will remove this code.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"1f111432f2ffc48dc1d9119aa9c8b3ef888bfbf1","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_322acf2d","line":302,"in_reply_to":"fa1b9901_88571f25","updated":"2015-08-22 08:30:44.000000000","message":"I also think it does not need this config, because timestamp is extension resource","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":301,"context_line":"# Setting this flag to True will support Timestamp to neutron base resources."},{"line_number":302,"context_line":"# resource_timestamp \u003d False"},{"line_number":303,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d end of items for Base Resources Timestamp \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"# \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d WSGI parameters related to the API server \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/plain","patch_set":4,"id":"fa1b9901_c2a92b7d","line":302,"in_reply_to":"fa1b9901_88571f25","updated":"2015-08-24 03:44:20.000000000","message":"Thank you very much for review. This should not be configurable.It just as an extension for ml2 plugin.I will remove the code of the part.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"}],"neutron/api/v2/attributes.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9b1e738a1352d8d1f03eb30071ed11e0681574fb","unresolved":false,"context_lines":[{"line_number":692,"context_line":"                 \u0027is_visible\u0027: True,"},{"line_number":693,"context_line":"                 \u0027required_by_policy\u0027: True,"},{"line_number":694,"context_line":"                 \u0027enforce_policy\u0027: True},"},{"line_number":695,"context_line":"        \u0027created_at\u0027:{\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":696,"context_line":"                      \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":697,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":698,"context_line":"                      \u0027required_by_policy\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_606ca708","line":695,"updated":"2015-08-17 05:40:53.000000000","message":"How about defining this globally and using it everywhere?\n\nAFAIK, this should be implemented as an extension and not as a CORE attribute.","commit_id":"dc679a0e66cf5d4f32490f19e4da8c4d5eba4f87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"e960b60a61a9ab3ee7fa8adba31db043fdbd2dc3","unresolved":false,"context_lines":[{"line_number":692,"context_line":"                 \u0027is_visible\u0027: True,"},{"line_number":693,"context_line":"                 \u0027required_by_policy\u0027: True,"},{"line_number":694,"context_line":"                 \u0027enforce_policy\u0027: True},"},{"line_number":695,"context_line":"        \u0027created_at\u0027:{\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":696,"context_line":"                      \u0027validate\u0027: {\u0027type:dict\u0027: None},"},{"line_number":697,"context_line":"                      \u0027is_visible\u0027: True,"},{"line_number":698,"context_line":"                      \u0027required_by_policy\u0027: True},"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_b928a686","line":695,"in_reply_to":"1a4dcd0f_606ca708","updated":"2015-08-17 07:54:10.000000000","message":"Thanks for suggestion, IMHO, I test the functional just OK.Then I will move it to extension attribute.","commit_id":"dc679a0e66cf5d4f32490f19e4da8c4d5eba4f87"}],"neutron/api/v2/base.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e4c47e5ba53ce4f4e6255adc7d8f76358887df02","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        filters \u003d api_common.get_filters(request, self._attr_info,"},{"line_number":253,"context_line":"                                         [\u0027fields\u0027, \u0027sort_key\u0027, \u0027sort_dir\u0027,"},{"line_number":254,"context_line":"                                          \u0027limit\u0027, \u0027marker\u0027, \u0027page_reverse\u0027,"},{"line_number":255,"context_line":"                                          \u0027change_since\u0027])"},{"line_number":256,"context_line":"        kwargs \u003d {\u0027filters\u0027: filters,"},{"line_number":257,"context_line":"                  \u0027fields\u0027: original_fields}"},{"line_number":258,"context_line":"        sorting_helper \u003d self._get_sorting_helper(request)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_5f5c23ed","line":255,"updated":"2015-08-23 03:46:10.000000000","message":"Use either \u0027changed_since\u0027 or \u0027modified_since\u0027.\n\n(This makes me wonder if we should also support the HTTP if-modified-since field?)\n\nAre you planning on adding support for \u0027created_since\u0027?","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        filters \u003d api_common.get_filters(request, self._attr_info,"},{"line_number":253,"context_line":"                                         [\u0027fields\u0027, \u0027sort_key\u0027, \u0027sort_dir\u0027,"},{"line_number":254,"context_line":"                                          \u0027limit\u0027, \u0027marker\u0027, \u0027page_reverse\u0027,"},{"line_number":255,"context_line":"                                          \u0027change_since\u0027])"},{"line_number":256,"context_line":"        kwargs \u003d {\u0027filters\u0027: filters,"},{"line_number":257,"context_line":"                  \u0027fields\u0027: original_fields}"},{"line_number":258,"context_line":"        sorting_helper \u003d self._get_sorting_helper(request)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_84afc07c","line":255,"in_reply_to":"fa1b9901_5f5c23ed","updated":"2015-08-24 03:44:20.000000000","message":"Thanks for review.I will correct it. And I only add changed_since for resource query.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"}],"neutron/common/constants.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"# Time format"},{"line_number":197,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":198,"context_line":"ISO8601_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_9a7390b4","line":198,"updated":"2015-08-24 11:06:39.000000000","message":"What\u0027s the difference between \"ISO8601_TIME_FORMAT\" and \"ISO8601_TIMESTAMP_FORMAT\". Can you please mention it the comment?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"# Time format"},{"line_number":197,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":198,"context_line":"ISO8601_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_cbbff5fa","line":198,"in_reply_to":"fa1b9901_9a7390b4","updated":"2015-08-24 13:34:28.000000000","message":"As the ISO8601_TIMESTAMP_FORMAT will not contained the float time value, so it just for show.And the ISO8601_TIME_FORMAT is the format which is time sensitive.Thank you for suggestion.I will add it  later","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":197,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"# Timestamp format to show \u0027created_at\u0027 and \u0027updated_at\u0027 when query resource"},{"line_number":200,"context_line":"ISO8601_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_842a157d","line":200,"updated":"2015-09-16 08:59:52.000000000","message":"seems a bit confusing with ISO8601_TIME_FORMAT.\nhow about a name indicating it\u0027s for \"resource timestamp\"?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":197,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"# Timestamp format to show \u0027created_at\u0027 and \u0027updated_at\u0027 when query resource"},{"line_number":200,"context_line":"ISO8601_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_513a5dcd","line":200,"in_reply_to":"ba15a1d1_842a157d","updated":"2015-09-29 13:24:55.000000000","message":"+1.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":197,"context_line":"ISO8601_TIME_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%S.%f\u0027"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"# Timestamp format to show \u0027created_at\u0027 and \u0027updated_at\u0027 when query resource"},{"line_number":200,"context_line":"ISO8601_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_fa2128b5","line":200,"in_reply_to":"ba15a1d1_842a157d","updated":"2015-09-17 02:54:52.000000000","message":"Thanks for review. Yeah, it\u0027s a good suggestion.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":224,"context_line":"RESOURCE_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"# Timestamp changed since fields"},{"line_number":227,"context_line":"CHANGED_SINCE \u003d \u0027changed_since\u0027"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_c4d4aabe","line":227,"updated":"2016-02-04 09:48:24.000000000","message":"Where is this used?","commit_id":"35b0890e274823885d710df17d71d37d994ef562"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"176b38da593625153baf3e038459b122a5df8018","unresolved":false,"context_lines":[{"line_number":221,"context_line":"AGENT_REVIVED \u003d \u0027revived\u0027"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"# Timestamp format to show \u0027created_at\u0027 and \u0027updated_at\u0027 when query resource"},{"line_number":224,"context_line":"RESOURCE_TIMESTAMP_FORMAT \u003d \u0027%Y-%m-%dT%H:%M:%SZ\u0027"}],"source_content_type":"text/x-python","patch_set":56,"id":"3a57f1b5_31e9751b","line":224,"updated":"2016-02-10 05:50:34.000000000","message":"this should really be i18n/l10n","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"}],"neutron/db/common_db_mixin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"9b1e738a1352d8d1f03eb30071ed11e0681574fb","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                elif key \u003d\u003d \u0027changes_since\u0027:"},{"line_number":200,"context_line":"                    column \u003d getattr(model,\u0027updated_at\u0027,None)"},{"line_number":201,"context_line":"                    if column is not None:"},{"line_number":202,"context_line":"                        from oslo_utils import timeutils"},{"line_number":203,"context_line":"                        since \u003d timeutils.parse_isotime(filters[\u0027changes_since\u0027][0])"},{"line_number":204,"context_line":"                        filters[\u0027changes_since\u0027] \u003d since"},{"line_number":205,"context_line":"                        changes_since \u003d timeutils.normalize_time(filters[\u0027changes_since\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_603a67e9","line":202,"updated":"2015-08-17 05:40:53.000000000","message":"Why we need to import everytime. This can be define globally at the beginning of the file.","commit_id":"dc679a0e66cf5d4f32490f19e4da8c4d5eba4f87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"e960b60a61a9ab3ee7fa8adba31db043fdbd2dc3","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                elif key \u003d\u003d \u0027changes_since\u0027:"},{"line_number":200,"context_line":"                    column \u003d getattr(model,\u0027updated_at\u0027,None)"},{"line_number":201,"context_line":"                    if column is not None:"},{"line_number":202,"context_line":"                        from oslo_utils import timeutils"},{"line_number":203,"context_line":"                        since \u003d timeutils.parse_isotime(filters[\u0027changes_since\u0027][0])"},{"line_number":204,"context_line":"                        filters[\u0027changes_since\u0027] \u003d since"},{"line_number":205,"context_line":"                        changes_since \u003d timeutils.normalize_time(filters[\u0027changes_since\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_9617b953","line":202,"in_reply_to":"1a4dcd0f_603a67e9","updated":"2015-08-17 07:54:10.000000000","message":"Thank you for review,I just open this patch for testworking.I think there should be some err in my code.As my network hit some problem, and I \u0027m so hard to submit it.So I tried many times to review,just the first one is success which the patch showed now.Could you please point more for me?","commit_id":"dc679a0e66cf5d4f32490f19e4da8c4d5eba4f87"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e4c47e5ba53ce4f4e6255adc7d8f76358887df02","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                        or_(*matches)"},{"line_number":199,"context_line":"                    )"},{"line_number":200,"context_line":"                    query \u003d query.filter(is_shared if value[0] else ~is_shared)"},{"line_number":201,"context_line":"                elif key \u003d\u003d \u0027changes_since\u0027 and cfg.CONF.resource_timestamp:"},{"line_number":202,"context_line":"                    column \u003d getattr(model, \u0027updated_at\u0027, None)"},{"line_number":203,"context_line":"                    if column is not None:"},{"line_number":204,"context_line":"                        since \u003d timeutils.parse_isotime("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_df68338a","line":201,"updated":"2015-08-23 03:46:10.000000000","message":"Use \u0027changed_since\u0027 or \u0027modified_since\u0027.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1a0337591b9cf2f888d6ce59705f9ae5487bd244","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                        or_(*matches)"},{"line_number":199,"context_line":"                    )"},{"line_number":200,"context_line":"                    query \u003d query.filter(is_shared if value[0] else ~is_shared)"},{"line_number":201,"context_line":"                elif key \u003d\u003d \u0027changes_since\u0027 and cfg.CONF.resource_timestamp:"},{"line_number":202,"context_line":"                    column \u003d getattr(model, \u0027updated_at\u0027, None)"},{"line_number":203,"context_line":"                    if column is not None:"},{"line_number":204,"context_line":"                        since \u003d timeutils.parse_isotime("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa1b9901_e4e1dcd1","line":201,"in_reply_to":"fa1b9901_df68338a","updated":"2015-08-24 03:44:20.000000000","message":"Thank you.Agree with your suggestion.","commit_id":"286105b7cfb40aca42fa662209892cbfa2278e66"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":24,"context_line":"from neutron.db import sqlalchemyutils"},{"line_number":25,"context_line":"from oslo_utils import timeutils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def model_query_scope(context, model):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_9acf10b3","line":25,"updated":"2015-08-24 11:06:39.000000000","message":"Please do this import above L23. This section is for \"neutron\"","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":24,"context_line":"from neutron.db import sqlalchemyutils"},{"line_number":25,"context_line":"from oslo_utils import timeutils"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def model_query_scope(context, model):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_284a3784","line":25,"in_reply_to":"fa1b9901_9acf10b3","updated":"2015-08-24 13:34:28.000000000","message":"Thank you for point out.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    if column is not None:"},{"line_number":231,"context_line":"                        since \u003d timeutils.parse_isotime("},{"line_number":232,"context_line":"                            filters[\u0027changed_since\u0027][0])"},{"line_number":233,"context_line":"                        filters[\u0027changed_since\u0027] \u003d since"},{"line_number":234,"context_line":"                        changed_since \u003d timeutils.normalize_time("},{"line_number":235,"context_line":"                            filters[\u0027changed_since\u0027])"},{"line_number":236,"context_line":"                        query \u003d query.filter(model.updated_at \u003e\u003d changed_since)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_5a7bb87b","line":233,"updated":"2015-08-24 11:06:39.000000000","message":"Why to introduce an extra variable \"since\". filters[\u0027changed_since\u0027] could be directly assigned to timeutils.parse_isotime","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":230,"context_line":"                    if column is not None:"},{"line_number":231,"context_line":"                        since \u003d timeutils.parse_isotime("},{"line_number":232,"context_line":"                            filters[\u0027changed_since\u0027][0])"},{"line_number":233,"context_line":"                        filters[\u0027changed_since\u0027] \u003d since"},{"line_number":234,"context_line":"                        changed_since \u003d timeutils.normalize_time("},{"line_number":235,"context_line":"                            filters[\u0027changed_since\u0027])"},{"line_number":236,"context_line":"                        query \u003d query.filter(model.updated_at \u003e\u003d changed_since)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_e8e75faa","line":233,"in_reply_to":"fa1b9901_5a7bb87b","updated":"2015-08-24 13:34:28.000000000","message":"Thanks for review, I agree with u.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                    column \u003d getattr(model, \u0027updated_at\u0027, None)"},{"line_number":251,"context_line":"                    if column is not None:"},{"line_number":252,"context_line":"                        filters[\u0027changed_since\u0027] \u003d timeutils.parse_isotime("},{"line_number":253,"context_line":"                            filters[\u0027changed_since\u0027][0])"},{"line_number":254,"context_line":"                        changed_since \u003d timeutils.normalize_time("},{"line_number":255,"context_line":"                            filters[\u0027changed_since\u0027])"},{"line_number":256,"context_line":"                        query \u003d query.filter(model.updated_at \u003e\u003d changed_since)"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_51025d3e","line":253,"updated":"2015-09-29 13:24:55.000000000","message":"I may sound stupid, but how we assure that \u0027filters[\u0027changed_since\u0027]\u0027 is not None. Over here we assume that filters[\u0027changed_since\u0027] is already available..\n\nMoreover, why we are over-writing \u0027filters[\u0027changed_since\u0027]\u0027. IMHO, inputs must not be over-written, you can use a separate variable instead.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                    column \u003d getattr(model, \u0027updated_at\u0027, None)"},{"line_number":251,"context_line":"                    if column is not None:"},{"line_number":252,"context_line":"                        filters[\u0027changed_since\u0027] \u003d timeutils.parse_isotime("},{"line_number":253,"context_line":"                            filters[\u0027changed_since\u0027][0])"},{"line_number":254,"context_line":"                        changed_since \u003d timeutils.normalize_time("},{"line_number":255,"context_line":"                            filters[\u0027changed_since\u0027])"},{"line_number":256,"context_line":"                        query \u003d query.filter(model.updated_at \u003e\u003d changed_since)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_89d1d759","line":253,"in_reply_to":"9a1a9d01_51025d3e","updated":"2015-10-15 12:45:22.000000000","message":"Thanks for correct. You are right.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"c54384c43a446ecba91c83e9cdf5e3c6448b8aeb","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                    query \u003d query.filter(is_shared)"},{"line_number":235,"context_line":"                elif key \u003d\u003d constants.CHANGED_SINCE:"},{"line_number":236,"context_line":"                    column \u003d getattr(model, constants.UPDATED, None)"},{"line_number":237,"context_line":"                    if column is not None:"},{"line_number":238,"context_line":"                        data \u003d filters[constants.CHANGED_SINCE][0]"},{"line_number":239,"context_line":"                        try:"},{"line_number":240,"context_line":"                            datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_f325ca08","line":237,"updated":"2015-10-21 01:37:24.000000000","message":"if you are not using column anywhere except here, I would prefer you not to create a new variable and call the function directly.\nPython has a nasty habit of keeping the variables in memory, specially in Linux OS, instead of releasing it immediately to the OS.","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"91fb159c6e383ac762dee239cdd013f52dce9b78","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                    query \u003d query.filter(is_shared)"},{"line_number":235,"context_line":"                elif key \u003d\u003d constants.CHANGED_SINCE:"},{"line_number":236,"context_line":"                    column \u003d getattr(model, constants.UPDATED, None)"},{"line_number":237,"context_line":"                    if column is not None:"},{"line_number":238,"context_line":"                        data \u003d filters[constants.CHANGED_SINCE][0]"},{"line_number":239,"context_line":"                        try:"},{"line_number":240,"context_line":"                            datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_3e154948","line":237,"in_reply_to":"3a29b11f_f325ca08","updated":"2015-10-21 03:42:06.000000000","message":"Hi, dear Reedip, thanks for review. You are right. I should be code like if getattr(model, constants.UPDATED, None) is not None: here...","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"c54384c43a446ecba91c83e9cdf5e3c6448b8aeb","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                                              constants."},{"line_number":243,"context_line":"                                              RESOURCE_TIMESTAMP_FORMAT)))"},{"line_number":244,"context_line":"                        except Exception:"},{"line_number":245,"context_line":"                            msg \u003d _(\"The input changed_since must be like\""},{"line_number":246,"context_line":"                                    \" YYYY-MM-DDTHH:MM:SSZ\")"},{"line_number":247,"context_line":"                            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":248,"context_line":"                        changed_since_string \u003d timeutils.parse_isotime(data)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_13588689","line":245,"updated":"2015-10-21 01:37:24.000000000","message":"If this message is being reported to the user, then should it have an _ ?\nIf user is giving changed-since, and user sees a changed_since error, user may get confused.\nJust see if its ok?","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"91fb159c6e383ac762dee239cdd013f52dce9b78","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                                              constants."},{"line_number":243,"context_line":"                                              RESOURCE_TIMESTAMP_FORMAT)))"},{"line_number":244,"context_line":"                        except Exception:"},{"line_number":245,"context_line":"                            msg \u003d _(\"The input changed_since must be like\""},{"line_number":246,"context_line":"                                    \" YYYY-MM-DDTHH:MM:SSZ\")"},{"line_number":247,"context_line":"                            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":248,"context_line":"                        changed_since_string \u003d timeutils.parse_isotime(data)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_ebfab274","line":245,"in_reply_to":"3a29b11f_13588689","updated":"2015-10-21 03:42:06.000000000","message":"This error will return to users. And I think _ is ok. I had check the other which raise exception, their msg should be processed by _ .. The err message describe the valid value should be input. User could try one more time to input the valid value. Er..maybe there is any view I miss..Could you give me more details?:-)","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"87d185b8a46b6098c868131f3e83621183a30e23","unresolved":false,"context_lines":[{"line_number":242,"context_line":"                                              constants."},{"line_number":243,"context_line":"                                              RESOURCE_TIMESTAMP_FORMAT)))"},{"line_number":244,"context_line":"                        except Exception:"},{"line_number":245,"context_line":"                            msg \u003d _(\"The input changed_since must be like\""},{"line_number":246,"context_line":"                                    \" YYYY-MM-DDTHH:MM:SSZ\")"},{"line_number":247,"context_line":"                            raise n_exc.InvalidInput(error_message\u003dmsg)"},{"line_number":248,"context_line":"                        changed_since_string \u003d timeutils.parse_isotime(data)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_e13c11ca","line":245,"in_reply_to":"3a29b11f_ebfab274","updated":"2015-10-21 04:49:56.000000000","message":"Well I do not currently have the details , but I think from a user point of view, it would be much easier for the user to understand - than _ in the command arguments.\n\nHowever, you are correct that it is used in other sections of Openstack as well, so I guess there would be no issue","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"32d44189910849b9bd21fda1a08d13b9f6fd3d8a","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                    query \u003d query.filter(is_shared)"},{"line_number":235,"context_line":"                elif key \u003d\u003d constants.CHANGED_SINCE:"},{"line_number":236,"context_line":"                    column \u003d getattr(model, constants.UPDATED, None)"},{"line_number":237,"context_line":"                    if column is not None:"},{"line_number":238,"context_line":"                        data \u003d filters[constants.CHANGED_SINCE][0]"},{"line_number":239,"context_line":"                        try:"},{"line_number":240,"context_line":"                            datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":26,"id":"3a29b11f_c4e2432f","line":237,"updated":"2015-10-21 05:41:47.000000000","message":"I think my previous comments are not reflected here (??)","commit_id":"6718a6658c3efe288d65cc4de9a25be541e833da"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"cc2012775e74a52be46368af9343e8ba9c218653","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                    query \u003d query.filter(is_shared)"},{"line_number":235,"context_line":"                elif key \u003d\u003d constants.CHANGED_SINCE:"},{"line_number":236,"context_line":"                    column \u003d getattr(model, constants.UPDATED, None)"},{"line_number":237,"context_line":"                    if column is not None:"},{"line_number":238,"context_line":"                        data \u003d filters[constants.CHANGED_SINCE][0]"},{"line_number":239,"context_line":"                        try:"},{"line_number":240,"context_line":"                            datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":26,"id":"3a29b11f_a418671f","line":237,"in_reply_to":"3a29b11f_c4e2432f","updated":"2015-10-21 05:46:58.000000000","message":"OH, Sorry . I commit another patch which base on this. I\u0027m not sure it will updated this patch, and I\u0027m working on this patch, but not ready to commit..","commit_id":"6718a6658c3efe288d65cc4de9a25be541e833da"}],"neutron/db/db_base_plugin_common.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":155,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":156,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":157,"context_line":"        if process_extensions:"},{"line_number":158,"context_line":"            self._apply_dict_extend_functions("},{"line_number":159,"context_line":"                attributes.SUBNETPOOLS, res, subnetpool)"},{"line_number":160,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_ba3bf49b","line":157,"updated":"2015-08-24 11:06:39.000000000","message":"Is this related to your change?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":154,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":155,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":156,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":157,"context_line":"        if process_extensions:"},{"line_number":158,"context_line":"            self._apply_dict_extend_functions("},{"line_number":159,"context_line":"                attributes.SUBNETPOOLS, res, subnetpool)"},{"line_number":160,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_9646044e","line":157,"in_reply_to":"fa1b9901_ba3bf49b","updated":"2015-08-24 13:34:28.000000000","message":"As this feature will add to extension attributes.So the resource which should process the extension logic like other base resources.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                args[\u0027ipv6_ra_mode\u0027] \u003d subnet[\u0027ipv6_ra_mode\u0027]"},{"line_number":306,"context_line":"            if attributes.is_attr_set(subnet[\u0027ipv6_address_mode\u0027]):"},{"line_number":307,"context_line":"                args[\u0027ipv6_address_mode\u0027] \u003d subnet[\u0027ipv6_address_mode\u0027]"},{"line_number":308,"context_line":"        if (f not in args for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":309,"context_line":"            args[\u0027created_at\u0027] \u003d timeutils.utcnow()"},{"line_number":310,"context_line":"            args[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":311,"context_line":"        return args"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_1af9c0c8","line":308,"updated":"2015-08-24 11:06:39.000000000","message":"Why we a check like \"f not in args\". From L294, I can find args clearly doesn\u0027t have these field. Am I missing anything?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":305,"context_line":"                args[\u0027ipv6_ra_mode\u0027] \u003d subnet[\u0027ipv6_ra_mode\u0027]"},{"line_number":306,"context_line":"            if attributes.is_attr_set(subnet[\u0027ipv6_address_mode\u0027]):"},{"line_number":307,"context_line":"                args[\u0027ipv6_address_mode\u0027] \u003d subnet[\u0027ipv6_address_mode\u0027]"},{"line_number":308,"context_line":"        if (f not in args for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":309,"context_line":"            args[\u0027created_at\u0027] \u003d timeutils.utcnow()"},{"line_number":310,"context_line":"            args[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":311,"context_line":"        return args"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_16475478","line":308,"in_reply_to":"fa1b9901_1af9c0c8","updated":"2015-08-24 13:34:28.000000000","message":"Thanks for review. I think the check logic may be useless, actually it should be better to just set the 2 fields into args directly.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        res[\u0027shared\u0027] \u003d self._make_network_dict(subnet.networks,"},{"line_number":139,"context_line":"                                                context\u003dcontext)[\u0027shared\u0027]"},{"line_number":140,"context_line":"        # Call auxiliary extend functions, if any"},{"line_number":141,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETS, res, subnet)"},{"line_number":142,"context_line":"        return self._fields(res, fields)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _make_subnetpool_dict(self, subnetpool, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_56d52e40","line":141,"updated":"2015-09-07 12:00:43.000000000","message":"I think we need \"if process_extensions:\" check over here as well.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c3e886be1839e9d0bcee292b94b4ecfcb0cbbef6","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        res[\u0027shared\u0027] \u003d self._make_network_dict(subnet.networks,"},{"line_number":139,"context_line":"                                                context\u003dcontext)[\u0027shared\u0027]"},{"line_number":140,"context_line":"        # Call auxiliary extend functions, if any"},{"line_number":141,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETS, res, subnet)"},{"line_number":142,"context_line":"        return self._fields(res, fields)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _make_subnetpool_dict(self, subnetpool, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_382dee8e","line":141,"in_reply_to":"da20952f_56d52e40","updated":"2015-09-11 09:35:12.000000000","message":"Thanks. I think it is the same as other resource\u0027s make dict.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":158,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":159,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":160,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":161,"context_line":"        if process_extensions:"},{"line_number":162,"context_line":"            self._apply_dict_extend_functions("},{"line_number":163,"context_line":"                attributes.SUBNETPOOLS, res, subnetpool)"},{"line_number":164,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_1345886d","line":161,"updated":"2015-09-07 12:00:43.000000000","message":"None of the caller is passing \u0027False\u0027 for \u0027process_extensions\u0027. When this will be \"False\u0027?","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c3e886be1839e9d0bcee292b94b4ecfcb0cbbef6","unresolved":false,"context_lines":[{"line_number":158,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":159,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":160,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":161,"context_line":"        if process_extensions:"},{"line_number":162,"context_line":"            self._apply_dict_extend_functions("},{"line_number":163,"context_line":"                attributes.SUBNETPOOLS, res, subnetpool)"},{"line_number":164,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_5d0e943b","line":161,"in_reply_to":"da20952f_1345886d","updated":"2015-09-11 09:35:12.000000000","message":"Thanks for correct. I just follow the other resource\u0027s make dict.What you said is true.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        res[\u0027shared\u0027] \u003d self._make_network_dict(subnet.networks,"},{"line_number":140,"context_line":"                                                context\u003dcontext)[\u0027shared\u0027]"},{"line_number":141,"context_line":"        # Call auxiliary extend functions, if any"},{"line_number":142,"context_line":"        if process_extensions:"},{"line_number":143,"context_line":"            self._apply_dict_extend_functions(attributes.SUBNETS, res, subnet)"},{"line_number":144,"context_line":"        return self._fields(res, fields)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_697a3cf3","line":142,"updated":"2015-09-16 08:59:52.000000000","message":"why does this need to be conditional?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        res[\u0027shared\u0027] \u003d self._make_network_dict(subnet.networks,"},{"line_number":140,"context_line":"                                                context\u003dcontext)[\u0027shared\u0027]"},{"line_number":141,"context_line":"        # Call auxiliary extend functions, if any"},{"line_number":142,"context_line":"        if process_extensions:"},{"line_number":143,"context_line":"            self._apply_dict_extend_functions(attributes.SUBNETS, res, subnet)"},{"line_number":144,"context_line":"        return self._fields(res, fields)"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_3e752df9","line":142,"in_reply_to":"ba15a1d1_697a3cf3","updated":"2015-09-17 02:54:52.000000000","message":"Thanks for review. I feel doubt about this too. But this judgment condition is the same as the others\u0027 make_dict function. I try to make them in the same format. I\u0027m not sure this is the right way as I cannot found any caller used the process_extensions argument related with subnet resource before and now. Could you give some suggestions? Thanks.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2caf96457c8fbe61024fc5baca66c587f450a92c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":158,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":159,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":160,"context_line":"        self._apply_dict_extend_functions("},{"line_number":161,"context_line":"            attributes.SUBNETPOOLS, res, subnetpool)"},{"line_number":162,"context_line":"        return self._fields(res, fields)"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_39be41d5","line":160,"updated":"2015-11-13 06:40:56.000000000","message":"this code does not look related. why the change here?","commit_id":"e66328b18ed63b48e1061660a3568b5259d9ad68"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2caf96457c8fbe61024fc5baca66c587f450a92c","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                args[\u0027ipv6_ra_mode\u0027] \u003d subnet[\u0027ipv6_ra_mode\u0027]"},{"line_number":315,"context_line":"            if attributes.is_attr_set(subnet[\u0027ipv6_address_mode\u0027]):"},{"line_number":316,"context_line":"                args[\u0027ipv6_address_mode\u0027] \u003d subnet[\u0027ipv6_address_mode\u0027]"},{"line_number":317,"context_line":"        self.add_timestamp(args)"},{"line_number":318,"context_line":"        return args"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"    def _make_fixed_ip_dict(self, ips):"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_19a01da5","line":317,"updated":"2015-11-13 06:40:56.000000000","message":"if this is done via an extension then you do not need this. It should be done when creating the port port data","commit_id":"e66328b18ed63b48e1061660a3568b5259d9ad68"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b8e1aaf0fcfd9ac7e597340b6564f6e36f85341d","unresolved":false,"context_lines":[{"line_number":152,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":153,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":154,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":155,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS, res,"},{"line_number":156,"context_line":"                                          subnetpool)"},{"line_number":157,"context_line":"        return self._fields(res, fields)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_19085127","line":155,"updated":"2016-02-18 17:34:00.000000000","message":"If you spotted an issue here, this looks like a change that could be extracted into a separate patch (mainly for backport reasons)","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"803c8283e5785b38f61eede8fc05757d76418384","unresolved":false,"context_lines":[{"line_number":152,"context_line":"               \u0027ip_version\u0027: subnetpool[\u0027ip_version\u0027],"},{"line_number":153,"context_line":"               \u0027default_quota\u0027: subnetpool[\u0027default_quota\u0027],"},{"line_number":154,"context_line":"               \u0027address_scope_id\u0027: subnetpool[\u0027address_scope_id\u0027]}"},{"line_number":155,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS, res,"},{"line_number":156,"context_line":"                                          subnetpool)"},{"line_number":157,"context_line":"        return self._fields(res, fields)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_3508a82d","line":155,"in_reply_to":"dae33548_19085127","updated":"2016-02-19 02:18:43.000000000","message":"@Armando, Thanks very much. if the make_subnetpool_dict not process extension functions, the returned body will not contain any extension fields now. So I add the code here. For you kind suggesion, I will propose another patch for this addition and let this one depend on it. Thanks again.","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        sp \u003d subnetpool[\u0027subnetpool\u0027]"},{"line_number":914,"context_line":"        if (f not in sp for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":915,"context_line":"            sp[\u0027created_at\u0027] \u003d timeutils.utcnow()"},{"line_number":916,"context_line":"            sp[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":917,"context_line":"        sp_reader \u003d subnet_alloc.SubnetPoolReader(sp)"},{"line_number":918,"context_line":"        if sp_reader.address_scope_id is attributes.ATTR_NOT_SPECIFIED:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_9ad2b033","line":915,"updated":"2015-08-24 11:06:39.000000000","message":"Can we make it as a function and call it from all the places?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":912,"context_line":""},{"line_number":913,"context_line":"        sp \u003d subnetpool[\u0027subnetpool\u0027]"},{"line_number":914,"context_line":"        if (f not in sp for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":915,"context_line":"            sp[\u0027created_at\u0027] \u003d timeutils.utcnow()"},{"line_number":916,"context_line":"            sp[\u0027updated_at\u0027] \u003d timeutils.utcnow()"},{"line_number":917,"context_line":"        sp_reader \u003d subnet_alloc.SubnetPoolReader(sp)"},{"line_number":918,"context_line":"        if sp_reader.address_scope_id is attributes.ATTR_NOT_SPECIFIED:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_76c81075","line":915,"in_reply_to":"fa1b9901_9ad2b033","updated":"2015-08-24 13:34:28.000000000","message":"Yeah!Good suggestion!","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        else:"},{"line_number":187,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def check_timestamp_is_valid(self, port):"},{"line_number":190,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":191,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":192,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_19d760ee","line":189,"updated":"2015-08-25 07:24:16.000000000","message":"IMHO, this function must return either \u0027True\u0027 or \u0027False\u0027 as per its name. The function says \"check_timestamp_valid?\" but it it saves time. I am confused? Request you to kindly rename the function as per its functionality.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"ccc55f1bf08b9f912eff9ff33457b923ed0e25cd","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        else:"},{"line_number":187,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def check_timestamp_is_valid(self, port):"},{"line_number":190,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":191,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":192,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_3a8d3d7c","line":189,"updated":"2015-08-26 04:36:48.000000000","message":"call it format_timestamp()?","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"9279b8aead050592ed59c69910fa0aac52d93d05","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        else:"},{"line_number":187,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def check_timestamp_is_valid(self, port):"},{"line_number":190,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":191,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":192,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_453117ec","line":189,"in_reply_to":"fa1b9901_19d760ee","updated":"2015-08-26 14:13:30.000000000","message":"Thank you for review.According to you mentioned.This name is inappropriate. This function is used to convert the time which is string to datetime.As 1148, \nnew_port \u003d port[\u0027port\u0027] can get the port dict, and the dict contained the timestamp like string \u00272015-08-26T09:29:22Z\u0027, it can not to set the timestamp fields whose type is DATETIME in database. So all this function to convert to the right format.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"9279b8aead050592ed59c69910fa0aac52d93d05","unresolved":false,"context_lines":[{"line_number":186,"context_line":"        else:"},{"line_number":187,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def check_timestamp_is_valid(self, port):"},{"line_number":190,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":191,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":192,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_c53d278f","line":189,"in_reply_to":"fa1b9901_3a8d3d7c","updated":"2015-08-26 14:13:30.000000000","message":"Thank you for review. It used to convert the string timestamp to python datatime for db operation.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":1145,"context_line":""},{"line_number":1146,"context_line":"    def update_port(self, context, id, port):"},{"line_number":1147,"context_line":"        new_port \u003d port[\u0027port\u0027]"},{"line_number":1148,"context_line":"        self.check_timestamp_is_valid(new_port)"},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":1151,"context_line":"            port \u003d self._get_port(context, id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f9206cf9","line":1148,"updated":"2015-08-25 07:24:16.000000000","message":"I believe the name of the called function should be renamed.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"9279b8aead050592ed59c69910fa0aac52d93d05","unresolved":false,"context_lines":[{"line_number":1145,"context_line":""},{"line_number":1146,"context_line":"    def update_port(self, context, id, port):"},{"line_number":1147,"context_line":"        new_port \u003d port[\u0027port\u0027]"},{"line_number":1148,"context_line":"        self.check_timestamp_is_valid(new_port)"},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":1151,"context_line":"            port \u003d self._get_port(context, id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_c50be7d3","line":1148,"in_reply_to":"fa1b9901_f9206cf9","updated":"2015-08-26 14:13:30.000000000","message":"Thanks, agree with you","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"7b24abd8b4cd6c18354f58ee9fcbc3d6ac42bc01","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        else:"},{"line_number":190,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, port):"},{"line_number":193,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_29977449","line":192,"updated":"2015-08-28 09:39:20.000000000","message":"why just port need to convert?","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c7ef433042431931efbe092a3e9f0fd890e0f3cc","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        else:"},{"line_number":190,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, port):"},{"line_number":193,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None and updated_at is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_dae53338","line":192,"in_reply_to":"da20952f_29977449","updated":"2015-08-29 00:34:46.000000000","message":"Thanks for review.Agree","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, port):"},{"line_number":193,"context_line":"        created_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d port.get(\u0027created_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None and updated_at is None:"},{"line_number":196,"context_line":"            return"},{"line_number":197,"context_line":"        if not (isinstance(created_at, datetime.datetime) and"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_eb32990f","line":194,"updated":"2015-08-30 04:51:33.000000000","message":"this should be \u0027updated_at\u0027","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            return"},{"line_number":197,"context_line":"        if not (isinstance(created_at, datetime.datetime) and"},{"line_number":198,"context_line":"                isinstance(updated_at, datetime.datetime)):"},{"line_number":199,"context_line":"            port[\u0027created_at\u0027] \u003d datetime.datetime.fromtimestamp(time.mktime("},{"line_number":200,"context_line":"                time.strptime(port[\u0027created_at\u0027],"},{"line_number":201,"context_line":"                              constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":202,"context_line":"            port[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_2b2df1a7","line":199,"updated":"2015-08-30 04:51:33.000000000","message":"How about making this as a common function as the same operation we might to do for all the applicable resources.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ebeebc21c363e95a630a488e8cccbaf473d87bf8","unresolved":false,"context_lines":[{"line_number":196,"context_line":"            return"},{"line_number":197,"context_line":"        if not (isinstance(created_at, datetime.datetime) and"},{"line_number":198,"context_line":"                isinstance(updated_at, datetime.datetime)):"},{"line_number":199,"context_line":"            port[\u0027created_at\u0027] \u003d datetime.datetime.fromtimestamp(time.mktime("},{"line_number":200,"context_line":"                time.strptime(port[\u0027created_at\u0027],"},{"line_number":201,"context_line":"                              constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":202,"context_line":"            port[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp(time.mktime("}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_e48c8881","line":199,"in_reply_to":"da20952f_2b2df1a7","updated":"2015-09-02 03:56:13.000000000","message":"Good idea! Thank you, I will move it later.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"                dns_assignment \u003d self._get_dns_names_for_updated_port("},{"line_number":1239,"context_line":"                    context, port, original_ips, original_dns_name,"},{"line_number":1240,"context_line":"                    request_dns_name, changes)"},{"line_number":1241,"context_line":"            port.updated_at \u003d port.updated_at.utcnow()"},{"line_number":1242,"context_line":""},{"line_number":1243,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1244,"context_line":"        # Keep up with fields that changed"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_6b2769ca","line":1241,"updated":"2015-08-30 04:51:33.000000000","message":"I think a common API could be defined somewhere for time updation and can be called passing different resource.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"71dd17fa7567792dc27a75fa1b92554beb1f2262","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, resource):"},{"line_number":193,"context_line":"        created_at \u003d resource.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d resource.get(\u0027updated_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None and updated_at is None:"},{"line_number":196,"context_line":"            return"},{"line_number":197,"context_line":"        if not (isinstance(created_at, datetime.datetime) and"},{"line_number":198,"context_line":"                isinstance(updated_at, datetime.datetime)):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_c914cb4e","line":195,"updated":"2015-09-03 01:03:47.000000000","message":"is there an event where in one of these is None? If it is possible then you might want to handle that","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, resource):"},{"line_number":193,"context_line":"        created_at \u003d resource.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d resource.get(\u0027updated_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None and updated_at is None:"},{"line_number":196,"context_line":"            return"},{"line_number":197,"context_line":"        if not (isinstance(created_at, datetime.datetime) and"},{"line_number":198,"context_line":"                isinstance(updated_at, datetime.datetime)):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_227c79ea","line":195,"in_reply_to":"da20952f_c914cb4e","updated":"2015-09-03 04:45:51.000000000","message":"Thanks for review. I think these fields are both None or not. As these fields would be operated in the same time.","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":386,"context_line":"            network.update(n)"},{"line_number":387,"context_line":"            network.updated_at \u003d network.updated_at.utcnow()"},{"line_number":388,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def delete_network(self, context, id):"},{"line_number":391,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_9613c600","line":388,"updated":"2015-09-07 12:00:43.000000000","message":"We must pass \"process_extension\u003dfalse\" else \u0027created_at\u0027 will also be updated. Check this comment for all the resources.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c3e886be1839e9d0bcee292b94b4ecfcb0cbbef6","unresolved":false,"context_lines":[{"line_number":385,"context_line":"                    context.session.expire(network, [\u0027rbac_entries\u0027])"},{"line_number":386,"context_line":"            network.update(n)"},{"line_number":387,"context_line":"            network.updated_at \u003d network.updated_at.utcnow()"},{"line_number":388,"context_line":"        return self._make_network_dict(network, context\u003dcontext)"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"    def delete_network(self, context, id):"},{"line_number":391,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_f83bf699","line":388,"in_reply_to":"da20952f_9613c600","updated":"2015-09-11 09:35:12.000000000","message":"Hi Mr.choudary, the function of make_network_dict won\u0027t update the \u0027created_at\u0027, it just make the datetime to string. Do I lose something?","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, resource):"},{"line_number":193,"context_line":"        created_at \u003d resource.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d resource.get(\u0027updated_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None or updated_at is None:"},{"line_number":196,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_2c6bd0b8","line":193,"updated":"2015-09-29 13:24:55.000000000","message":"IMO, We can define constants for \u0027created_at\u0027, \u0027updated_at\u0027 and \u0027changed_since\u0027 rather than hard-coding everywhere. This is just a suggestion. Feel free to reject.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ee8a07c487044e7c49686e4c857f2ae09810cf15","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, resource):"},{"line_number":193,"context_line":"        created_at \u003d resource.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d resource.get(\u0027updated_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None or updated_at is None:"},{"line_number":196,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_e7c5685b","line":193,"in_reply_to":"3a29b11f_c0ff0433","updated":"2015-10-19 11:46:29.000000000","message":"Thanks for review.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"1d374774e66701dd369e9161d95729d3dbbf8111","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            self.ipam \u003d ipam_non_pluggable_backend.IpamNonPluggableBackend()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def convert_timestamp_if_necessary(self, resource):"},{"line_number":193,"context_line":"        created_at \u003d resource.get(\u0027created_at\u0027, None)"},{"line_number":194,"context_line":"        updated_at \u003d resource.get(\u0027updated_at\u0027, None)"},{"line_number":195,"context_line":"        if created_at is None or updated_at is None:"},{"line_number":196,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_c0ff0433","line":193,"in_reply_to":"9a1a9d01_2c6bd0b8","updated":"2015-10-19 05:03:34.000000000","message":"+1 I think constants for these strings should be used tool","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            resource[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp("},{"line_number":204,"context_line":"                time.mktime("},{"line_number":205,"context_line":"                    time.strptime(resource[\u0027updated_at\u0027],"},{"line_number":206,"context_line":"                                  constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_host_route(self, route, ip_version):"},{"line_number":209,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_c919087b","line":206,"updated":"2015-09-16 08:59:52.000000000","message":"can you make it a subroutine rather than repeating twice?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ee8a07c487044e7c49686e4c857f2ae09810cf15","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            resource[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp("},{"line_number":204,"context_line":"                time.mktime("},{"line_number":205,"context_line":"                    time.strptime(resource[\u0027updated_at\u0027],"},{"line_number":206,"context_line":"                                  constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_host_route(self, route, ip_version):"},{"line_number":209,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_27ccc088","line":206,"in_reply_to":"3a29b11f_e06c800a","updated":"2015-10-19 11:46:29.000000000","message":"@John, Hi, John, thanks for review. this function is used for converting the formative string to datetime. The 2 fields may be different, but created_at will still bigger than updated_at, there is a case that the input resource had been updated several times, so the updated_at should be updated for the same times, this will lead these fields are different. And if 1 field is formative string, the other must be the same. So I think 2 calls here is OK. If I miss something, could you tell me ? thanks.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"1d374774e66701dd369e9161d95729d3dbbf8111","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            resource[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp("},{"line_number":204,"context_line":"                time.mktime("},{"line_number":205,"context_line":"                    time.strptime(resource[\u0027updated_at\u0027],"},{"line_number":206,"context_line":"                                  constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_host_route(self, route, ip_version):"},{"line_number":209,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_e06c800a","line":206,"in_reply_to":"9a1a9d01_6c078818","updated":"2015-10-19 05:03:34.000000000","message":"From the above code, time.mktime could retrieve two different times.  In the above case, I think we want created_at and updated_at to be the same time.  Only a single call to mktime should need to be done here.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            resource[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp("},{"line_number":204,"context_line":"                time.mktime("},{"line_number":205,"context_line":"                    time.strptime(resource[\u0027updated_at\u0027],"},{"line_number":206,"context_line":"                                  constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_host_route(self, route, ip_version):"},{"line_number":209,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_fe89f526","line":206,"in_reply_to":"ba15a1d1_c919087b","updated":"2015-09-17 02:54:52.000000000","message":"Thanks for review. I will rework it.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":203,"context_line":"            resource[\u0027updated_at\u0027] \u003d datetime.datetime.fromtimestamp("},{"line_number":204,"context_line":"                time.mktime("},{"line_number":205,"context_line":"                    time.strptime(resource[\u0027updated_at\u0027],"},{"line_number":206,"context_line":"                                  constants.ISO8601_TIMESTAMP_FORMAT)))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _validate_host_route(self, route, ip_version):"},{"line_number":209,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_6c078818","line":206,"in_reply_to":"ba15a1d1_fe89f526","updated":"2015-09-29 13:24:55.000000000","message":"I think separate function may not be very useful. It\u0027s just 2 statements, calling a separate function wold be an overhead.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"1d374774e66701dd369e9161d95729d3dbbf8111","unresolved":false,"context_lines":[{"line_number":361,"context_line":"    def update_network(self, context, id, network):"},{"line_number":362,"context_line":"        n \u003d network[\u0027network\u0027]"},{"line_number":363,"context_line":"        self.convert_timestamp_if_necessary(n)"},{"line_number":364,"context_line":""},{"line_number":365,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":366,"context_line":"            network \u003d self._get_network(context, id)"},{"line_number":367,"context_line":"            # validate \u0027shared\u0027 parameter"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_c05b8453","line":364,"updated":"2015-10-19 05:03:34.000000000","message":"Extra blank line not necessary.  Also on L1259","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":965,"context_line":"                         \u0027shared\u0027: sp_reader.shared,"},{"line_number":966,"context_line":"                         \u0027default_quota\u0027: sp_reader.default_quota,"},{"line_number":967,"context_line":"                         \u0027address_scope_id\u0027: sp_reader.address_scope_id}"},{"line_number":968,"context_line":"            if (f not in pool_args for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":969,"context_line":"                pool_args[\u0027created_at\u0027] \u003d sp_reader.created_at"},{"line_number":970,"context_line":"                pool_args[\u0027updated_at\u0027] \u003d sp_reader.updated_at"},{"line_number":971,"context_line":"            subnetpool \u003d models_v2.SubnetPool(**pool_args)"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_4c72c47c","line":968,"updated":"2015-09-29 13:24:55.000000000","message":"Why we need this check.. Can\u0027t we directly do the assignment as done for the other attributes? Anyways, pool_args is initialized just above and will not of these attributes.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":965,"context_line":"                         \u0027shared\u0027: sp_reader.shared,"},{"line_number":966,"context_line":"                         \u0027default_quota\u0027: sp_reader.default_quota,"},{"line_number":967,"context_line":"                         \u0027address_scope_id\u0027: sp_reader.address_scope_id}"},{"line_number":968,"context_line":"            if (f not in pool_args for f in [\u0027created_at\u0027, \u0027updated_at\u0027]):"},{"line_number":969,"context_line":"                pool_args[\u0027created_at\u0027] \u003d sp_reader.created_at"},{"line_number":970,"context_line":"                pool_args[\u0027updated_at\u0027] \u003d sp_reader.updated_at"},{"line_number":971,"context_line":"            subnetpool \u003d models_v2.SubnetPool(**pool_args)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_9e67cf24","line":968,"in_reply_to":"9a1a9d01_4c72c47c","updated":"2015-10-15 12:45:22.000000000","message":"Hi Mr.choudhary, thanks for review. You said is correct.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"            self._validate_address_scope_id(context, reader.address_scope_id,"},{"line_number":1034,"context_line":"                                            id, reader.prefixes)"},{"line_number":1035,"context_line":"            reader.subnetpool[\u0027updated_at\u0027] \u003d datetime.datetime.utcnow()"},{"line_number":1036,"context_line":"            orig_sp.update(self._filter_non_model_columns("},{"line_number":1037,"context_line":"                                                      reader.subnetpool,"},{"line_number":1038,"context_line":"                                                      models_v2.SubnetPool))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_2959a4fe","line":1035,"updated":"2015-09-16 08:59:52.000000000","message":"seems like an abstraction violation.\nwhy don\u0027t you just update orig_sp?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":1032,"context_line":""},{"line_number":1033,"context_line":"            self._validate_address_scope_id(context, reader.address_scope_id,"},{"line_number":1034,"context_line":"                                            id, reader.prefixes)"},{"line_number":1035,"context_line":"            reader.subnetpool[\u0027updated_at\u0027] \u003d datetime.datetime.utcnow()"},{"line_number":1036,"context_line":"            orig_sp.update(self._filter_non_model_columns("},{"line_number":1037,"context_line":"                                                      reader.subnetpool,"},{"line_number":1038,"context_line":"                                                      models_v2.SubnetPool))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_3e6a0d82","line":1035,"in_reply_to":"ba15a1d1_2959a4fe","updated":"2015-09-17 02:54:52.000000000","message":"Thanks. This process flow is :\n1.get the db obj orig_sp\n2.construct the reader based on updated(dict object) which is based on orig_sp and new_sp, and new_sp won\u0027t contain any timestamp fields.\n3.the reader must contain all the new info in the common flow.\n4.orig_sp will be updated based on the reader below.\n5.commit the db session.\n\nSo I think the timestamp fields may be added into the reader is appropriate. If there is any problem or I miss something, could you please show me?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"806b1d1818fc0fe3e39217bd4fcb75ef1f88f2d0","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        dns lease or we support gratuitous DHCP offers"},{"line_number":716,"context_line":"        \"\"\""},{"line_number":717,"context_line":"        s \u003d subnet[\u0027subnet\u0027]"},{"line_number":718,"context_line":"        self.convert_timestamp_if_necessary(s)"},{"line_number":719,"context_line":"        new_cidr \u003d s.get(\u0027cidr\u0027)"},{"line_number":720,"context_line":"        db_subnet \u003d self._get_subnet(context, id)"},{"line_number":721,"context_line":"        # Fill \u0027ip_version\u0027 and \u0027allocation_pools\u0027 fields with the current"}],"source_content_type":"text/x-python","patch_set":38,"id":"9a8ffd7b_28b43f80","line":718,"updated":"2015-11-26 10:39:29.000000000","message":"why is this not done in the extension. what if my plugin foo is not intersted in the timestamp extension support","commit_id":"1cb47e5d3a0ef3c08a4a93c7bc9f1e6890db34e6"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b8e1aaf0fcfd9ac7e597340b6564f6e36f85341d","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1010,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1011,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1012,"context_line":"                                          updated, model)"},{"line_number":1013,"context_line":"        return updated"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def _write_key(self, key, update, orig, new_dict):"}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_3911d552","line":1012,"updated":"2016-02-18 17:34:00.000000000","message":"ditto","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"803c8283e5785b38f61eede8fc05757d76418384","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"                    \u0027standard_attr\u0027]:"},{"line_number":1010,"context_line":"            self._write_key(key, updated, model, new_pool)"},{"line_number":1011,"context_line":"        self._apply_dict_extend_functions(attributes.SUBNETPOOLS,"},{"line_number":1012,"context_line":"                                          updated, model)"},{"line_number":1013,"context_line":"        return updated"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def _write_key(self, key, update, orig, new_dict):"}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_f00c8e3d","line":1012,"in_reply_to":"dae33548_3911d552","updated":"2016-02-19 02:18:43.000000000","message":"I will, thanks very much.","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"}],"neutron/db/migration/alembic_migrations/versions/HEADS":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4be67a89b3cd23ece96591a381e3c830cd61e32c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD"},{"line_number":2,"context_line":"2e5352a0ad4d"},{"line_number":3,"context_line":"9859ac9c136"},{"line_number":4,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"fa1b9901_742e2ca6","line":1,"updated":"2015-08-21 07:18:17.000000000","message":"What\u0027s this?","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"d717f736d1dbf933d005dc027f40649c52672d77","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD"},{"line_number":2,"context_line":"2e5352a0ad4d"},{"line_number":3,"context_line":"9859ac9c136"},{"line_number":4,"context_line":"kilo"}],"source_content_type":"application/octet-stream","patch_set":3,"id":"fa1b9901_68c08b50","line":1,"in_reply_to":"fa1b9901_742e2ca6","updated":"2015-09-11 09:34:53.000000000","message":"Thank you. This is my mistake.","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":1,"context_line":"3894bccad37f"},{"line_number":2,"context_line":"4af11ca47297"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"9a1a9d01_cc3334aa","line":1,"updated":"2015-09-29 13:24:55.000000000","message":"HEADS is no more required. Please check the latest migration rules.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":16707,"name":"Mohankumar","email":"nmohankumar1011@gmail.com","username":"mohankumar_n"},"change_message_id":"61884856ed673b0ccb46bf53159389c1d4515bcf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"3894bccad37f"},{"line_number":2,"context_line":"4af11ca47297"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"5a2ca52d_d0633819","line":1,"in_reply_to":"9a1a9d01_cc3334aa","updated":"2015-10-14 07:26:22.000000000","message":"+1","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":1,"context_line":"3894bccad37f"},{"line_number":2,"context_line":"4af11ca47297"}],"source_content_type":"application/octet-stream","patch_set":22,"id":"5a2ca52d_29c1a380","line":1,"in_reply_to":"9a1a9d01_cc3334aa","updated":"2015-10-15 12:45:22.000000000","message":"Done","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/3894bccad37f_add_timestamp_to_base_resources.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_1acea083","line":1,"updated":"2015-08-24 11:06:39.000000000","message":"Please provide correct Copyright details.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_96712447","line":1,"in_reply_to":"fa1b9901_1acea083","updated":"2015-08-24 13:34:28.000000000","message":"Thanks for review.Thanks for your kindness.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_1973e016","line":1,"updated":"2015-08-25 07:24:16.000000000","message":"You can mention your company name over here.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack HuaWei"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_eb193989","line":1,"updated":"2015-08-30 04:51:33.000000000","message":"Huawei Technologies.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Huawei Technologies."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_766ab282","line":1,"updated":"2015-09-07 12:00:43.000000000","message":"You can just have your company name. Remove OpenStack.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"}],"neutron/db/migration/alembic_migrations/versions/liberty/expand/39535793f4e6_set_base_resources_timestamp_to_now.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"0e2562681ca7c19770494d6b02230999c96ddbef","unresolved":false,"context_lines":[{"line_number":38,"context_line":"                       PORTS_TABLE]:"},{"line_number":39,"context_line":"        op.execute("},{"line_number":40,"context_line":"            \"update %(name)s set updated_at \u003d now()\""},{"line_number":41,"context_line":"            \" where updated_at \u003d %(origin)\""},{"line_number":42,"context_line":"            % {\u0027name\u0027: table_name,"},{"line_number":43,"context_line":"               \u0027origin\u0027: ORIGINAL_DEFAULT_TIMESTAMP})"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_99112ab2","line":41,"updated":"2015-08-17 08:44:40.000000000","message":"This migration should go to contact branch.","commit_id":"dc679a0e66cf5d4f32490f19e4da8c4d5eba4f87"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/3894bccad37f_add_timestamp_to_base_resources.py":[{"author":{"_account_id":16788,"name":"Ramanjaneya Reddy Palleti","email":"ramanjaneya.palleti@huawei.com","username":"Ramanjaneya"},"change_message_id":"6e5763b06331da3b51edc2668049d21082e60aaa","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                       PORTS_TABLE]:"},{"line_number":40,"context_line":"        op.add_column("},{"line_number":41,"context_line":"            table_name,"},{"line_number":42,"context_line":"            sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue)"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        op.add_column("},{"line_number":45,"context_line":"            table_name,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_210d29e8","line":42,"updated":"2015-10-21 05:02:53.000000000","message":"On what base can decide nullable as True or False?","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1b5b3753d266e48d339f58330f0b8b96fb84b62e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                       PORTS_TABLE]:"},{"line_number":40,"context_line":"        op.add_column("},{"line_number":41,"context_line":"            table_name,"},{"line_number":42,"context_line":"            sa.Column(\u0027created_at\u0027, sa.DateTime(), nullable\u003dTrue)"},{"line_number":43,"context_line":"        )"},{"line_number":44,"context_line":"        op.add_column("},{"line_number":45,"context_line":"            table_name,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_dffe8cad","line":42,"in_reply_to":"3a29b11f_210d29e8","updated":"2015-10-21 07:28:50.000000000","message":"Hi, thanks for review. First, I followed the realize way from nova, as it be set True in nova. Second, if the nullable is false, when process db migration will hit error as the legacy data didn\u0027t have the timestamp fields, but how we define the time of legacy time, so I think it is bad to set legacy data the running time of upgrade db script.","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":17776,"name":"Reedip","email":"reedip.banerjee@gmail.com","username":"Reedip"},"change_message_id":"c54384c43a446ecba91c83e9cdf5e3c6448b8aeb","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        op.add_column("},{"line_number":45,"context_line":"            table_name,"},{"line_number":46,"context_line":"            sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue)"},{"line_number":47,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_3e0c693a","line":47,"updated":"2015-10-21 01:37:24.000000000","message":"How about:\n\t    for table_name in [NETWORKS_TABLE, SUBNETS_TABLE, SUBNETPOOLS_TABLES,\n\t\t\t                       PORTS_TABLE]:\t\n                 for column_name in [ \u0027created_at\u0027, \u0027updated_at\u0027]:\n\t\t\t            op.add_column(\t\n    \t\t\t                table_name,\t\n\t\t\t                sa.Column(column_name, sa.DateTime(), nullable\u003dTrue)\t\n\t\t\t        )","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"91fb159c6e383ac762dee239cdd013f52dce9b78","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        op.add_column("},{"line_number":45,"context_line":"            table_name,"},{"line_number":46,"context_line":"            sa.Column(\u0027updated_at\u0027, sa.DateTime(), nullable\u003dTrue)"},{"line_number":47,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a29b11f_995357e2","line":47,"in_reply_to":"3a29b11f_3e0c693a","updated":"2015-10-21 03:42:06.000000000","message":"Thanks, It\u0027s a good suggestion from u.But I think code now may be easier to read. I\u0027m afraid the muti-circle. :-)","commit_id":"6cf5f567191fd22552d688bbf8d362d280cd0d17"}],"neutron/db/models_v2.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    device_id \u003d sa.Column(sa.String(attr.DEVICE_ID_MAX_LEN), nullable\u003dFalse)"},{"line_number":142,"context_line":"    device_owner \u003d sa.Column(sa.String(attr.DEVICE_OWNER_MAX_LEN),"},{"line_number":143,"context_line":"                             nullable\u003dFalse)"},{"line_number":144,"context_line":"    created_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":145,"context_line":"    updated_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":146,"context_line":"    __table_args__ \u003d ("},{"line_number":147,"context_line":"        sa.Index("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_9a8e3026","line":144,"updated":"2015-08-24 11:06:39.000000000","message":"Can we define this as a MACRO at the beginning of the file and use it everywhere?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    device_id \u003d sa.Column(sa.String(attr.DEVICE_ID_MAX_LEN), nullable\u003dFalse)"},{"line_number":142,"context_line":"    device_owner \u003d sa.Column(sa.String(attr.DEVICE_OWNER_MAX_LEN),"},{"line_number":143,"context_line":"                             nullable\u003dFalse)"},{"line_number":144,"context_line":"    created_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":145,"context_line":"    updated_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":146,"context_line":"    __table_args__ \u003d ("},{"line_number":147,"context_line":"        sa.Index("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_764ed0c2","line":144,"in_reply_to":"fa1b9901_9a8e3026","updated":"2015-08-24 13:34:28.000000000","message":"Agree.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"74bb2d6cc1efc13ada2261bde14fb41f7048b7d4","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    device_id \u003d sa.Column(sa.String(attr.DEVICE_ID_MAX_LEN), nullable\u003dFalse)"},{"line_number":142,"context_line":"    device_owner \u003d sa.Column(sa.String(attr.DEVICE_OWNER_MAX_LEN),"},{"line_number":143,"context_line":"                             nullable\u003dFalse)"},{"line_number":144,"context_line":"    created_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":145,"context_line":"    updated_at \u003d sa.Column(sa.DateTime, nullable\u003dFalse)"},{"line_number":146,"context_line":"    __table_args__ \u003d ("},{"line_number":147,"context_line":"        sa.Index("}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_295d5679","line":144,"in_reply_to":"fa1b9901_9a8e3026","updated":"2015-08-24 14:36:47.000000000","message":"I think try to work it with oslo_db.sqlalchemy.models.TimestampMixin which like nova and cinder may be more appropriate. What do u think?","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"7b24abd8b4cd6c18354f58ee9fcbc3d6ac42bc01","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        # NOTE(arosen): status must be set last as an event is triggered on!"},{"line_number":160,"context_line":"        self.status \u003d status"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        self.created_at \u003d created_at"},{"line_number":163,"context_line":"        self.updated_at \u003d updated_at"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_c92a787e","line":162,"updated":"2015-08-28 09:39:20.000000000","message":"as arosen has comment, self.created_at, and self.updated_at are need to add before self.status?","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c7ef433042431931efbe092a3e9f0fd890e0f3cc","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        # NOTE(arosen): status must be set last as an event is triggered on!"},{"line_number":160,"context_line":"        self.status \u003d status"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        self.created_at \u003d created_at"},{"line_number":163,"context_line":"        self.updated_at \u003d updated_at"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_5af12300","line":162,"in_reply_to":"da20952f_c92a787e","updated":"2015-08-29 00:34:46.000000000","message":"Thanks for review.Agree","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"6986683f00513c17372df0e8defbbd5b8ed9ffe9","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def __init__(self, id\u003dNone, tenant_id\u003dNone, name\u003dNone, network_id\u003dNone,"},{"line_number":143,"context_line":"                 mac_address\u003dNone, admin_state_up\u003dNone, status\u003dNone,"},{"line_number":144,"context_line":"                 device_id\u003dNone, device_owner\u003dNone, fixed_ips\u003dNone,"},{"line_number":145,"context_line":"                 dns_name\u003dNone, created_at\u003dNone, updated_at\u003dNone):"},{"line_number":146,"context_line":"        self.id \u003d id"},{"line_number":147,"context_line":"        self.tenant_id \u003d tenant_id"},{"line_number":148,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_fba7beba","line":145,"updated":"2015-09-29 18:43:06.000000000","message":"Why does the Port model accept these attributes but other models don\u0027t?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    def __init__(self, id\u003dNone, tenant_id\u003dNone, name\u003dNone, network_id\u003dNone,"},{"line_number":143,"context_line":"                 mac_address\u003dNone, admin_state_up\u003dNone, status\u003dNone,"},{"line_number":144,"context_line":"                 device_id\u003dNone, device_owner\u003dNone, fixed_ips\u003dNone,"},{"line_number":145,"context_line":"                 dns_name\u003dNone, created_at\u003dNone, updated_at\u003dNone):"},{"line_number":146,"context_line":"        self.id \u003d id"},{"line_number":147,"context_line":"        self.tenant_id \u003d tenant_id"},{"line_number":148,"context_line":"        self.name \u003d name"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_69023b71","line":145,"in_reply_to":"9a1a9d01_fba7beba","updated":"2015-10-15 12:45:22.000000000","message":"Hi Muller, I think if here didn\u0027t accept these attributes , the models.Port can not identify the created_at and updated_at. I had test with remove the added code, it returned error from neutron.db.db_base_plugin_v2 _create_port_with_mac:\ndb_port\u003dmodels_v2.Port(mac_address\u003dmac_address, **port_data), and port_data had contain the timestamp fields. Then the TypeError: __init__() got an unexpected keyword argument \u0027created_at\u0027","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2caf96457c8fbe61024fc5baca66c587f450a92c","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        self.device_owner \u003d device_owner"},{"line_number":152,"context_line":"        self.device_id \u003d device_id"},{"line_number":153,"context_line":"        self.dns_name \u003d dns_name"},{"line_number":154,"context_line":"        self.created_at \u003d created_at"},{"line_number":155,"context_line":"        self.updated_at \u003d updated_at"},{"line_number":156,"context_line":"        # Since this is a relationship only set it if one is passed in."},{"line_number":157,"context_line":"        if fixed_ips:"}],"source_content_type":"text/x-python","patch_set":33,"id":"da85f559_d9a93592","line":154,"updated":"2015-11-13 06:40:56.000000000","message":"this should be via an extension","commit_id":"e66328b18ed63b48e1061660a3568b5259d9ad68"}],"neutron/db/resourcetimestamp_db.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4be67a89b3cd23ece96591a381e3c830cd61e32c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_d7113a53","line":1,"updated":"2015-08-21 07:18:17.000000000","message":"Please mention your company name. Check all the files.","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"d717f736d1dbf933d005dc027f40649c52672d77","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_dd707b74","line":1,"in_reply_to":"fa1b9901_d7113a53","updated":"2015-09-11 09:34:53.000000000","message":"Thank you.","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"bedd5def3fd8b900d29cd0020366a2bac405fd6a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_7a9d5c58","line":1,"updated":"2015-08-24 11:06:39.000000000","message":"Please provide current Copyright information.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 OpenStack Foundation."},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_96728410","line":1,"in_reply_to":"fa1b9901_7a9d5c58","updated":"2015-08-24 13:34:28.000000000","message":"Thanks, I will correct it later.","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f9938cf8","line":1,"updated":"2015-08-25 07:24:16.000000000","message":"You can provide your company name over here.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack HuaWei"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_2b041116","line":1,"updated":"2015-08-30 04:51:33.000000000","message":"Huawei Technologies.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"7b24abd8b4cd6c18354f58ee9fcbc3d6ac42bc01","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        resource_res[resourcetimestamp.updated_timestamp] \u003d (resource_db."},{"line_number":56,"context_line":"            updated_at.strftime(constants.ISO8601_TIMESTAMP_FORMAT))"},{"line_number":57,"context_line":"        return resource_res"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":60,"context_line":"        attributes.NETWORKS, [\u0027_extend_resource_dict_timestamp\u0027])"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_46d897ef","line":58,"updated":"2015-08-28 09:39:20.000000000","message":"maybe you can you use a loop to simplify the bellow codes","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        resource_res[resourcetimestamp.updated_timestamp] \u003d (resource_db."},{"line_number":56,"context_line":"            updated_at.strftime(constants.ISO8601_TIMESTAMP_FORMAT))"},{"line_number":57,"context_line":"        return resource_res"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":60,"context_line":"        attributes.NETWORKS, [\u0027_extend_resource_dict_timestamp\u0027])"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_4b014505","line":58,"in_reply_to":"da20952f_46d897ef","updated":"2015-08-30 04:51:33.000000000","message":"+1.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c7ef433042431931efbe092a3e9f0fd890e0f3cc","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        resource_res[resourcetimestamp.updated_timestamp] \u003d (resource_db."},{"line_number":56,"context_line":"            updated_at.strftime(constants.ISO8601_TIMESTAMP_FORMAT))"},{"line_number":57,"context_line":"        return resource_res"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":60,"context_line":"        attributes.NETWORKS, [\u0027_extend_resource_dict_timestamp\u0027])"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_7af667fa","line":58,"in_reply_to":"da20952f_46d897ef","updated":"2015-08-29 00:34:46.000000000","message":"Thanks for review.Agree","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5e1cd1d409a68b2c084b7161850ed6fcaf62ce41","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _process_timestamp_extension(self, context, result, resource):"},{"line_number":43,"context_line":"        resource_id \u003d result[\u0027id\u0027]"},{"line_number":44,"context_line":"        resource_type \u003d list(resource.keys())[0]"},{"line_number":45,"context_line":"        model \u003d RESOURCE_MAP_MODEL[resource_type]"},{"line_number":46,"context_line":"        resouce_model \u003d self._get_resource(context, model, resource_id)"},{"line_number":47,"context_line":"        result[\u0027created_at\u0027] \u003d (resouce_model.created_at."}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_d846db7a","line":44,"updated":"2015-09-02 22:48:32.000000000","message":"keys() already returns a list.","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _process_timestamp_extension(self, context, result, resource):"},{"line_number":43,"context_line":"        resource_id \u003d result[\u0027id\u0027]"},{"line_number":44,"context_line":"        resource_type \u003d list(resource.keys())[0]"},{"line_number":45,"context_line":"        model \u003d RESOURCE_MAP_MODEL[resource_type]"},{"line_number":46,"context_line":"        resouce_model \u003d self._get_resource(context, model, resource_id)"},{"line_number":47,"context_line":"        result[\u0027created_at\u0027] \u003d (resouce_model.created_at."}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_a29e4952","line":44,"in_reply_to":"da20952f_be7e6f68","updated":"2015-09-03 04:45:51.000000000","message":"Thank you both very much for review. Actually, the returned dict may just contains only 1 key-value, am i right? So in the beginning , I  just get the first index of the list which only has 1 member. But it must be an issue when the list is randomly order, the way you mentioned is a good suggestion. Thanks again!","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"13030e3c167dc9efbc286cc8817e4c78ddea67cb","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _process_timestamp_extension(self, context, result, resource):"},{"line_number":43,"context_line":"        resource_id \u003d result[\u0027id\u0027]"},{"line_number":44,"context_line":"        resource_type \u003d list(resource.keys())[0]"},{"line_number":45,"context_line":"        model \u003d RESOURCE_MAP_MODEL[resource_type]"},{"line_number":46,"context_line":"        resouce_model \u003d self._get_resource(context, model, resource_id)"},{"line_number":47,"context_line":"        result[\u0027created_at\u0027] \u003d (resouce_model.created_at."}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_be7e6f68","line":44,"in_reply_to":"da20952f_d846db7a","updated":"2015-09-02 23:50:58.000000000","message":"In python3 it doesn\u0027t return a list. However, for either python 2 or 3 the collection of keys is randomly ordered, so you cannot assume what the first key will be. Stackoverflow answers suggest the following to extract the \"first\" key from a dict:\n\n  resource_type \u003d six.next(six.iterkeys(resource))\n\nBut we know this resource dict has only one element and we only want the key. I would suggest having the caller pass the key instead of the dict to this method. See my comments in plugin.py","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Huawei Technologies."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_760152ae","line":1,"updated":"2015-09-07 12:00:43.000000000","message":"You can just have your company name. Remove OpenStack.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class ResourceTimeStamp_db_mixin(base_db.CommonDbMixin):"},{"line_number":33,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _get_resource(self, context, model, resource_id):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            resource \u003d self._get_by_id(context, model, resource_id)"},{"line_number":38,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_8cae9c96","line":35,"updated":"2015-09-29 13:24:55.000000000","message":"Can we put @staticmethod decorator for static methods?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ea8d3d212f8a0541fac1a4e192cf5c080c63eb56","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class ResourceTimeStamp_db_mixin(base_db.CommonDbMixin):"},{"line_number":33,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _get_resource(self, context, model, resource_id):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            resource \u003d self._get_by_id(context, model, resource_id)"},{"line_number":38,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_ee2c394c","line":35,"in_reply_to":"9a1a9d01_8cae9c96","updated":"2015-10-20 03:12:28.000000000","message":"Hi choudhary, why we set the decorator here, this function is just used by _process_timestamp_extension ..I think this is OK. Could you give your opinion to me? Thanks.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":32,"context_line":"class ResourceTimeStamp_db_mixin(base_db.CommonDbMixin):"},{"line_number":33,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def _get_resource(self, context, model, resource_id):"},{"line_number":36,"context_line":"        try:"},{"line_number":37,"context_line":"            resource \u003d self._get_by_id(context, model, resource_id)"},{"line_number":38,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_1e1dff0e","line":35,"in_reply_to":"9a1a9d01_8cae9c96","updated":"2015-10-15 12:45:22.000000000","message":"ack","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            resource_res[resourcetimestamp.updated_timestamp] \u003d ("},{"line_number":58,"context_line":"                resource_db.updated_at.strftime("},{"line_number":59,"context_line":"                    constants.ISO8601_TIMESTAMP_FORMAT))"},{"line_number":60,"context_line":"        return resource_res"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    for resources in [attributes.NETWORKS, attributes.PORTS,"},{"line_number":63,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_e9cbac51","line":60,"updated":"2015-09-16 08:59:52.000000000","message":"this return value is unused.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":57,"context_line":"            resource_res[resourcetimestamp.updated_timestamp] \u003d ("},{"line_number":58,"context_line":"                resource_db.updated_at.strftime("},{"line_number":59,"context_line":"                    constants.ISO8601_TIMESTAMP_FORMAT))"},{"line_number":60,"context_line":"        return resource_res"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    for resources in [attributes.NETWORKS, attributes.PORTS,"},{"line_number":63,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_131f026d","line":60,"in_reply_to":"ba15a1d1_e9cbac51","updated":"2015-09-17 02:54:52.000000000","message":"Thank you for review.Nice catch!","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"bf0a1cb0a17ce24914fc34bac3364c8dfd7aacc2","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        context \u003d ctxt.get_admin_context()"},{"line_number":74,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                resource_db \u003d self._get_by_id(context,"},{"line_number":77,"context_line":"                                              model_base.StandardAttribute, id)"},{"line_number":78,"context_line":"            except exc.NoResultFound:"},{"line_number":79,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_fca41a09","line":76,"updated":"2016-02-03 10:40:54.000000000","message":"this will not scale. _extend_ functions cannot do db lookups because that makes the number of DB queries for a list operation scale linearly with the number of results.\n\nYou should just be able to use resource_db.standard_attr.created_at directly","commit_id":"32c5d10bcfeeec4532135843d6e098d901c6f2c3"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"55c4c1371ddb204b416d2ff500c2d925cb1741ea","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        context \u003d ctxt.get_admin_context()"},{"line_number":74,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                resource_db \u003d self._get_by_id(context,"},{"line_number":77,"context_line":"                                              model_base.StandardAttribute, id)"},{"line_number":78,"context_line":"            except exc.NoResultFound:"},{"line_number":79,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_1cec96c6","line":76,"in_reply_to":"5a5ae5dd_fca41a09","updated":"2016-02-03 10:51:04.000000000","message":"Yeah , I very agree with you. I will remove these code according yours. It is true this code may raise the terrible problem when query many resources.","commit_id":"32c5d10bcfeeec4532135843d6e098d901c6f2c3"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.extensions import resourcetimestamp as rs"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"RESOURCE_MAP_MODEL \u003d {"},{"line_number":28,"context_line":"    \u0027port\u0027: models_v2.Port,"},{"line_number":29,"context_line":"    \u0027network\u0027: models_v2.Network,"},{"line_number":30,"context_line":"    \u0027subnet\u0027: models_v2.Subnet,"},{"line_number":31,"context_line":"    \u0027subnetpool\u0027: models_v2.SubnetPool"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_444afaad","line":28,"updated":"2016-02-04 09:48:24.000000000","message":"the models don\u0027t seem to be used anywhere. Maybe just make this a list and call it \u0027timestamp_enabled_resources\u0027?","commit_id":"35b0890e274823885d710df17d71d37d994ef562"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"}"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class ResourceTimeStamp_db_mixin(base_db.CommonDbMixin):"},{"line_number":36,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _get_resource(self, context, model, resource_id):"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_e4c76610","line":35,"updated":"2016-02-04 09:48:24.000000000","message":"This shouldn\u0027t need to inherit from commondbmixin.","commit_id":"35b0890e274823885d710df17d71d37d994ef562"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"class ResourceTimeStamp_db_mixin(base_db.CommonDbMixin):"},{"line_number":36,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _get_resource(self, context, model, resource_id):"},{"line_number":39,"context_line":"        try:"},{"line_number":40,"context_line":"            resource \u003d self._get_by_id(context, model, resource_id)"},{"line_number":41,"context_line":"        except exc.NoResultFound:"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_04cba21f","line":38,"updated":"2016-02-04 09:48:24.000000000","message":"This shouldn\u0027t be necessary, I don\u0027t see where it\u0027s used.","commit_id":"35b0890e274823885d710df17d71d37d994ef562"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"def subscribe():"},{"line_number":100,"context_line":"    r \u003d ResourceTimeStamp_db_mixin()"},{"line_number":101,"context_line":"    for resource in RESOURCE_MAP_MODEL.keys():"},{"line_number":102,"context_line":"        registry.subscribe(r.extend_timestamp_in_db, resource,"},{"line_number":103,"context_line":"                           events.CREATE_PRECOMMIT)"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_a4d16ecf","line":100,"updated":"2016-02-04 09:48:24.000000000","message":"having a separate object from the core plugin subscribed to these events when the core plugin also implements this mixin isn\u0027t a good idea because you have two different objects that are called depending on the operation.\n\nMove this into either a setup method of the mixin that the implementing plugin must call explicitly and then you can do registry.subscribe(self.extend_timestamp_in_db, ...) so the plugin is called. Either that or you can override the __init__ method and call it from there.\n\ndef __init__(self, *args, **kwargs):\n    for resource in RESOURCE_MAP_MODEL.keys():\n        ...\n\n    super(ResourceTimeStamp_db_mixin, self).__init__(*args, **kwargs)","commit_id":"35b0890e274823885d710df17d71d37d994ef562"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class ResourceTimeStamp_db_mixin(object):"},{"line_number":26,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        for resource in [attributes.NETWORK, attributes.PORT,"},{"line_number":30,"context_line":"                         attributes.SUBNET, attributes.SUBNETPOOL]:"},{"line_number":31,"context_line":"            registry.subscribe(self.extend_timestamp_in_db, resource,"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_c33ea48b","line":28,"updated":"2016-02-05 09:50:42.000000000","message":"for resource in rs.EXTENDED_ATTRIBUTES_2_0:","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c016b75aa0b0e7d61b3c127df6131b3340ce62ed","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class ResourceTimeStamp_db_mixin(object):"},{"line_number":26,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        for resource in [attributes.NETWORK, attributes.PORT,"},{"line_number":30,"context_line":"                         attributes.SUBNET, attributes.SUBNETPOOL]:"},{"line_number":31,"context_line":"            registry.subscribe(self.extend_timestamp_in_db, resource,"}],"source_content_type":"text/x-python","patch_set":56,"id":"3a57f1b5_91bb890e","line":28,"in_reply_to":"5a5ae5dd_03727c49","updated":"2016-02-10 05:52:31.000000000","message":"init methods in mixins can lead to weird MRO issues. I\u0027d stay away from it.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":25,"context_line":"class ResourceTimeStamp_db_mixin(object):"},{"line_number":26,"context_line":"    \"\"\"Mixin class to add Resource Time Stamp methods to db_base_plugin_v2.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    def __init__(self):"},{"line_number":29,"context_line":"        for resource in [attributes.NETWORK, attributes.PORT,"},{"line_number":30,"context_line":"                         attributes.SUBNET, attributes.SUBNETPOOL]:"},{"line_number":31,"context_line":"            registry.subscribe(self.extend_timestamp_in_db, resource,"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_03727c49","line":28,"in_reply_to":"5a5ae5dd_c33ea48b","updated":"2016-02-05 10:06:25.000000000","message":"OH, thanks a lot. I will update it.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if getattr(db_model, \u0027standard_attr\u0027, None):"},{"line_number":67,"context_line":"            self._update_timestamp(db_model.standard_attr)"},{"line_number":68,"context_line":"            context.session.add(db_model)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    for resources in [attributes.NETWORKS, attributes.PORTS,"},{"line_number":71,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"},{"line_number":72,"context_line":"        db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_633fb087","line":69,"updated":"2016-02-05 09:50:42.000000000","message":"for resource in rs.EXTENDED_ATTRIBUTES_2_0:","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        if getattr(db_model, \u0027standard_attr\u0027, None):"},{"line_number":67,"context_line":"            self._update_timestamp(db_model.standard_attr)"},{"line_number":68,"context_line":"            context.session.add(db_model)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    for resources in [attributes.NETWORKS, attributes.PORTS,"},{"line_number":71,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"},{"line_number":72,"context_line":"        db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_c3bd44b8","line":69,"in_reply_to":"5a5ae5dd_633fb087","updated":"2016-02-05 10:06:25.000000000","message":"Agree. I will update it.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"04bc29d6f1f1d5795758f801796352ae6b35c1bd","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    def update_timestamp(self, session, context, instances):"},{"line_number":38,"context_line":"        objs_list \u003d session.new.union(session.dirty)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        for i in range(len(objs_list)):"},{"line_number":41,"context_line":"            obj \u003d objs_list.pop()"},{"line_number":42,"context_line":"            if hasattr(obj, \u0027standard_attr\u0027) and obj.standard_attr_id:"},{"line_number":43,"context_line":"                obj.standard_attr.updated_at \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":59,"id":"dae33548_6b3e4ddb","line":40,"updated":"2016-02-17 06:26:43.000000000","message":"while objs_list:","commit_id":"b241e20fd80e7744528304e2b9c5a98f848a0ae6"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"04bc29d6f1f1d5795758f801796352ae6b35c1bd","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        if target.created_at and target.updated_at:"},{"line_number":64,"context_line":"            setattr(target, \u0027updated_at\u0027, timeutils.utcnow())"},{"line_number":65,"context_line":"            return target"},{"line_number":66,"context_line":"        time \u003d timeutils.utcnow()"},{"line_number":67,"context_line":"        for field in [\u0027created_at\u0027, \u0027updated_at\u0027]:"},{"line_number":68,"context_line":"            setattr(target, field, time)"},{"line_number":69,"context_line":"        return target"}],"source_content_type":"text/x-python","patch_set":59,"id":"dae33548_cb2799c8","line":66,"updated":"2016-02-17 06:26:43.000000000","message":"two different code paths that update \u0027updated_at\u0027. Should probably adjust this a bit:\n\ntime \u003d timeutils.utcnow()\nsetattr(target, \u0027updated_at\u0027, time)\nif not target.created_at:\n    setattr(target, \u0027created_at\u0027, time)\nreturn target","commit_id":"b241e20fd80e7744528304e2b9c5a98f848a0ae6"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"04bc29d6f1f1d5795758f801796352ae6b35c1bd","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"},{"line_number":77,"context_line":"        db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":78,"context_line":"            resources, [ResourceTimeStamp_db_mixin.get_instance()."},{"line_number":79,"context_line":"                        extend_resource_dict_timestamp])"}],"source_content_type":"text/x-python","patch_set":59,"id":"dae33548_ab24d5c4","line":79,"updated":"2016-02-17 06:26:43.000000000","message":"Since this is now written in a way that the timestamp code is completely isolated in the plugin, we don\u0027t really need to care if the core plugin supports this or not. Instead of checking with the core plugin, let\u0027s convert the class you have created in this module into a service plugin and then have it auto-load on startup using the change in Ia35e8a946bf0ac0bb085cde46b675d17b0bb2f51.\n\nUsing this method, support for timestamps can be added for free to all plugins that use the DB.","commit_id":"b241e20fd80e7744528304e2b9c5a98f848a0ae6"}],"neutron/db/standard_attr_common.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"9fd6f3b99e7b962e781222704580da73329e902f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"CONTAIN_STANDARD_ATTR_RESOURCE \u003d [\u0027port\u0027, \u0027network\u0027, \u0027subnet\u0027, \u0027subnetpool\u0027]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"RESOURCE_CHECK_MAP \u003d {}"},{"line_number":16,"context_line":"PROCESS \u003d \u0027process\u0027"}],"source_content_type":"text/x-python","patch_set":54,"id":"5a5ae5dd_64dcd6e4","line":13,"updated":"2016-02-04 09:48:24.000000000","message":"why is this being reduced. The others do have standard attributes","commit_id":"35b0890e274823885d710df17d71d37d994ef562"}],"neutron/db/timestamp_db.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"b8e1aaf0fcfd9ac7e597340b6564f6e36f85341d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from sqlalchemy import event"},{"line_number":17,"context_line":"from sqlalchemy.orm import session as se"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.db import model_base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TimeStamp_db_mixin(object):"}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_792ebd8c","line":19,"updated":"2016-02-18 17:34:00.000000000","message":"that\u0027s just me, but I\u0027d rather move this under neutron/services/timestamp. \n\nIt makes the whole thing more cohesive. Conversely from the extension, there\u0027s no good reason why all the db modules are in a single place. To me it\u0027s just confusing and difficult to search.","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"803c8283e5785b38f61eede8fc05757d76418384","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from sqlalchemy import event"},{"line_number":17,"context_line":"from sqlalchemy.orm import session as se"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron.db import model_base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TimeStamp_db_mixin(object):"}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_b0d3265f","line":19,"in_reply_to":"dae33548_792ebd8c","updated":"2016-02-19 02:18:43.000000000","message":"Thanks very much for kind suggestion. It is true this is difficult to search. I will move this to the place you said. I think you is correct. :-)","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"}],"neutron/extensions/resourcetimestamp.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"4be67a89b3cd23ece96591a381e3c830cd61e32c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \u0027networks\u0027: timestamp_body,"},{"line_number":40,"context_line":"    \u0027subnets\u0027: timestamp_body,"},{"line_number":41,"context_line":"    \u0027ports\u0027: timestamp_body,"},{"line_number":42,"context_line":"    \u0027subnetpools\u0027: timestamp_body,"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_9400a003","line":42,"updated":"2015-08-21 07:18:17.000000000","message":"Do we want to apply it for subnetpools?","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"d717f736d1dbf933d005dc027f40649c52672d77","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    \u0027networks\u0027: timestamp_body,"},{"line_number":40,"context_line":"    \u0027subnets\u0027: timestamp_body,"},{"line_number":41,"context_line":"    \u0027ports\u0027: timestamp_body,"},{"line_number":42,"context_line":"    \u0027subnetpools\u0027: timestamp_body,"},{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_e8381bd5","line":42,"in_reply_to":"fa1b9901_9400a003","updated":"2015-09-11 09:34:53.000000000","message":"I think this maybe useful, as many resources of neutron like router,port,subnet,network,floatingip,security_group may contains these timestamp fields.As create/update resources, the way to apply this change is through fanout message, we cannot ensure the message  is receviced by the receivers, so we could use  udpated_at to make it better.Thank you, if any issue I made, could please point it out for me?","commit_id":"954aafcea9354d599a258482cac88bcfd6a0fabb"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"dc0edbfe391bcd318b122f373272e72cd4cfce89","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Cisco Systems, Inc.  All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_1e4bfbb1","line":1,"updated":"2015-08-24 08:20:42.000000000","message":"incorrect copyright","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"b21afa8f6e8d6ab1b61d5298e02cdc74759de03a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2015 Cisco Systems, Inc.  All rights reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_367938fd","line":1,"in_reply_to":"fa1b9901_1e4bfbb1","updated":"2015-08-24 13:34:28.000000000","message":"Thanks for review.I will correct later","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"dc0edbfe391bcd318b122f373272e72cd4cfce89","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    This class is used by neutron\u0027s extension framework to"},{"line_number":48,"context_line":"    make resource time stamp about the port bindings available"},{"line_number":49,"context_line":"    to external applications."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    With admin rights one will be able to update and read the values."},{"line_number":52,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa1b9901_be30cf08","line":49,"updated":"2015-08-24 08:20:42.000000000","message":"I think the description should modify","commit_id":"b6811fc6be2e31135a587fc4bbad9010001a4b87"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_b9bc346d","line":1,"updated":"2015-08-25 07:24:16.000000000","message":"You can provide your company name over here.","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"404047375c550ca51cdeffaf49eb8c374acce9d9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class Resourcetimestamp(extensions.ExtensionDescriptor):"},{"line_number":45,"context_line":"    \"\"\"Extension class supporting resource time stamp."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    This class is used by neutron\u0027s extension framework to"},{"line_number":48,"context_line":"    make resource timestamp."},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f9586c58","line":47,"updated":"2015-08-25 07:24:16.000000000","message":"\"This class is used for adding time-stamps to neutron core resources.\"","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"9279b8aead050592ed59c69910fa0aac52d93d05","unresolved":false,"context_lines":[{"line_number":44,"context_line":"class Resourcetimestamp(extensions.ExtensionDescriptor):"},{"line_number":45,"context_line":"    \"\"\"Extension class supporting resource time stamp."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    This class is used by neutron\u0027s extension framework to"},{"line_number":48,"context_line":"    make resource timestamp."},{"line_number":49,"context_line":"    \"\"\""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_ac02ad07","line":47,"in_reply_to":"fa1b9901_f9586c58","updated":"2015-08-26 14:13:30.000000000","message":"Thank you for help!","commit_id":"968f83f91159a595a7275f216ae5289eab538435"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack HuaWei"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_0e06fb1c","line":1,"updated":"2015-08-30 04:51:33.000000000","message":"Huawei Technologies.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ResourceNotFound(nexception.NotFound):"},{"line_number":44,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_ce0b2323","line":43,"updated":"2015-08-30 04:51:33.000000000","message":"Have you used this calls anywhere?","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ebeebc21c363e95a630a488e8cccbaf473d87bf8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ResourceNotFound(nexception.NotFound):"},{"line_number":44,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_6445d815","line":43,"in_reply_to":"da20952f_ce0b2323","updated":"2015-09-02 03:56:13.000000000","message":"Thank you. I used it in _get_resource function of resourcetimestamp_db.py. Maybe it just used once. I followed others extension for make it.:(","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_description(cls):"},{"line_number":64,"context_line":"        return \"Expose the timestamp of a resource like port/subnet/network \" \\"},{"line_number":65,"context_line":"               \"to external application\""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_0e2d9b94","line":64,"updated":"2015-08-30 04:51:33.000000000","message":"This extension can be used for recording create/update timestamps for core resources like port/subnet/network/subnetpools.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"71dd17fa7567792dc27a75fa1b92554beb1f2262","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_description(cls):"},{"line_number":64,"context_line":"        return \"This extension can be used for recording\" \\"},{"line_number":65,"context_line":"               \"create/update timestamps for core resources \" \\"},{"line_number":66,"context_line":"               \"like port/subnet/network/subnetpools.\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_38ca721b","line":64,"updated":"2015-09-03 01:03:47.000000000","message":"missing space after recording","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_description(cls):"},{"line_number":64,"context_line":"        return \"This extension can be used for recording\" \\"},{"line_number":65,"context_line":"               \"create/update timestamps for core resources \" \\"},{"line_number":66,"context_line":"               \"like port/subnet/network/subnetpools.\""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_22b9d9cb","line":64,"in_reply_to":"da20952f_38ca721b","updated":"2015-09-03 04:45:51.000000000","message":"Thanks, I will rework it","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"71dd17fa7567792dc27a75fa1b92554beb1f2262","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_description(cls):"},{"line_number":64,"context_line":"        return \"This extension can be used for recording\" \\"},{"line_number":65,"context_line":"               \"create/update timestamps for core resources \" \\"},{"line_number":66,"context_line":"               \"like port/subnet/network/subnetpools.\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_18ee8e8b","line":65,"updated":"2015-09-03 01:03:47.000000000","message":"nit: preferably avoid using \\ for line continuity.. use parenthesis","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    @classmethod"},{"line_number":63,"context_line":"    def get_description(cls):"},{"line_number":64,"context_line":"        return \"This extension can be used for recording\" \\"},{"line_number":65,"context_line":"               \"create/update timestamps for core resources \" \\"},{"line_number":66,"context_line":"               \"like port/subnet/network/subnetpools.\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_c2afbd7b","line":65,"in_reply_to":"da20952f_18ee8e8b","updated":"2015-09-03 04:45:51.000000000","message":"Thanks, I will rework it","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"58bb2c97c5151a5cacdfa80ba5f3d62b7a040754","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Huawei Technologies."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"da20952f_f60c82ed","line":1,"updated":"2015-09-07 12:00:43.000000000","message":"You can just have your company name. Remove OpenStack.","commit_id":"428c441beb605b98f3c58415a8a93b6f1ca465fb"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":26,"context_line":"updated_timestamp \u003d \u0027updated_at\u0027"},{"line_number":27,"context_line":"timestamp_body \u003d {"},{"line_number":28,"context_line":"    created_timestamp: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: timeutils.utcnow()"},{"line_number":30,"context_line":"                        },"},{"line_number":31,"context_line":"    updated_timestamp: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_a94a94c3","line":29,"updated":"2015-09-16 08:59:52.000000000","message":"these utcnow() would be evaluated when imported.\ni guess it isn\u0027t what you want. :-)","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"updated_timestamp \u003d \u0027updated_at\u0027"},{"line_number":27,"context_line":"timestamp_body \u003d {"},{"line_number":28,"context_line":"    created_timestamp: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":29,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: timeutils.utcnow()"},{"line_number":30,"context_line":"                        },"},{"line_number":31,"context_line":"    updated_timestamp: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":32,"context_line":"                        \u0027is_visible\u0027: True, \u0027default\u0027: timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_93c31289","line":29,"in_reply_to":"ba15a1d1_a94a94c3","updated":"2015-09-17 02:54:52.000000000","message":"Thanks for review. Yeah, it is. It may be set as None. Nice catch, thanks!","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"e1111da0cc0b4537845be35c63b26c720c76d1ba","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ResourceNotFound(nexception.NotFound):"},{"line_number":44,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class Resourcetimestamp(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_e9f96c81","line":44,"updated":"2015-09-16 08:59:52.000000000","message":"is this special exception necessary?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"faafa284607025b16e7dee2e9abbd303747fa20b","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class ResourceNotFound(nexception.NotFound):"},{"line_number":44,"context_line":"    message \u003d _(\"Resource %(resource_id)s could not be found\")"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class Resourcetimestamp(extensions.ExtensionDescriptor):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba15a1d1_d3a18a47","line":44,"in_reply_to":"ba15a1d1_e9f96c81","updated":"2015-09-17 02:54:52.000000000","message":"This exception is used by _get_resource function in neutron/db/resourcetimestamp_db.py . It is used for get info from db. If the process hit error, this exception will raise.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9317ffd3430eedf88179c4dbe0ec01df24e4cbc4","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def get_description(cls):"},{"line_number":63,"context_line":"        return (\"This extension can be used for recording\""},{"line_number":64,"context_line":"                \"create/update timestamps for core resources \""},{"line_number":65,"context_line":"                \"like port/subnet/network/subnetpools.\")"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1a26ad4f_05e00bf9","line":63,"updated":"2015-11-03 04:40:56.000000000","message":"missing spaces at the end of the line","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"752cb964b742312a528b1ea3d323db02a0b00405","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def get_description(cls):"},{"line_number":63,"context_line":"        return (\"This extension can be used for recording\""},{"line_number":64,"context_line":"                \"create/update timestamps for core resources \""},{"line_number":65,"context_line":"                \"like port/subnet/network/subnetpools.\")"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1a26ad4f_16911f47","line":63,"in_reply_to":"1a26ad4f_05e00bf9","updated":"2015-11-03 07:12:54.000000000","message":"Thanks for correct.","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"}],"neutron/extensions/timestamp.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"35e911e78d24ea45fa4fa3aaee70ab4184da5cf5","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_alias(cls):"},{"line_number":49,"context_line":"        return \"timestamp\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @classmethod"},{"line_number":52,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_1c4758bc","line":49,"updated":"2016-03-02 05:06:13.000000000","message":"Since you don\u0027t expose the timestamp attribute to other resources like router, secgroup, etc, this should probably be called \u0027timestamp_core\u0027?","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"2e028b107328834d0feadd8a73fddd3f1ab31395","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_alias(cls):"},{"line_number":49,"context_line":"        return \"timestamp\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @classmethod"},{"line_number":52,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_0fced159","line":49,"in_reply_to":"7af24918_1c4758bc","updated":"2016-03-02 16:07:50.000000000","message":"I am OK with leaving it as \u0027timestamp\u0027 and allowing us to eventually expand to all resources without needing to change the alias.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc703c5cb742b453a5099ce2a785d08beac72ac0","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"},{"line_number":59,"context_line":"        return \"2015-08-11T10:00:00-00:00\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_extended_resources(self, version):"},{"line_number":62,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_9ce36533","line":59,"updated":"2016-03-02 06:13:26.000000000","message":"2016?","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"62de47b43b9962adf3e6705766426e16b25d2c16","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @classmethod"},{"line_number":58,"context_line":"    def get_updated(cls):"},{"line_number":59,"context_line":"        return \"2015-08-11T10:00:00-00:00\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_extended_resources(self, version):"},{"line_number":62,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_dc1b2d7f","line":59,"in_reply_to":"7af24918_9ce36533","updated":"2016-03-02 06:37:25.000000000","message":"@garyk, oh thanks , I forget to change it.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"class Timestamp(extensions.ExtensionDescriptor):"},{"line_number":37,"context_line":"    \"\"\"Extension class supporting timestamp."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    This class is used by neutron\u0027s extension framework for adding time-stamps"},{"line_number":40,"context_line":"    to neutron core resources."},{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"7af24918_cb105604","line":39,"updated":"2016-03-02 17:10:11.000000000","message":"timestamp is one word","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"}],"neutron/extensions/timestamp_core.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e8b29f95a1f4e8042ffb2fa70f22b7d7b362065c","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_alias(cls):"},{"line_number":49,"context_line":"        return \"timestamp-core\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @classmethod"},{"line_number":52,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":89,"id":"7af24918_bc9d330c","line":49,"updated":"2016-03-03 04:02:14.000000000","message":"this should be timestamp_core. It\u0027s probably safe to use a string literal at this point.","commit_id":"568ff038f188985bfd4f3883a27991a043b726d8"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"5fb68e612f5926cf6f87ec03add71ba8667d28aa","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @classmethod"},{"line_number":48,"context_line":"    def get_alias(cls):"},{"line_number":49,"context_line":"        return \"timestamp-core\""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @classmethod"},{"line_number":52,"context_line":"    def get_description(cls):"}],"source_content_type":"text/x-python","patch_set":89,"id":"7af24918_9f44a91b","line":49,"in_reply_to":"7af24918_bc9d330c","updated":"2016-03-03 04:15:05.000000000","message":"@Armando, thanks, I will update it.","commit_id":"568ff038f188985bfd4f3883a27991a043b726d8"}],"neutron/ipam/subnet_alloc.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self._read_id(subnetpool)"},{"line_number":226,"context_line":"        self._read_prefix_bounds(subnetpool)"},{"line_number":227,"context_line":"        self._read_attrs(subnetpool,"},{"line_number":228,"context_line":"                         [\u0027tenant_id\u0027, \u0027name\u0027, \u0027shared\u0027, \u0027updated_at\u0027,"},{"line_number":229,"context_line":"                          \u0027created_at\u0027])"},{"line_number":230,"context_line":"        self._read_address_scope(subnetpool)"},{"line_number":231,"context_line":"        self.subnetpool \u003d {\u0027id\u0027: self.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_8e39abd9","line":228,"updated":"2015-08-30 04:51:33.000000000","message":"plz put \u0027created_at\u0027 before \u0027updated_at\u0027","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"ebeebc21c363e95a630a488e8cccbaf473d87bf8","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        self._read_id(subnetpool)"},{"line_number":226,"context_line":"        self._read_prefix_bounds(subnetpool)"},{"line_number":227,"context_line":"        self._read_attrs(subnetpool,"},{"line_number":228,"context_line":"                         [\u0027tenant_id\u0027, \u0027name\u0027, \u0027shared\u0027, \u0027updated_at\u0027,"},{"line_number":229,"context_line":"                          \u0027created_at\u0027])"},{"line_number":230,"context_line":"        self._read_address_scope(subnetpool)"},{"line_number":231,"context_line":"        self.subnetpool \u003d {\u0027id\u0027: self.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_24c7e046","line":228,"in_reply_to":"da20952f_8e39abd9","updated":"2015-09-02 03:56:13.000000000","message":"OK.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"71dd17fa7567792dc27a75fa1b92554beb1f2262","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import math"},{"line_number":18,"context_line":"import operator"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_5893a6fa","line":16,"updated":"2015-09-03 01:03:47.000000000","message":"unused import","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import math"},{"line_number":18,"context_line":"import operator"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_e2b201e5","line":16,"in_reply_to":"da20952f_5893a6fa","updated":"2015-09-03 04:45:51.000000000","message":"Thanks. This is my mistake","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"cd375b6656242531e0176210b14a8aa0f8c6eb82","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import datetime"},{"line_number":17,"context_line":"import math"},{"line_number":18,"context_line":"import operator"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_201c70c0","line":16,"in_reply_to":"da20952f_e2b201e5","updated":"2015-09-03 06:37:47.000000000","message":"+1","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"7b24abd8b4cd6c18354f58ee9fcbc3d6ac42bc01","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"                self._process_create_allowed_address_pairs("},{"line_number":1005,"context_line":"                    context, result,"},{"line_number":1006,"context_line":"                    attrs.get(addr_pair.ADDRESS_PAIRS)))"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"            self._process_port_create_extra_dhcp_opts(context, result,"},{"line_number":1009,"context_line":"                                                      dhcp_opts)"},{"line_number":1010,"context_line":"            self._process_timestamp_extension(context, result, port)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_e6a0cba1","line":1007,"updated":"2015-08-28 09:39:20.000000000","message":"remove unnecessary change","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"c7ef433042431931efbe092a3e9f0fd890e0f3cc","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"                self._process_create_allowed_address_pairs("},{"line_number":1005,"context_line":"                    context, result,"},{"line_number":1006,"context_line":"                    attrs.get(addr_pair.ADDRESS_PAIRS)))"},{"line_number":1007,"context_line":""},{"line_number":1008,"context_line":"            self._process_port_create_extra_dhcp_opts(context, result,"},{"line_number":1009,"context_line":"                                                      dhcp_opts)"},{"line_number":1010,"context_line":"            self._process_timestamp_extension(context, result, port)"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_da8e9378","line":1007,"in_reply_to":"da20952f_e6a0cba1","updated":"2015-08-29 00:34:46.000000000","message":"Thanks for review.Agree","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"13030e3c167dc9efbc286cc8817e4c78ddea67cb","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.type_manager.extend_network_dict_provider(context, result)"},{"line_number":623,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":624,"context_line":"                                                         result)"},{"line_number":625,"context_line":"            self._process_timestamp_extension(context, result, network)"},{"line_number":626,"context_line":"            self.mechanism_manager.create_network_precommit(mech_context)"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"            if net_data.get(api.MTU, 0) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_29bea7ff","line":625,"updated":"2015-09-02 23:50:58.000000000","message":"I suggest to pass attributes.NETWORK instead of network here.","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":7018,"name":"Abhishek Raut","email":"rauta@vmware.com","username":"abhiraut"},"change_message_id":"71dd17fa7567792dc27a75fa1b92554beb1f2262","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.type_manager.extend_network_dict_provider(context, result)"},{"line_number":623,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":624,"context_line":"                                                         result)"},{"line_number":625,"context_line":"            self._process_timestamp_extension(context, result, network)"},{"line_number":626,"context_line":"            self.mechanism_manager.create_network_precommit(mech_context)"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"            if net_data.get(api.MTU, 0) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_d89ed606","line":625,"in_reply_to":"da20952f_29bea7ff","updated":"2015-09-03 01:03:47.000000000","message":"+1","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"31979e1eeedfd164bbb4b5b4de7a52c7be00d674","unresolved":false,"context_lines":[{"line_number":622,"context_line":"            self.type_manager.extend_network_dict_provider(context, result)"},{"line_number":623,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":624,"context_line":"                                                         result)"},{"line_number":625,"context_line":"            self._process_timestamp_extension(context, result, network)"},{"line_number":626,"context_line":"            self.mechanism_manager.create_network_precommit(mech_context)"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"            if net_data.get(api.MTU, 0) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_42c40d3f","line":625,"in_reply_to":"da20952f_d89ed606","updated":"2015-09-03 04:45:51.000000000","message":"Good Suggestion!","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"13030e3c167dc9efbc286cc8817e4c78ddea67cb","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"                    attrs.get(addr_pair.ADDRESS_PAIRS)))"},{"line_number":1022,"context_line":"            self._process_port_create_extra_dhcp_opts(context, result,"},{"line_number":1023,"context_line":"                                                      dhcp_opts)"},{"line_number":1024,"context_line":"            self._process_timestamp_extension(context, result, port)"},{"line_number":1025,"context_line":"            self.mechanism_manager.create_port_precommit(mech_context)"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"        return result, mech_context"}],"source_content_type":"text/x-python","patch_set":12,"id":"da20952f_a9407708","line":1024,"updated":"2015-09-02 23:50:58.000000000","message":"I suggest to pass attributes.PORT instead of port here.","commit_id":"e6eb0ebf9d6ebf1ecdc04df68de249236c11683c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"1635630e6e2da04b8eb2083ea0393524b34221cb","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            self.type_manager.extend_network_dict_provider(context, result)"},{"line_number":637,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":638,"context_line":"                                                         result)"},{"line_number":639,"context_line":"            self._process_timestamp_extension(context, result,"},{"line_number":640,"context_line":"                                              attributes.NETWORK)"},{"line_number":641,"context_line":"            self.mechanism_manager.create_network_precommit(mech_context)"},{"line_number":642,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1a26ad4f_a5603702","line":639,"updated":"2015-11-03 05:04:57.000000000","message":"Thanks for review. I know this may cause some question here. The situation here: 1. the result from create_network in L629 will returned the info which won\u0027t contain the timestamp. As the _make_network_dict and _make_port_dict pass process_extensions\u003dFalse. Based on the timestamp as an extension, so the result won\u0027t contain the timestamp fields.\n2. But subnet and subnetpool resource didn\u0027t specify the process_extensions to False, they should contain the timestamp base on \nif process_extensions:\n            self._apply_dict_extend_functions()\nThanks.","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"9317ffd3430eedf88179c4dbe0ec01df24e4cbc4","unresolved":false,"context_lines":[{"line_number":636,"context_line":"            self.type_manager.extend_network_dict_provider(context, result)"},{"line_number":637,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":638,"context_line":"                                                         result)"},{"line_number":639,"context_line":"            self._process_timestamp_extension(context, result,"},{"line_number":640,"context_line":"                                              attributes.NETWORK)"},{"line_number":641,"context_line":"            self.mechanism_manager.create_network_precommit(mech_context)"},{"line_number":642,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"1a26ad4f_e5b14f02","line":639,"updated":"2015-11-03 04:40:56.000000000","message":"i have a problem with this. it means that every plugin will need to make the changes.\nis there no way of keeping this code self contained in the base plugin which everyone inherits?","commit_id":"d0c5d5aef0fde2ad064e6bdfa7164e2e33cddc01"}],"neutron/services/timestamp/timestamp_plugin.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"7035bc50b5a3ae74ed51074c30a63a4caecae72f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    \"\"\"Implements Neutron Timestamp Service plugin.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    supported_extension_aliases \u003d [\u0027timestamp\u0027]"},{"line_number":26,"context_line":"    ts_db.TimeStamp_db_mixin.get_instance().register_db_events()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    for resources in [attributes.NETWORKS, attributes.PORTS,"},{"line_number":29,"context_line":"                      attributes.SUBNETS, attributes.SUBNETPOOLS]:"}],"source_content_type":"text/x-python","patch_set":63,"id":"dae33548_7bc4df5e","line":26,"updated":"2016-02-19 02:43:25.000000000","message":"Move L26-L32 into an __init__ function here in the plugin. Then you can get rid of the get_instance stuff in the mixin since you will just be subscribing \u0027self.extend_resource_dict_timestamp\u0027. It will also make sure that if someone has another plugin offering this functionality and the service plugin is disabled it won\u0027t subscribe this stuff.","commit_id":"c058305b8d4dc0bb8dedece2426c2753e93973ae"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"f99bf82509b18556542c44a74f51c6527895415c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    supported_extension_aliases \u003d [\u0027timestamp\u0027]"},{"line_number":26,"context_line":"    _instance \u003d None"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @classmethod"},{"line_number":29,"context_line":"    def get_instance(cls):"},{"line_number":30,"context_line":"        if cls._instance is None:"},{"line_number":31,"context_line":"            cls._instance \u003d cls()"}],"source_content_type":"text/x-python","patch_set":84,"id":"9aed3d3a_ffdbf279","line":28,"updated":"2016-03-01 06:59:11.000000000","message":"When this is a plugin, this won\u0027t be used the way you think. The service loading framework is just going to call __init__ below so an instance will be created without populating cls._instance.\n\nI don\u0027t think this singleton pattern is necessary in this case. Just remove the get_instance method and then in the one place you call it in the addCleanup function, do a lookup of the timestamp service plugin via neutron.Manager.get_service_plugins().","commit_id":"12aa2bf67e286e9a3eda165bd7444d47c35e9a78"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"bc703c5cb742b453a5099ce2a785d08beac72ac0","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        return \u0027timestamp\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_description(self):"},{"line_number":39,"context_line":"        return \"Neutron add timestamp manage plugin\""}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_bc5621d0","line":39,"updated":"2016-03-02 06:13:26.000000000","message":"This does not really make sense\n\nConsider:\n\"Neutron core resource timestamp support\"","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"62de47b43b9962adf3e6705766426e16b25d2c16","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        return \u0027timestamp\u0027"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def get_plugin_description(self):"},{"line_number":39,"context_line":"        return \"Neutron add timestamp manage plugin\""}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_3c45f16f","line":39,"in_reply_to":"7af24918_bc5621d0","updated":"2016-03-02 06:37:25.000000000","message":"@garyk, thanks very much for your suggesion, that will make it sense .","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"}],"neutron/tests/api/test_resource_timestamp.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def _check_timestamp_need_added(cls, resource):"},{"line_number":50,"context_line":"        if set([\u0027created_at\u0027, \u0027updated_at\u0027]).issubset(set(resource.keys())):"},{"line_number":51,"context_line":"            return"},{"line_number":52,"context_line":"        else:"},{"line_number":53,"context_line":"            msg \u003d \"Core Plugin not support resource timestamp.\""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_83442c1b","line":50,"updated":"2016-02-05 09:50:42.000000000","message":"This is risky because if there is a regression where one of these is removed from the API response due to a bug, these tests will all be skipped instead of failing. I think it would be safer to check that \u0027resource_timestamp\u0027 is visisble in the extension list API call.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def _check_timestamp_need_added(cls, resource):"},{"line_number":50,"context_line":"        if set([\u0027created_at\u0027, \u0027updated_at\u0027]).issubset(set(resource.keys())):"},{"line_number":51,"context_line":"            return"},{"line_number":52,"context_line":"        else:"},{"line_number":53,"context_line":"            msg \u003d \"Core Plugin not support resource timestamp.\""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_e37f20a9","line":50,"in_reply_to":"5a5ae5dd_83442c1b","updated":"2016-02-05 10:06:25.000000000","message":"Yeah, good suggestion. I will make it forward.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @test.idempotent_id(\u0027462be770-b310-4df9-9c42-773217e4c8b1\u0027)"},{"line_number":57,"context_line":"    def test_create_network_with_timestamp(self):"},{"line_number":58,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":59,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":60,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":61,"context_line":"        self.assertIsNotNone(ext_network[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_234e983b","line":58,"updated":"2016-02-05 09:50:42.000000000","message":"just \u0027network\u0027 should be okay. this isn\u0027t an external network test","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    @test.idempotent_id(\u0027462be770-b310-4df9-9c42-773217e4c8b1\u0027)"},{"line_number":57,"context_line":"    def test_create_network_with_timestamp(self):"},{"line_number":58,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":59,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":60,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":61,"context_line":"        self.assertIsNotNone(ext_network[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_0354bc1e","line":58,"in_reply_to":"5a5ae5dd_234e983b","updated":"2016-02-05 10:06:25.000000000","message":"Sorry. I will correct all of them","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":59,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":60,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":61,"context_line":"        self.assertIsNotNone(ext_network[\u0027id\u0027])"},{"line_number":62,"context_line":"        self.assertIsNotNone(ext_network[\u0027created_at\u0027])"},{"line_number":63,"context_line":"        self.assertIsNotNone(ext_network[\u0027updated_at\u0027])"},{"line_number":64,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_434b942a","line":61,"updated":"2016-02-05 09:50:42.000000000","message":"this assert isn\u0027t necessary, we have other tests that make sure the API server returns a network with an ID. :)","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @test.idempotent_id(\u00274db5417a-e11c-474d-a361-af00ebef57c5\u0027)"},{"line_number":66,"context_line":"    def test_update_network_with_timestamp(self):"},{"line_number":67,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":68,"context_line":"        origin_updated_at \u003d ext_network[\u0027updated_at\u0027]"},{"line_number":69,"context_line":"        update_body \u003d {\u0027name\u0027: ext_network[\u0027name\u0027] + \u0027new\u0027}"},{"line_number":70,"context_line":"        body \u003d self.admin_client.update_network(ext_network[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_e353a0e0","line":67,"updated":"2016-02-05 09:50:42.000000000","message":"same for all of these with \u0027ext_network\u0027","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        updated_network \u003d body[\u0027network\u0027]"},{"line_number":74,"context_line":"        new_updated_at \u003d updated_network[\u0027updated_at\u0027]"},{"line_number":75,"context_line":"        # Verify that origin_updated_at is not same with new_updated_at"},{"line_number":76,"context_line":"        self.assertIsNot(origin_updated_at, new_updated_at)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @test.idempotent_id(\u00272ac50ab2-7ebd-4e27-b3ce-a9e399faaea2\u0027)"},{"line_number":79,"context_line":"    def test_show_networks_attribute_with_timestamp(self):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_03511cd8","line":76,"updated":"2016-02-05 09:50:42.000000000","message":"can we check to make sure that the timestamp went forward in time?","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        updated_network \u003d body[\u0027network\u0027]"},{"line_number":74,"context_line":"        new_updated_at \u003d updated_network[\u0027updated_at\u0027]"},{"line_number":75,"context_line":"        # Verify that origin_updated_at is not same with new_updated_at"},{"line_number":76,"context_line":"        self.assertIsNot(origin_updated_at, new_updated_at)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @test.idempotent_id(\u00272ac50ab2-7ebd-4e27-b3ce-a9e399faaea2\u0027)"},{"line_number":79,"context_line":"    def test_show_networks_attribute_with_timestamp(self):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_66a33e01","line":76,"in_reply_to":"5a5ae5dd_03511cd8","updated":"2016-02-05 10:06:25.000000000","message":"That maybe a nice idea. I will try.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":83,"context_line":"        show_ext_net \u003d body[\u0027network\u0027]"},{"line_number":84,"context_line":"        # verify the timestamp from creation and showed is same"},{"line_number":85,"context_line":"        self.assertEqual(ext_network[\u0027name\u0027], show_ext_net[\u0027name\u0027])"},{"line_number":86,"context_line":"        self.assertEqual(ext_network[\u0027id\u0027], show_ext_net[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.assertEqual(ext_network[\u0027created_at\u0027],"},{"line_number":88,"context_line":"                         show_ext_net[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_a36048a6","line":85,"updated":"2016-02-05 09:50:42.000000000","message":"no need to compare the IDs or names here. If the server can\u0027t return the network you requested, other tests will fail.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":83,"context_line":"        show_ext_net \u003d body[\u0027network\u0027]"},{"line_number":84,"context_line":"        # verify the timestamp from creation and showed is same"},{"line_number":85,"context_line":"        self.assertEqual(ext_network[\u0027name\u0027], show_ext_net[\u0027name\u0027])"},{"line_number":86,"context_line":"        self.assertEqual(ext_network[\u0027id\u0027], show_ext_net[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.assertEqual(ext_network[\u0027created_at\u0027],"},{"line_number":88,"context_line":"                         show_ext_net[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_8623daa6","line":85,"in_reply_to":"5a5ae5dd_a36048a6","updated":"2016-02-05 10:06:25.000000000","message":"Thanks for suggestion.:-)","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def test_create_subnet_with_timestamp(self):"},{"line_number":94,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":95,"context_line":"        ext_subnet \u003d self.create_subnet(ext_network)"},{"line_number":96,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":97,"context_line":"        self.addCleanup(self.admin_client.delete_subnet, ext_subnet[\u0027id\u0027])"},{"line_number":98,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":99,"context_line":"        self.assertIsNotNone(ext_subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_c36544b5","line":96,"updated":"2016-02-05 09:50:42.000000000","message":"all of the subnets and networks created with create_network and create_subnet should automatically be added to a list of resources to be cleaned up at the end of the test so none of these cleanup calls should be necessary","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":93,"context_line":"    def test_create_subnet_with_timestamp(self):"},{"line_number":94,"context_line":"        ext_network \u003d self.create_network()"},{"line_number":95,"context_line":"        ext_subnet \u003d self.create_subnet(ext_network)"},{"line_number":96,"context_line":"        self.addCleanup(self.admin_client.delete_network, ext_network[\u0027id\u0027])"},{"line_number":97,"context_line":"        self.addCleanup(self.admin_client.delete_subnet, ext_subnet[\u0027id\u0027])"},{"line_number":98,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":99,"context_line":"        self.assertIsNotNone(ext_subnet[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_860c3a3c","line":96,"in_reply_to":"5a5ae5dd_c36544b5","updated":"2016-02-05 10:06:25.000000000","message":"Agree. I will add them.","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        self.addCleanup(self.admin_client.delete_subnet, ext_subnet[\u0027id\u0027])"},{"line_number":125,"context_line":"        show_ext_subnet \u003d body[\u0027subnet\u0027]"},{"line_number":126,"context_line":"        # verify the timestamp from creation and showed is same"},{"line_number":127,"context_line":"        self.assertEqual(ext_subnet[\u0027name\u0027], show_ext_subnet[\u0027name\u0027])"},{"line_number":128,"context_line":"        self.assertEqual(ext_subnet[\u0027id\u0027], show_ext_subnet[\u0027id\u0027])"},{"line_number":129,"context_line":"        self.assertEqual(ext_subnet[\u0027created_at\u0027],"},{"line_number":130,"context_line":"                         show_ext_subnet[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_6356d0cf","line":127,"updated":"2016-02-05 09:50:42.000000000","message":"no name or id comparison","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        self.addCleanup(self.admin_client.delete_subnet, ext_subnet[\u0027id\u0027])"},{"line_number":141,"context_line":"        self.addCleanup(self.admin_client.delete_port, ext_port[\u0027id\u0027])"},{"line_number":142,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":143,"context_line":"        self.assertIsNotNone(ext_port[\u0027id\u0027])"},{"line_number":144,"context_line":"        self.assertIsNotNone(ext_port[\u0027created_at\u0027])"},{"line_number":145,"context_line":"        self.assertIsNotNone(ext_port[\u0027updated_at\u0027])"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_835bccf5","line":143,"updated":"2016-02-05 09:50:42.000000000","message":"no id check","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        updated_port \u003d body[\u0027port\u0027]"},{"line_number":160,"context_line":"        new_updated_at \u003d updated_port[\u0027updated_at\u0027]"},{"line_number":161,"context_line":"        # Verify that origin_updated_at is not same with new_updated_at"},{"line_number":162,"context_line":"        self.assertIsNot(origin_updated_at, new_updated_at)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @test.idempotent_id(\u0027584c6723-40b6-4f26-81dd-f508f9d9fb51\u0027)"},{"line_number":165,"context_line":"    def test_show_port_attribute_with_timestamp(self):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_23753863","line":162,"updated":"2016-02-05 09:50:42.000000000","message":"in these update tests it would be a good idea to also ensure that the created_at timestamp is not modified","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"722ba06761d3739843fe8d64138325d0ab674585","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        updated_port \u003d body[\u0027port\u0027]"},{"line_number":160,"context_line":"        new_updated_at \u003d updated_port[\u0027updated_at\u0027]"},{"line_number":161,"context_line":"        # Verify that origin_updated_at is not same with new_updated_at"},{"line_number":162,"context_line":"        self.assertIsNot(origin_updated_at, new_updated_at)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    @test.idempotent_id(\u0027584c6723-40b6-4f26-81dd-f508f9d9fb51\u0027)"},{"line_number":165,"context_line":"    def test_show_port_attribute_with_timestamp(self):"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_23053845","line":162,"in_reply_to":"5a5ae5dd_23753863","updated":"2016-02-05 10:06:25.000000000","message":"Agree. That is a good idea","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self.addCleanup(self.admin_client.delete_port, ext_port[\u0027id\u0027])"},{"line_number":173,"context_line":"        show_ext_port \u003d body[\u0027port\u0027]"},{"line_number":174,"context_line":"        # verify the timestamp from creation and showed is same"},{"line_number":175,"context_line":"        self.assertEqual(ext_port[\u0027name\u0027], show_ext_port[\u0027name\u0027])"},{"line_number":176,"context_line":"        self.assertEqual(ext_port[\u0027id\u0027], show_ext_port[\u0027id\u0027])"},{"line_number":177,"context_line":"        self.assertEqual(ext_port[\u0027created_at\u0027],"},{"line_number":178,"context_line":"                         show_ext_port[\u0027created_at\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_4372b47c","line":175,"updated":"2016-02-05 09:50:42.000000000","message":"no name or id check","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1066f0724ada97c12e4732ca75887c311626d760","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        ext_sp \u003d self._create_subnetpool()"},{"line_number":185,"context_line":"        self.addCleanup(self.admin_client.delete_subnetpool, ext_sp[\u0027id\u0027])"},{"line_number":186,"context_line":"        # Verifies body contains timestamp fields"},{"line_number":187,"context_line":"        self.assertIsNotNone(ext_sp[\u0027id\u0027])"},{"line_number":188,"context_line":"        self.assertIsNotNone(ext_sp[\u0027created_at\u0027])"},{"line_number":189,"context_line":"        self.assertIsNotNone(ext_sp[\u0027updated_at\u0027])"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"5a5ae5dd_e36ac080","line":187,"updated":"2016-02-05 09:50:42.000000000","message":"no id check","commit_id":"ef069be82d98c278fdcee3a34011fd2f2a1cadb5"}],"neutron/tests/api/test_timestamp.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.tests.api import base"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TimeStampTestJSON(base.BaseAdminNetworkTest):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    ## attributes for subnetpool"},{"line_number":24,"context_line":"    min_prefixlen \u003d \u002728\u0027"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_a62571ac","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":23},"updated":"2016-03-02 04:52:32.000000000","message":"Nit: can name it just TestTimeStamp","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"62de47b43b9962adf3e6705766426e16b25d2c16","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.tests.api import base"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class TimeStampTestJSON(base.BaseAdminNetworkTest):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    ## attributes for subnetpool"},{"line_number":24,"context_line":"    min_prefixlen \u003d \u002728\u0027"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_f6c72810","line":21,"range":{"start_line":21,"start_character":6,"end_line":21,"end_character":23},"in_reply_to":"7af24918_a62571ac","updated":"2016-03-02 06:37:25.000000000","message":"@Henry, thanks very much, I will update this by these comments below.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    min_prefixlen \u003d \u002728\u0027"},{"line_number":25,"context_line":"    max_prefixlen \u003d \u002731\u0027"},{"line_number":26,"context_line":"    _ip_version \u003d 4"},{"line_number":27,"context_line":"    subnet_cidr \u003d u\u002710.11.12.0/31\u0027"},{"line_number":28,"context_line":"    new_prefix \u003d u\u002710.11.15.0/24\u0027"},{"line_number":29,"context_line":"    larger_prefix \u003d u\u002710.11.0.0/16\u0027"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_41abb71d","line":27,"range":{"start_line":27,"start_character":18,"end_line":27,"end_character":19},"updated":"2016-03-02 04:52:32.000000000","message":"Nit: don\u0027t unicode all the strings","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def resource_setup(cls):"},{"line_number":40,"context_line":"        super(TestTimeStamp, cls).resource_setup()"},{"line_number":41,"context_line":"        cls._check_timestamp_in_extensions()"},{"line_number":42,"context_line":"        prefixes \u003d [\u002710.11.12.0/24\u0027]"},{"line_number":43,"context_line":"        cls._subnetpool_data \u003d {\u0027min_prefixlen\u0027: \u002729\u0027, \u0027prefixes\u0027: prefixes}"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"7af24918_b048d988","line":41,"updated":"2016-03-02 17:10:11.000000000","message":"you should use skip_checks instead. Please read:\n\nhttps://github.com/openstack/tempest/blob/master/tempest/test.py#L204","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    @classmethod"},{"line_number":46,"context_line":"    def _check_timestamp_in_extensions(cls):"},{"line_number":47,"context_line":"        exts \u003d cls.client.list_extensions()"},{"line_number":48,"context_line":"        for ext in exts[\u0027extensions\u0027]:"},{"line_number":49,"context_line":"            if ext[\u0027alias\u0027] \u003d\u003d \u0027timestamp\u0027:"},{"line_number":50,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":88,"id":"7af24918_6b03020e","line":47,"updated":"2016-03-02 17:10:11.000000000","message":"this should use the other check on extensions like all the other API tests do. There\u0027s no need to actively look into the extension list.","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        for ext in exts[\u0027extensions\u0027]:"},{"line_number":49,"context_line":"            if ext[\u0027alias\u0027] \u003d\u003d \u0027timestamp\u0027:"},{"line_number":50,"context_line":"                return"},{"line_number":51,"context_line":"        msg \u003d \"Core Plugin not support timestamp.\""},{"line_number":52,"context_line":"        raise cls.skipException(msg)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @test.idempotent_id(\u0027462be770-b310-4df9-9c42-773217e4c8b1\u0027)"}],"source_content_type":"text/x-python","patch_set":88,"id":"7af24918_2b1a9a6e","line":51,"updated":"2016-03-02 17:10:11.000000000","message":"this is not technically a core plugin feature, is it?","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"}],"neutron/tests/unit/db/test_db_base_plugin_v2.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":5495,"context_line":"        actual_repr_output \u003d repr(network)"},{"line_number":5496,"context_line":"        exp_start_with \u003d \"\u003cneutron.db.models_v2.Network\""},{"line_number":5497,"context_line":"        exp_middle \u003d \"[object at %x]\" % id(network)"},{"line_number":5498,"context_line":"        exp_end_with \u003d (\" {created_at\u003dNone, updated_at\u003dNone, \""},{"line_number":5499,"context_line":"                        \"tenant_id\u003dNone, id\u003dNone, \""},{"line_number":5500,"context_line":"                        \"name\u003d\u0027net_net\u0027, status\u003d\u0027OK\u0027, \""},{"line_number":5501,"context_line":"                        \"admin_state_up\u003dTrue, mtu\u003dNone, \""}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_8cea1cab","line":5498,"updated":"2015-09-29 13:24:55.000000000","message":"Please add new attributes at the end.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":5495,"context_line":"        actual_repr_output \u003d repr(network)"},{"line_number":5496,"context_line":"        exp_start_with \u003d \"\u003cneutron.db.models_v2.Network\""},{"line_number":5497,"context_line":"        exp_middle \u003d \"[object at %x]\" % id(network)"},{"line_number":5498,"context_line":"        exp_end_with \u003d (\" {created_at\u003dNone, updated_at\u003dNone, \""},{"line_number":5499,"context_line":"                        \"tenant_id\u003dNone, id\u003dNone, \""},{"line_number":5500,"context_line":"                        \"name\u003d\u0027net_net\u0027, status\u003d\u0027OK\u0027, \""},{"line_number":5501,"context_line":"                        \"admin_state_up\u003dTrue, mtu\u003dNone, \""}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_2309c431","line":5498,"in_reply_to":"9a1a9d01_8cea1cab","updated":"2015-10-15 12:45:22.000000000","message":"Done","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"}],"neutron/tests/unit/extensions/test_timestamp.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                         attributes.SUBNETS: subnet,"},{"line_number":94,"context_line":"                         attributes.PORTS: port,"},{"line_number":95,"context_line":"                         attributes.SUBNETPOOLS: sp}"},{"line_number":96,"context_line":"            for type, obj in local_map.items():"},{"line_number":97,"context_line":"                # show resource with timestamp"},{"line_number":98,"context_line":"                req \u003d self.new_show_request(type,"},{"line_number":99,"context_line":"                                            list(obj.values())[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_611d1373","line":96,"range":{"start_line":96,"start_character":16,"end_line":96,"end_character":20},"updated":"2016-03-02 04:52:32.000000000","message":"Nit: type is a Python built-in (this can sometimes lead to obscure errors)","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"35e911e78d24ea45fa4fa3aaee70ab4184da5cf5","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                         attributes.SUBNETS: subnet,"},{"line_number":94,"context_line":"                         attributes.PORTS: port,"},{"line_number":95,"context_line":"                         attributes.SUBNETPOOLS: sp}"},{"line_number":96,"context_line":"            for type, obj in local_map.items():"},{"line_number":97,"context_line":"                # show resource with timestamp"},{"line_number":98,"context_line":"                req \u003d self.new_show_request(type,"},{"line_number":99,"context_line":"                                            list(obj.values())[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_9c8888e9","line":96,"range":{"start_line":96,"start_character":16,"end_line":96,"end_character":20},"in_reply_to":"7af24918_611d1373","updated":"2016-03-02 05:06:13.000000000","message":"+1","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"62de47b43b9962adf3e6705766426e16b25d2c16","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                         attributes.SUBNETS: subnet,"},{"line_number":94,"context_line":"                         attributes.PORTS: port,"},{"line_number":95,"context_line":"                         attributes.SUBNETPOOLS: sp}"},{"line_number":96,"context_line":"            for type, obj in local_map.items():"},{"line_number":97,"context_line":"                # show resource with timestamp"},{"line_number":98,"context_line":"                req \u003d self.new_show_request(type,"},{"line_number":99,"context_line":"                                            list(obj.values())[0][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":87,"id":"7af24918_b6fda03c","line":96,"range":{"start_line":96,"start_character":16,"end_line":96,"end_character":20},"in_reply_to":"7af24918_611d1373","updated":"2016-03-02 06:37:25.000000000","message":"@Henry, Armando, thanks for correct. I will make it another name soon.:-)","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    \"\"\"Just for test with TimeStampPlugin\"\"\""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"class TimeStampExtensionTestCase(test_db_base_plugin_v2."},{"line_number":44,"context_line":"                                 NeutronDbPluginV2TestCase):"},{"line_number":45,"context_line":"    plugin \u003d \u0027neutron.tests.unit.extensions.test_timestamp.TimeStampTestPlugin\u0027"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":88,"id":"7af24918_cb833603","line":43,"updated":"2016-03-02 17:10:11.000000000","message":"I am not sure I see the value of this test case when you already have actual api coverage. Consider dropping this one altogether. Patch smaller!","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"}],"neutron/tests/unit/plugins/ml2/test_plugin.py":[{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0491f649d695259f0eb11544bbc37e39eb0a1c0b","unresolved":false,"context_lines":[{"line_number":448,"context_line":"                self.assertIn(k, port)"},{"line_number":449,"context_line":"                self.assertIs(True, self._check_string_is_timestamp(port[k]))"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def test_create_subnetpool_with_timestamp(self):"},{"line_number":452,"context_line":"        data \u003d {\u0027subnetpool\u0027: {\u0027name\u0027: \u0027sp_test01\u0027,"},{"line_number":453,"context_line":"                               \u0027tenant_id\u0027: \u0027tenant_one\u0027,"},{"line_number":454,"context_line":"                               \u0027prefixes\u0027: [\u00271.1.1.1/24\u0027, \u00272.2.2.2/24\u0027]}"}],"source_content_type":"text/x-python","patch_set":11,"id":"da20952f_2eb73f3b","line":451,"updated":"2015-08-30 04:51:33.000000000","message":"Please write testcases for \n\n1. the new extension inside neutron.tests.unit.extensions.\n2. Add api tests as well.","commit_id":"b3bd4f097f4452a9e506a45bc7535abef195c7bc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"8632fb1945e7b43f58ba08c91473c57ff84e1c95","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        self.assertIn(\u0027vlan_transparent\u0027, network)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"class TestMl2CoreResourcesWithTimestamp(Ml2PluginV2TestCase):"},{"line_number":382,"context_line":"    def setUp(self, plugin\u003dNone):"},{"line_number":383,"context_line":"        super(TestMl2CoreResourcesWithTimestamp, self).setUp()"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_4c6de42f","line":381,"updated":"2015-09-29 13:24:55.000000000","message":"I am not sure you can have these in the same file. Extension testcases are added in a separate file. Please refer to\n\nhttps://github.com/openstack/neutron/blob/master/neutron/tests/unit/extensions/test_extra_dhcp_opt.py\n\nfor reference.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"a586b2083e47a2733a3f2605b2e30ab1ba69c8e3","unresolved":false,"context_lines":[{"line_number":378,"context_line":"        self.assertIn(\u0027vlan_transparent\u0027, network)"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"class TestMl2CoreResourcesWithTimestamp(Ml2PluginV2TestCase):"},{"line_number":382,"context_line":"    def setUp(self, plugin\u003dNone):"},{"line_number":383,"context_line":"        super(TestMl2CoreResourcesWithTimestamp, self).setUp()"},{"line_number":384,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a29b11f_9893aefa","line":381,"in_reply_to":"9a1a9d01_4c6de42f","updated":"2015-10-19 13:44:21.000000000","message":"Hi Mr.choudhary, I\u0027m confused whether these tests should be added in another file in extension dir..As this feature now is supported by ml2 plugin(which extension alias contain \u0027resource_timestamp\u0027), it just will be showed the info with setting ml2 as core plugin, so I give it a shot in the common situation, it just stored the timestamp fields to db but not showed in response. So I cannot to continue. I just think the tests should code into the plugin who realize it. May I use the class \"Ml2PluginV2TestCase\" directly which from test_case files if I should separate these tests from here?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"6986683f00513c17372df0e8defbbd5b8ed9ffe9","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    def test_list_mutiple_networks_with_changed_since(self):"},{"line_number":595,"context_line":"        with self.network(\u0027net1\u0027) as net1, self.network(\u0027net2\u0027) as net2:"},{"line_number":596,"context_line":"            # update names of net2"},{"line_number":597,"context_line":"            time.sleep(2)"},{"line_number":598,"context_line":"            new_net2 \u003d self._update_test_resource_by_name(net2)"},{"line_number":599,"context_line":"            # now the queue of order by"},{"line_number":600,"context_line":"            # updated_at is net1 \u003c new_net2"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a1a9d01_1bab9276","line":597,"updated":"2015-09-29 18:43:06.000000000","message":"What are these sleeps doing here?","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"4b9e3a2c358cbe8cf5b8025f6959a05bde37e986","unresolved":false,"context_lines":[{"line_number":594,"context_line":"    def test_list_mutiple_networks_with_changed_since(self):"},{"line_number":595,"context_line":"        with self.network(\u0027net1\u0027) as net1, self.network(\u0027net2\u0027) as net2:"},{"line_number":596,"context_line":"            # update names of net2"},{"line_number":597,"context_line":"            time.sleep(2)"},{"line_number":598,"context_line":"            new_net2 \u003d self._update_test_resource_by_name(net2)"},{"line_number":599,"context_line":"            # now the queue of order by"},{"line_number":600,"context_line":"            # updated_at is net1 \u003c new_net2"}],"source_content_type":"text/x-python","patch_set":22,"id":"5a2ca52d_9e626fac","line":597,"in_reply_to":"9a1a9d01_1bab9276","updated":"2015-10-15 12:45:22.000000000","message":"Hi Muller, thanks for review. These sleep here are for imitating the operation after a period of time. Here, it means when net1 and net2 had been created successfully. After 2 seconds , the test will update the net2. So when the net2 creation, the net2\u0027s updated_at is just like 0:00, after update, the net2ls updated_at should be 0:02. Now I used changed_since to query the net-list. It should get the results like below. The sleeps is for making the resources\u0027updated_at different.","commit_id":"eed2927a23608d0280df6146005d4df0e91addc7"}],"releasenotes/notes/add-timestamp-fields-f9ab949fc88f05f6.yaml":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"0affe8ca1a2dd71b8db75c676d6fdc29f193c224","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - And support for query these resources by changed-since, it will return the"},{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This feather is based on \u0027auto-allocate\u0027."},{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"},{"line_number":12,"context_line":"    neutron\\plugins\\common\\constants.py and add key-value \u0027timestamp\u0027"},{"line_number":13,"context_line":"    into DEFAULT_SERVICE_PLUGINS."}],"source_content_type":"text/x-yaml","patch_set":77,"id":"9aed3d3a_35a0849f","line":10,"updated":"2016-02-26 07:38:09.000000000","message":"I don\u0027t think you need to mention this was based on auto-allocate. That\u0027s just code structure and it will be confusing to operators. You can say that it is a service plugin though if you want.","commit_id":"0e5f1679077e0980d1037918b1c7d21f95df588c"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"3f0023f9105aa3d26bdac1b5dbc5b0ead2b78a88","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - And support for query these resources by changed-since, it will return the"},{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This feather is based on \u0027auto-allocate\u0027."},{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"},{"line_number":12,"context_line":"    neutron\\plugins\\common\\constants.py and add key-value \u0027timestamp\u0027"},{"line_number":13,"context_line":"    into DEFAULT_SERVICE_PLUGINS."}],"source_content_type":"text/x-yaml","patch_set":77,"id":"9aed3d3a_ba963c92","line":10,"in_reply_to":"9aed3d3a_35a0849f","updated":"2016-02-26 08:54:03.000000000","message":"@Kevin，thanks very much for your kind suggestion, and thanks for your given time. I will make it right. :-)","commit_id":"0e5f1679077e0980d1037918b1c7d21f95df588c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support timestamp fields addition into neutron core resources."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Add timestamp fields \u0027created_at\u0027, \u0027updated_at\u0027 into neutron core resources"},{"line_number":6,"context_line":"    like network, subnet, port and subnetpool."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_3ce85410","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":66},"updated":"2016-03-02 04:52:32.000000000","message":"\"Timestamp fields are now added to neutron core resources.\"","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":15309,"name":"zhaobo","email":"bzhaojyathousandy@gmail.com","username":"ZhaoBo"},"change_message_id":"62de47b43b9962adf3e6705766426e16b25d2c16","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support timestamp fields addition into neutron core resources."},{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Add timestamp fields \u0027created_at\u0027, \u0027updated_at\u0027 into neutron core resources"},{"line_number":6,"context_line":"    like network, subnet, port and subnetpool."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_7f148b43","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":66},"in_reply_to":"7af24918_3ce85410","updated":"2016-03-02 06:37:25.000000000","message":"@Henry, Thanks very much for these kind comments below. I will make it good.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Add timestamp fields \u0027created_at\u0027, \u0027updated_at\u0027 into neutron core resources"},{"line_number":6,"context_line":"    like network, subnet, port and subnetpool."},{"line_number":7,"context_line":"  - And support for query these resources by changed-since, it will return the"},{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This is a service plugin though if you want."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_9ccfe8af","line":7,"range":{"start_line":7,"start_character":20,"end_line":7,"end_character":25},"updated":"2016-03-02 04:52:32.000000000","message":"querying","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":5,"context_line":"  - Add timestamp fields \u0027created_at\u0027, \u0027updated_at\u0027 into neutron core resources"},{"line_number":6,"context_line":"    like network, subnet, port and subnetpool."},{"line_number":7,"context_line":"  - And support for query these resources by changed-since, it will return the"},{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This is a service plugin though if you want."},{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_3cbfb4fc","line":8,"range":{"start_line":8,"start_character":14,"end_line":8,"end_character":18},"updated":"2016-03-02 04:52:32.000000000","message":"changed","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  - And support for query these resources by changed-since, it will return the"},{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This is a service plugin though if you want."},{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"},{"line_number":12,"context_line":"    neutron\\plugins\\common\\constants.py and add key-value \u0027timestamp\u0027"},{"line_number":13,"context_line":"    into DEFAULT_SERVICE_PLUGINS."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_7c4dbc71","line":10,"range":{"start_line":10,"start_character":29,"end_line":10,"end_character":47},"updated":"2016-03-02 04:52:32.000000000","message":"that is loaded by default.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    resources list after the specfic time string like YYYY-MM-DDTHH:MM:SS"},{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - This is a service plugin though if you want."},{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"},{"line_number":12,"context_line":"    neutron\\plugins\\common\\constants.py and add key-value \u0027timestamp\u0027"},{"line_number":13,"context_line":"    into DEFAULT_SERVICE_PLUGINS."},{"line_number":14,"context_line":"  - To disable, just remove the related timestamp key-value"},{"line_number":15,"context_line":"    from DEFAULT_SERVICE_PLUGINS."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_1cb7583a","line":13,"range":{"start_line":11,"start_character":0,"end_line":13,"end_character":33},"updated":"2016-03-02 04:52:32.000000000","message":"Remove.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"94139ee2a225435f1cf4f2ccc169dd48e1a1db52","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    Any plugin could support timestamp for modify"},{"line_number":12,"context_line":"    neutron\\plugins\\common\\constants.py and add key-value \u0027timestamp\u0027"},{"line_number":13,"context_line":"    into DEFAULT_SERVICE_PLUGINS."},{"line_number":14,"context_line":"  - To disable, just remove the related timestamp key-value"},{"line_number":15,"context_line":"    from DEFAULT_SERVICE_PLUGINS."}],"source_content_type":"text/x-yaml","patch_set":87,"id":"7af24918_fcaf0ce1","line":15,"range":{"start_line":14,"start_character":0,"end_line":15,"end_character":33},"updated":"2016-03-02 04:52:32.000000000","message":"I don\u0027t this is relevant for the release notes since operators will not be editing the source code.","commit_id":"1468b75346f03270ece7a6b264cafaf1bb0b1515"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9dacfb79f5d13e3b78cdb029b3789c6603bf1331","unresolved":false,"context_lines":[{"line_number":4,"context_line":"features:"},{"line_number":5,"context_line":"  - Add timestamp fields \u0027created_at\u0027, \u0027updated_at\u0027 into neutron core"},{"line_number":6,"context_line":"    resources like network, subnet, port and subnetpool."},{"line_number":7,"context_line":"  - And support for querying these resources by changed-since, it will"},{"line_number":8,"context_line":"    return the resources changed after the specfic time string like"},{"line_number":9,"context_line":"    YYYY-MM-DDTHH:MM:SS"},{"line_number":10,"context_line":"upgrade:"}],"source_content_type":"text/x-yaml","patch_set":88,"id":"7af24918_0b419ea9","line":7,"updated":"2016-03-02 17:11:12.000000000","message":"this is not actually introduced with this patch though right? Perhaps you can move this to the next patch:\n\nhttps://review.openstack.org/#/c/250122/","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"1d1cb4b0a93dd83e329c001246d8b80cfc3debb7","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    return the resources changed after the specfic time string like"},{"line_number":9,"context_line":"    YYYY-MM-DDTHH:MM:SS"},{"line_number":10,"context_line":"upgrade:"},{"line_number":11,"context_line":"  - This is a service plugin loaded by default."}],"source_content_type":"text/x-yaml","patch_set":88,"id":"7af24918_cb421610","line":11,"updated":"2016-03-02 17:10:11.000000000","message":"I\u0027d say, this is a feature available by default on all core resources. But I\u0027d frankly drop this line because there\u0027s no upgrade impact I can see.","commit_id":"123db914d898d0b9fcefde0760dbd2a834bcd7c8"}]}
