)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add metadata for neutron core resources spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduce a generic mechanism to allow the user to set labels"},{"line_number":10,"context_line":"of external id\u0027s or metadata and attach it to Neutron resources."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I86e0c4f3081a83fa881ee8db860a3548deaeaeea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa1b9901_f5538837","line":10,"updated":"2015-08-25 09:55:10.000000000","message":"What do you mean by \u0027labels\u0027?  At least to me, I\u0027m afraid this isn\u0027t a well known term.\n\nIs \u0027of\u0027 correct, in \u0027labels of external id\u0027s\u0027?  Perhaps you meant \u0027or\u0027 instead?\n\nHere and also throughout the spec: s/id\u0027s/IDs/","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add metadata for neutron core resources spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduce a generic mechanism to allow the user to set labels"},{"line_number":10,"context_line":"of external id\u0027s or metadata and attach it to Neutron resources."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I86e0c4f3081a83fa881ee8db860a3548deaeaeea"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa1b9901_7bc76912","line":10,"in_reply_to":"fa1b9901_f5538837","updated":"2015-08-25 10:41:01.000000000","message":"Will do, i plan to re-spin this after todays driver meeting and align it with nova tags.\n\n(But yes, i meant or here)","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"}],"specs/liberty/add-metadata-to-core-resources.rst":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model does not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_2bc7ad46","line":13,"updated":"2015-08-23 11:51:27.000000000","message":"does not \u003d\u003e do not","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model does not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_2b3c8d2e","line":13,"in_reply_to":"fa1b9901_2bc7ad46","updated":"2015-08-23 12:04:57.000000000","message":"Done","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model does not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The following use cases refer to adding metadata to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_cbc39137","line":14,"updated":"2015-08-23 11:51:27.000000000","message":"ids \u003d\u003e ids and/or any other data","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model does not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The following use cases refer to adding metadata to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_eb4535b3","line":14,"in_reply_to":"fa1b9901_cbc39137","updated":"2015-08-23 12:04:57.000000000","message":"Done","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"REST API Impact"},{"line_number":55,"context_line":"---------------"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":58,"context_line":"|Attribute |Type             |Access   |Default  |Validation/ |Description    |"},{"line_number":59,"context_line":"|Name      |                 |         |Value    |Conversion  |               |"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_8bdcb919","line":56,"updated":"2015-08-23 11:51:27.000000000","message":"I would suggest to add resource type","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"REST API Impact"},{"line_number":55,"context_line":"---------------"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":58,"context_line":"|Attribute |Type             |Access   |Default  |Validation/ |Description    |"},{"line_number":59,"context_line":"|Name      |                 |         |Value    |Conversion  |               |"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_8b1119b2","line":56,"in_reply_to":"fa1b9901_8bdcb919","updated":"2015-08-23 12:04:57.000000000","message":"Done","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":62,"context_line":"|id        |(UUID)           |         |         |            |               |"},{"line_number":63,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":64,"context_line":"|metadata  |dictionary       |RW       | None    | N/A        | external      |"},{"line_number":65,"context_line":"|          |\u003cstring,string\u003e  |         |         |            | metadata id\u0027s |"},{"line_number":66,"context_line":"|          |                 |         |         |            | for resource  |"},{"line_number":67,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_ebd775eb","line":65,"updated":"2015-08-23 11:51:27.000000000","message":"can you please clarify the description of metadata?","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":62,"context_line":"|id        |(UUID)           |         |         |            |               |"},{"line_number":63,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":64,"context_line":"|metadata  |dictionary       |RW       | None    | N/A        | external      |"},{"line_number":65,"context_line":"|          |\u003cstring,string\u003e  |         |         |            | metadata id\u0027s |"},{"line_number":66,"context_line":"|          |                 |         |         |            | for resource  |"},{"line_number":67,"context_line":"+----------+-----------------+---------+---------+------------+---------------+"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_4b59c18d","line":65,"in_reply_to":"fa1b9901_ebd775eb","updated":"2015-08-23 12:04:57.000000000","message":"Done, i think, unless you meant something else and if you did please explain :)","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Security Impact"},{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":"Resource metadata must only be created/updated by tenant or admin."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_4be6a1e9","line":72,"updated":"2015-08-23 11:51:27.000000000","message":"by resource owner or admin","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Security Impact"},{"line_number":71,"context_line":"---------------"},{"line_number":72,"context_line":"Resource metadata must only be created/updated by tenant or admin."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_8b7839fa","line":72,"in_reply_to":"fa1b9901_4be6a1e9","updated":"2015-08-23 12:04:57.000000000","message":"Done","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"33b8d5329c18fac4a1945730c53643d7c2e3cabd","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Notifications Impact"},{"line_number":76,"context_line":"--------------------"},{"line_number":77,"context_line":"None"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Other End User Impact"},{"line_number":80,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_4bfd416d","line":77,"updated":"2015-08-23 11:51:27.000000000","message":"I think resource update notification should be generated upon metadata association or change","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"dc62f8da6fd2f10c4251dcfeea087a4a98f7fe09","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"Notifications Impact"},{"line_number":76,"context_line":"--------------------"},{"line_number":77,"context_line":"None"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Other End User Impact"},{"line_number":80,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa1b9901_ab7dfde8","line":77,"in_reply_to":"fa1b9901_4bfd416d","updated":"2015-08-23 12:04:57.000000000","message":"Done","commit_id":"2f30594ee7b2dcfb0693d000fdcd68a8fc671f19"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s or/and any other data by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The following use cases refer to adding metadata to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_3508202d","line":14,"updated":"2015-08-25 09:55:10.000000000","message":"s/dont/don\u0027t/","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-metadata-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any labels or metadata, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add external id\u0027s or/and any other data by the user."},{"line_number":15,"context_line":"Adding metadata/external id\u0027s to resources can be useful for management and orchestration in OpenStack."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The following use cases refer to adding metadata to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_1b5aed50","line":14,"in_reply_to":"fa1b9901_3508202d","updated":"2015-08-25 10:41:01.000000000","message":"will fix","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":20,"context_line":"1) Ability to map different networks in different OpenStack locations to one logically"},{"line_number":21,"context_line":"   same network (for Multi site OpenStack)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to OpenStack networks in mixed"},{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_200f7c2f","line":23,"updated":"2015-08-25 09:55:10.000000000","message":"s/Id\u0027s/IDs/ (througout document)","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"1) Ability to map different networks in different OpenStack locations to one logically"},{"line_number":21,"context_line":"   same network (for Multi site OpenStack)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to OpenStack networks in mixed"},{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_bb58a157","line":23,"in_reply_to":"fa1b9901_200f7c2f","updated":"2015-08-25 10:41:01.000000000","message":"will fix","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":21,"context_line":"   same network (for Multi site OpenStack)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to OpenStack networks in mixed"},{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_4020709b","line":24,"updated":"2015-08-25 09:55:10.000000000","message":"s/id/ID/ (throughout document)\n\nHow would this use case work?  I would guess that the solution for \u0027map docker network ID to neutron network ID\u0027 would involve metadata on the Docker network object, not in Neutron.  For the inverse case, \u0027map neutron network onto docker network\u0027, that sounds like a job for provider:segmentation_id.","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"   same network (for Multi site OpenStack)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to OpenStack networks in mixed"},{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_e6719c45","line":24,"in_reply_to":"fa1b9901_4020709b","updated":"2015-08-25 10:41:01.000000000","message":"We are working on a project (Kuryr) that implement a libnetwork remote driver and map its API\u0027s to Neutron API\u0027s.\n\nWe want to be able to map the ID\u0027s created using docker API or from the containers orchestration system which doesnt need to be OpenStack (also this can be for nested VM\u0027s cases)\nWe want to be able to work in mixed OpenStack environments and i think thats going to be a common usecase \n\nAnother feature is to pre-allocate Neutron ports-networks and allocate them on demand to containers, for this we need specific mapping to be able to bind the correct object.","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"4) Leverage metadata by deployment tools"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_80820851","line":27,"updated":"2015-08-25 09:55:10.000000000","message":"Such as?","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"   environments, for example for project Kuryr, map docker network id to neutron network id"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"4) Leverage metadata by deployment tools"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_a692c449","line":27,"in_reply_to":"fa1b9901_80820851","updated":"2015-08-25 10:41:01.000000000","message":"I have heard many use cases for this over the time, if this is what will make the difference i will make a list","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"4) Leverage metadata by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_802c484b","line":28,"updated":"2015-08-25 09:55:10.000000000","message":"My immediate reaction to these use cases is that they are all things whose specification needs to be fleshed out more, and that - if anything is needed at all - they absolutely should be addressed in the core Neutron model.\n\nIMO, therefore, the proposal of these use cases reinforces the case of the people who have opposed this patch.","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"3) Provide easy mapping for orchestration/deployment systems that want to use something other"},{"line_number":27,"context_line":"   then just a name or id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"4) Leverage metadata by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_a6e084cd","line":28,"in_reply_to":"fa1b9901_802c484b","updated":"2015-08-25 10:41:01.000000000","message":"These use cases are describing use of metadata from the API and not as something needed by a specific backend, which was the main concern of the people that objected it.\n\nThat means that these use cases are valid no matter what implementation is used and hence doesnt keep in the DB model information which is backend specific.\n\nI tend to agree with you that they need to be addressed in the core model at some point, but it will help understand and formalize the exact needed API and will help the community iterate in an agile way on the solution rather then decide everything from the start with out experimenting.","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Problem Description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Neutron resources doesnt support adding metadata information supplied by the user/admin"},{"line_number":35,"context_line":"and attach it to a specific resource id."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_40ddd040","line":34,"updated":"2015-08-25 09:55:10.000000000","message":"s/doesnt/doesn\u0027t/","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"Problem Description"},{"line_number":32,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Neutron resources doesnt support adding metadata information supplied by the user/admin"},{"line_number":35,"context_line":"and attach it to a specific resource id."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_865ea0e7","line":34,"in_reply_to":"fa1b9901_40ddd040","updated":"2015-08-25 10:41:01.000000000","message":"will fix","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"2aa784f3336ebd474679da1fad8b26b3b16bc7ac","unresolved":false,"context_lines":[{"line_number":68,"context_line":"|          |\u003cstring,string\u003e  |         |         |            | \u003ckey, value\u003e    |"},{"line_number":69,"context_line":"|          |                 |         |         |            | updated by user |"},{"line_number":70,"context_line":"+----------+-----------------+---------+---------+------------+-----------------+"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Security Impact"},{"line_number":74,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_00d27800","line":71,"updated":"2015-08-25 09:55:10.000000000","message":"This looks like a mapping that could be entirely implemented independently outside of Neutron.  What is the benefit of having it _in_ the Neutron DB?","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"8f4fb3a949a51862fac3d8e4300f731e9884c58e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"|          |\u003cstring,string\u003e  |         |         |            | \u003ckey, value\u003e    |"},{"line_number":69,"context_line":"|          |                 |         |         |            | updated by user |"},{"line_number":70,"context_line":"+----------+-----------------+---------+---------+------------+-----------------+"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"Security Impact"},{"line_number":74,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa1b9901_a62e44f8","line":71,"in_reply_to":"fa1b9901_00d27800","updated":"2015-08-25 10:41:01.000000000","message":"Where would you recommend to add it?\n\nI agree that it can be used cross-project, but the overhead of this will just set us back as we will now need agreements cross projects.\nThis spec is referring to Neutron resources only","commit_id":"40fc7bf81aa0418cdf6da09d83e8cbe6066b3748"}],"specs/liberty/add-tags-to-core-resources.rst":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"c7a3c9b8610c02541601597b9fc88beedf8f895c","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data by the user."},{"line_number":15,"context_line":"Adding tags to resources can be useful for management and orchestration in OpenStack, if its"},{"line_number":16,"context_line":"done in the API level and IS NOT backend specific data."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"The following use cases refer to adding tags to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_fe36c44f","line":15,"updated":"2015-08-26 12:59:42.000000000","message":"Nit: It would be good to line wrap this file at 80 characters consistently throughout.","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"eb17fc64dc4b96c33668c747488f656ba5983826","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data by the user."},{"line_number":15,"context_line":"Adding tags to resources can be useful for management and orchestration in OpenStack, if its"},{"line_number":16,"context_line":"done in the API level and IS NOT backend specific data."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"The following use cases refer to adding tags to networks, but the same can be"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_f1e91580","line":15,"in_reply_to":"fa1b9901_fe36c44f","updated":"2015-08-26 13:18:36.000000000","message":"Done","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"c7a3c9b8610c02541601597b9fc88beedf8f895c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"done in the API level and IS NOT backend specific data."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"The following use cases refer to adding tags to networks, but the same can be"},{"line_number":19,"context_line":"applicable to any other Neutron resource (core resource and Router):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"1) Ability to map different networks in different OpenStack locations to one logically"},{"line_number":22,"context_line":"   same network (for Multi site OpenStack)"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_be3dac2c","line":19,"updated":"2015-08-26 12:59:42.000000000","message":"Not: Un-capitalize Router.","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"eb17fc64dc4b96c33668c747488f656ba5983826","unresolved":false,"context_lines":[{"line_number":16,"context_line":"done in the API level and IS NOT backend specific data."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"The following use cases refer to adding tags to networks, but the same can be"},{"line_number":19,"context_line":"applicable to any other Neutron resource (core resource and Router):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"1) Ability to map different networks in different OpenStack locations to one logically"},{"line_number":22,"context_line":"   same network (for Multi site OpenStack)"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_b1007d35","line":19,"in_reply_to":"fa1b9901_be3dac2c","updated":"2015-08-26 13:18:36.000000000","message":"Done","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"c7a3c9b8610c02541601597b9fc88beedf8f895c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Proposed Change"},{"line_number":43,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"This spec is for adding a new API for *normal users* to be able to tag"},{"line_number":46,"context_line":" their instances with simple strings."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_7e1ab4c7","line":45,"updated":"2015-08-26 12:59:42.000000000","message":"Nit: You mean \"API\" user here, right?","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"eb17fc64dc4b96c33668c747488f656ba5983826","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Proposed Change"},{"line_number":43,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"This spec is for adding a new API for *normal users* to be able to tag"},{"line_number":46,"context_line":" their instances with simple strings."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa1b9901_519001ed","line":45,"in_reply_to":"fa1b9901_7e1ab4c7","updated":"2015-08-26 13:18:36.000000000","message":"yes, changed","commit_id":"320b5577d59628e34dd0b15919484114b5d084c9"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0f9ba3c82abdbfed311ab567de8f8b1b15a5ee85","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-tags-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if its done in the API level"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_b4cceb89","line":14,"updated":"2015-08-26 13:48:12.000000000","message":"s/dont/don\u0027t/","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"d40f9b48d6ed1abc3cd6f6b54b2f48df4b3e695d","unresolved":false,"context_lines":[{"line_number":11,"context_line":"https://blueprints.launchpad.net/neutron/+spec/add-tags-to-core-resources"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if its done in the API level"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_4a55a61b","line":14,"in_reply_to":"fa1b9901_b4cceb89","updated":"2015-08-26 14:15:05.000000000","message":"Done","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0f9ba3c82abdbfed311ab567de8f8b1b15a5ee85","unresolved":false,"context_lines":[{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if its done in the API level"},{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_b4938b5a","line":17,"updated":"2015-08-26 13:48:12.000000000","message":"s/its/it\u0027s/","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"d40f9b48d6ed1abc3cd6f6b54b2f48df4b3e695d","unresolved":false,"context_lines":[{"line_number":14,"context_line":"dont have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if its done in the API level"},{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_6a52ea36","line":17,"in_reply_to":"fa1b9901_b4938b5a","updated":"2015-08-26 14:15:05.000000000","message":"Done","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0f9ba3c82abdbfed311ab567de8f8b1b15a5ee85","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to"},{"line_number":27,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":28,"context_line":"    map docker network id to neutron network id"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3) Leverage tags by deployment tools"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_efffec63","line":28,"range":{"start_line":28,"start_character":3,"end_line":28,"end_character":4},"updated":"2015-08-26 13:48:12.000000000","message":"The extra space here is actually breaking one of the jenkins jobs.","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"d40f9b48d6ed1abc3cd6f6b54b2f48df4b3e695d","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"2) Ability to map Id\u0027s from different management/orchestration systems to"},{"line_number":27,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":28,"context_line":"    map docker network id to neutron network id"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"3) Leverage tags by deployment tools"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_8a265ecc","line":28,"in_reply_to":"fa1b9901_efffec63","updated":"2015-08-26 14:15:05.000000000","message":"Done","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0f9ba3c82abdbfed311ab567de8f8b1b15a5ee85","unresolved":false,"context_lines":[{"line_number":280,"context_line":"* DB migrations"},{"line_number":281,"context_line":"* Add testing"},{"line_number":282,"context_line":"* Add documentation"},{"line_number":283,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Dependencies"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_8fcbd052","line":283,"updated":"2015-08-26 13:48:12.000000000","message":"I think it\u0027s good to look into this, but I wouldn\u0027t worry about working too hard at it.  I think a strongly worded comment in the code in the db model is probably good enough.\n\nIt might be easy enough to strip the tags off before calling into drivers in the ML2 plugin, at least.","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"d40f9b48d6ed1abc3cd6f6b54b2f48df4b3e695d","unresolved":false,"context_lines":[{"line_number":280,"context_line":"* DB migrations"},{"line_number":281,"context_line":"* Add testing"},{"line_number":282,"context_line":"* Add documentation"},{"line_number":283,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"Dependencies"},{"line_number":286,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa1b9901_45b6f73e","line":283,"in_reply_to":"fa1b9901_8fcbd052","updated":"2015-08-26 14:15:05.000000000","message":"nice idea, i like it","commit_id":"0b140afd6782e80ecf24a367a2327504a45c6b12"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if it\u0027s done in the API level"},{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"},{"line_number":21,"context_line":"can be applicable to any other Neutron resource (core resource and router):"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_98c18c83","line":18,"updated":"2015-08-26 19:31:33.000000000","message":"Are we saying that consumers of this feature are meant to be other systems? E.g. Nova, Kuryr (I loathe the name by the way...), Ansible..etc? If so, I think we should be more specific here, and say that external systems (and NOT backend drivers) are meant to exploit tags for their own needs.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if it\u0027s done in the API level"},{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"},{"line_number":21,"context_line":"can be applicable to any other Neutron resource (core resource and router):"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_7b825b54","line":18,"in_reply_to":"da20952f_98c18c83","updated":"2015-08-27 07:27:07.000000000","message":"I will rephrase to reflect that.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e41a4da84f334498577b2d4d9e77f427ffc39f0f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tags to resources can be useful for management and"},{"line_number":17,"context_line":"orchestration in OpenStack, if it\u0027s done in the API level"},{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"},{"line_number":21,"context_line":"can be applicable to any other Neutron resource (core resource and router):"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_dd658945","line":18,"in_reply_to":"da20952f_98c18c83","updated":"2015-08-27 13:29:48.000000000","message":"I\u0027d phrase it as \"clients of the Neutron REST API\".","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"},{"line_number":21,"context_line":"can be applicable to any other Neutron resource (core resource and router):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1) Ability to map different networks in different OpenStack locations"},{"line_number":24,"context_line":"   to one logically same network (for Multi site OpenStack)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_b8e6d0e6","line":21,"updated":"2015-08-26 19:31:33.000000000","message":"in a world where out-of-tree extensions are a way of life, I think we should not restrict this to \u0027core\u0027 resources.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and IS NOT backend specific data."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"The following use cases refer to adding tags to networks, but the same"},{"line_number":21,"context_line":"can be applicable to any other Neutron resource (core resource and router):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"1) Ability to map different networks in different OpenStack locations"},{"line_number":24,"context_line":"   to one logically same network (for Multi site OpenStack)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_fb68abbc","line":21,"in_reply_to":"da20952f_b8e6d0e6","updated":"2015-08-27 07:27:07.000000000","message":"agree, will change this","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":53,"context_line":"Similar to the approved nova spec `tag instances`_, and in accordance to"},{"line_number":54,"context_line":"these `guidelines`_."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"This spec propose to support adding tags to Neutron resources which"},{"line_number":57,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_58ee94ed","line":56,"updated":"2015-08-26 19:31:33.000000000","message":"propose -\u003e proposes","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"Similar to the approved nova spec `tag instances`_, and in accordance to"},{"line_number":54,"context_line":"these `guidelines`_."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"This spec propose to support adding tags to Neutron resources which"},{"line_number":57,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_bb90f396","line":56,"in_reply_to":"da20952f_58ee94ed","updated":"2015-08-27 07:27:07.000000000","message":"Done","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":54,"context_line":"these `guidelines`_."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"This spec propose to support adding tags to Neutron resources which"},{"line_number":57,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Data Model Impact"},{"line_number":60,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_787cb820","line":57,"updated":"2015-08-26 19:31:33.000000000","message":"the devil is in the details here: depending on how this is going to be implemented on top of the Neutron API\u0027s framework, we must make sure that tags are not going to be loaded and/or attached to resources during plugin operations.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"these `guidelines`_."},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"This spec propose to support adding tags to Neutron resources which"},{"line_number":57,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Data Model Impact"},{"line_number":60,"context_line":"-----------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9b63afb1","line":57,"in_reply_to":"da20952f_787cb820","updated":"2015-08-27 07:27:07.000000000","message":"agree, however the last thing i want to see is a lot of code which its only purpose is to block every possible case of a plugin abusing this.\n\nAs you suggested below, and i will add it to the spec, we should not send tags information to the plugins and need to make sure that its stored in DB but not part of the objects themselfs","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"f1b329ebfc652a1760888f5c52fe694dbfc9b7a4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE tags ("},{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9c5749ca","line":72,"updated":"2015-08-26 16:08:38.000000000","message":"resource_type?","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE tags ("},{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_5b1437f4","line":72,"in_reply_to":"da20952f_584694c0","updated":"2015-08-27 07:27:07.000000000","message":"yes, i will add the example and rephrase this to make it clearer","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"cae4ba7ef3d8b2a185c4f025e598e1ff53dce951","unresolved":false,"context_lines":[{"line_number":69,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE tags ("},{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9892ec56","line":72,"in_reply_to":"da20952f_9c5749ca","updated":"2015-08-26 19:06:25.000000000","message":"I know i had it in the last review, but why do we need the resource type? \nyou can deduct it from the resource id and i can\u0027t think right now of a case with the below API\u0027s that we will need to know the resource type.\n\nDo you have any concrete use case for having that?\n\nResource type can also be added as another tag if its really needed for a certain case","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":69,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    CREATE TABLE tags ("},{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_584694c0","line":72,"in_reply_to":"da20952f_9c5749ca","updated":"2015-08-26 19:31:33.000000000","message":"Is this the uuid of the neutron resource whathever it might be (network, subnet, floating ip, router...firewall, lb, vpn, in other words any object that has a uuid)? I think we should make that clear. Perhaps an entry example for this table might be helpful.\n\nIt sucks that this model doesn\u0027t allow us to leverage DB integrity constraints, yuk...","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":76,"context_line":"        deleted_at DATETIME,"},{"line_number":77,"context_line":"        deleted INT DEFAULT 0"},{"line_number":78,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_1b525614","line":75,"updated":"2015-08-26 19:31:33.000000000","message":"Here we\u0027re saying that given a specific resource, the list of tags is not actually a list, but a set...meaning that it doesn\u0027t allow duplicates. That said I can have tags\u003d(foo, Foo, fOo). Are we going to normalize the tags?\n\nWhat bothers me to is that with multiple systems using this feature, there\u0027s the potential of making systems conflict, unless we introduce a namespace for them. Perhaps this can be easily achieved by asking consumers to prefix their tags, e.g. (Kuryr_foo, Nova_foo), but then if you are storing a uuid mapping you gotta split this on the consumer side.\n\nThe more I think about the model and the more I am convinced that it can be improved, especially to allow systems not to step on each other toes.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":76,"context_line":"        deleted_at DATETIME,"},{"line_number":77,"context_line":"        deleted INT DEFAULT 0"},{"line_number":78,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9e52bd12","line":75,"in_reply_to":"da20952f_1b525614","updated":"2015-08-27 07:27:07.000000000","message":"the way i see tags is as a way to group resources (probably in one direction from the user to neutron, and even in groups with size 1) so usually the user / other system will search and filter according to these tags. (after it assigned them in creation/update).\n\n(So for example if Kuryr / Nova / Ansible or any other system tag the resource\nthey will use this tag to filter and search the relevant resource/ group of resources according to the tag.)\n\nI don\u0027t see where  multiple systems conflict with that, but of course i could be missing something, if the community desire is to move to a metadata structure i can revert it, but i currently dont see anything missing in the tags approach for the use cases i described and envision. \n\nDo you have any concrete example where this fails? \n\nmaybe we can have the tags constructed as \"\u003cnamespace\u003e:\u003cvalue\u003e\" where the user can search/filter according to a specific namespace.\n\nBut this is starting to resemble metadata, the reason why i converted this to tags is because it was expressed here and in the mailing list that tags are \"less abusive\" and i agree and don\u0027t see how we miss anything with tags for the use cases that we want to support.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"78f0c1cad4bc3416362f56fd5b5ee6d2846db8d5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        resource_id CHAR(32) NOT NULL PRIMARY KEY,"},{"line_number":73,"context_line":"        tag VARCHAR(256) NOT NULL CHARACTER SET utf8"},{"line_number":74,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":75,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":76,"context_line":"        deleted_at DATETIME,"},{"line_number":77,"context_line":"        deleted INT DEFAULT 0"},{"line_number":78,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_00f4cc83","line":75,"in_reply_to":"da20952f_9e52bd12","updated":"2015-08-28 06:28:50.000000000","message":"But as you suggested, we can also document the users to tag with prefixes and that would solve the problem.\n \nI don\u0027t think that \"splitting this on the consumer side\" is a problem, because again the way i see this feature being used is from the external system/REST API user to Neutron, so these values are known to the user/external system and they search and filter Neutron resources according to it.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"f1b329ebfc652a1760888f5c52fe694dbfc9b7a4","unresolved":false,"context_lines":[{"line_number":218,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":219,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"No change is needed to the JSON response for the `GET /v2.0/networks` call."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Security Impact"},{"line_number":224,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_5ca3f19e","line":221,"updated":"2015-08-26 16:08:38.000000000","message":"So no tags will be returned?","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":218,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":219,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"No change is needed to the JSON response for the `GET /v2.0/networks` call."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Security Impact"},{"line_number":224,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9ebf1dd0","line":221,"in_reply_to":"da20952f_5b69ae8a","updated":"2015-08-27 07:27:07.000000000","message":"The way i see it, tags are meant to group/filter/search Neutron resources according to specific strings (i.e the tags), i do see a value of getting the tags and setting them for a specific resource and i do see value of searching and filtering according to the tags in various ways (as expressed above)\n\nI dont see the value of listing all resources of some kind and seeing all their tags, but for consistency and if you feel its important i will remove this line so tags are visible for this case as well.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"cae4ba7ef3d8b2a185c4f025e598e1ff53dce951","unresolved":false,"context_lines":[{"line_number":218,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":219,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"No change is needed to the JSON response for the `GET /v2.0/networks` call."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Security Impact"},{"line_number":224,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_38f160ce","line":221,"in_reply_to":"da20952f_5ca3f19e","updated":"2015-08-26 19:06:25.000000000","message":"No, in the case of listing all networks it will not be returned.\nThats aligned with Nova behaviour and i think the above mentioned ways of retrieving tags are enough","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":218,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":219,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"No change is needed to the JSON response for the `GET /v2.0/networks` call."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Security Impact"},{"line_number":224,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_5b69ae8a","line":221,"in_reply_to":"da20952f_5ca3f19e","updated":"2015-08-26 19:31:33.000000000","message":"that seems contradictory to behavior defined at line 89. Not everything that Nova does makes sense just so you know.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"e41a4da84f334498577b2d4d9e77f427ffc39f0f","unresolved":false,"context_lines":[{"line_number":218,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":219,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"No change is needed to the JSON response for the `GET /v2.0/networks` call."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Security Impact"},{"line_number":224,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_f8c89b76","line":221,"in_reply_to":"da20952f_9ebf1dd0","updated":"2015-08-27 13:29:48.000000000","message":"adding it to /networks sounds perfectly reasonable to me.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"Notifications Impact"},{"line_number":229,"context_line":"--------------------"},{"line_number":230,"context_line":"Resource update notification should be generated upon tags association"},{"line_number":231,"context_line":"or change"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Other End User Impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_1b0a56d3","line":230,"updated":"2015-08-26 19:31:33.000000000","message":"What does this mean, exactly? I don\u0027t understand.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"Notifications Impact"},{"line_number":229,"context_line":"--------------------"},{"line_number":230,"context_line":"Resource update notification should be generated upon tags association"},{"line_number":231,"context_line":"or change"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Other End User Impact"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_dbc12730","line":230,"in_reply_to":"da20952f_1b0a56d3","updated":"2015-08-27 07:27:07.000000000","message":"I forgot to remove this, i will remove next re-spin","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Other End User Impact"},{"line_number":234,"context_line":"---------------------"},{"line_number":235,"context_line":"None"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"Performance Impact"},{"line_number":238,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_bb0ecae3","line":235,"updated":"2015-08-26 19:31:33.000000000","message":"You must be joking! That\u0027s the whole point of this spec isn\u0027t it? Besides, can you explain how you intend to modify the python-neutronclient?","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"Other End User Impact"},{"line_number":234,"context_line":"---------------------"},{"line_number":235,"context_line":"None"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"Performance Impact"},{"line_number":238,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_bb779301","line":235,"in_reply_to":"da20952f_bb0ecae3","updated":"2015-08-27 07:27:07.000000000","message":"I understood \"Other End User Impact\" as what additional impact besides the API change which was described.\n\nWhat problems/challenges you see in modifying the python-neutronclient to support it?\nI will add it to the work items","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"Performance Impact"},{"line_number":238,"context_line":"------------------"},{"line_number":239,"context_line":"DB is extended for every tags actually stored for a specific core resource"},{"line_number":240,"context_line":"(only if tags are supplied)."},{"line_number":241,"context_line":"Resource retrieval/updates needs to also fetch tags information if exists."},{"line_number":242,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_3b039aba","line":239,"updated":"2015-08-26 19:31:33.000000000","message":"I am not sure we should restrict it to core resources","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"Performance Impact"},{"line_number":238,"context_line":"------------------"},{"line_number":239,"context_line":"DB is extended for every tags actually stored for a specific core resource"},{"line_number":240,"context_line":"(only if tags are supplied)."},{"line_number":241,"context_line":"Resource retrieval/updates needs to also fetch tags information if exists."},{"line_number":242,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_bbdb131b","line":239,"in_reply_to":"da20952f_3b039aba","updated":"2015-08-27 07:27:07.000000000","message":"agree, will change","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67b113b69de014d8a13c45bd37f5647e4d2c8432","unresolved":false,"context_lines":[{"line_number":281,"context_line":"* Add testing"},{"line_number":282,"context_line":"* Add documentation"},{"line_number":283,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":284,"context_line":"  (for example strip the tags off before calling into drivers in the ML2 plugin)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"Dependencies"},{"line_number":287,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9bcbc672","line":284,"updated":"2015-08-26 19:31:33.000000000","message":"this sounds totally backwards to me: we should not have tags associated to resources when calling plugins in the first place.","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e0230d4854893d14ecd253b1bcfc9eb3380462b8","unresolved":false,"context_lines":[{"line_number":281,"context_line":"* Add testing"},{"line_number":282,"context_line":"* Add documentation"},{"line_number":283,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":284,"context_line":"  (for example strip the tags off before calling into drivers in the ML2 plugin)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"Dependencies"},{"line_number":287,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":6,"id":"da20952f_9b172fa3","line":284,"in_reply_to":"da20952f_9bcbc672","updated":"2015-08-27 07:27:07.000000000","message":"Yes i agree, as stated above we should not have this information in the plugins objects, however that might require the DB layer to understand who is the consumer and that might turn out to be a complicated code just to prevent this, but i will describe this option here and check it out during process","commit_id":"fb3c3fea5fb28a7655c5a1ac1e90e98c6d81d433"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0638e9560f8c2f9d7f8182ad1c37e1227865939d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"don\u0027t have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tagging resources can be used by external systems or any other"},{"line_number":17,"context_line":"clients of the Neutron REST API (and NOT backend drivers)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The following use cases refer to adding tags to networks, but the same"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_020f9e88","line":16,"updated":"2015-08-31 07:36:33.000000000","message":"Remove \"Adding\", sounds un-necessary.","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e8545bcd8d61fe7e88a83ab55c0db82a76b0798d","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Neutron resources in current DB model do not contain any tags, and"},{"line_number":14,"context_line":"don\u0027t have a generic consistent way to add tags or/and any other data"},{"line_number":15,"context_line":"by the user."},{"line_number":16,"context_line":"Adding tagging resources can be used by external systems or any other"},{"line_number":17,"context_line":"clients of the Neutron REST API (and NOT backend drivers)."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The following use cases refer to adding tags to networks, but the same"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_3af8bdc2","line":16,"in_reply_to":"da20952f_020f9e88","updated":"2015-08-31 13:27:08.000000000","message":"Agree, will change","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"0638e9560f8c2f9d7f8182ad1c37e1227865939d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":" their instances with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_a26fd229","line":48,"updated":"2015-08-31 07:36:33.000000000","message":"un-necessary space.","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"e8545bcd8d61fe7e88a83ab55c0db82a76b0798d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":" their instances with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_fafd65b1","line":48,"in_reply_to":"da20952f_a26fd229","updated":"2015-08-31 13:27:08.000000000","message":"Will fix, thanks","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d82948a223a5969f65f563052824f641d31129e3","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    CREATE TABLE tags ("},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":75,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":76,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":77,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":78,"context_line":"        deleted_at DATETIME,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_b96609b9","line":75,"updated":"2015-08-31 19:27:11.000000000","message":"you seem to have missed the example? Also, no mention on how you intend to address the data integrity that can\u0027t be preserved using DB referential constraints.\n\nKevin had ideas about it, you may want to touch base with him.","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"ab4fa6f9056697e2a3a5867527173953a587219e","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    CREATE TABLE tags ("},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":75,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":76,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":77,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":78,"context_line":"        deleted_at DATETIME,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_49269f17","line":75,"in_reply_to":"da20952f_b96609b9","updated":"2015-09-02 10:20:50.000000000","message":"Done","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d82948a223a5969f65f563052824f641d31129e3","unresolved":false,"context_lines":[{"line_number":88,"context_line":"the second user will need to pick a different tag value."},{"line_number":89,"context_line":"It is recommended and should be documented that users prefix tags with their"},{"line_number":90,"context_line":"\"namespace\" names to avoid such cases."},{"line_number":91,"context_line":"(A future enhancement could be to add a \"namespace\" field in the tags table)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_59a48db8","line":91,"updated":"2015-08-31 19:27:11.000000000","message":"I thought about this and this can be solved by adding a tenant_id column. Every service will need an account to talk to Neutron and if we\u0027re smart enough we can avoid services clashing with each other if each has its own account. Surely one could use the \u0027admin\u0027 account for all services, but at it\u0027s not the platform\u0027s fault.","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"ab4fa6f9056697e2a3a5867527173953a587219e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"the second user will need to pick a different tag value."},{"line_number":89,"context_line":"It is recommended and should be documented that users prefix tags with their"},{"line_number":90,"context_line":"\"namespace\" names to avoid such cases."},{"line_number":91,"context_line":"(A future enhancement could be to add a \"namespace\" field in the tags table)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_69236306","line":91,"in_reply_to":"da20952f_59a48db8","updated":"2015-09-02 10:20:50.000000000","message":"listed it as an option to prevent conflicts","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d82948a223a5969f65f563052824f641d31129e3","unresolved":false,"context_lines":[{"line_number":297,"context_line":"* Modify python-neutronclient to support tagging resources and searching"},{"line_number":298,"context_line":"   and filtering according to tags"},{"line_number":299,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":300,"context_line":"  (optimally, plugins should not be aware of tags at all, or retrieve them)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Dependencies"},{"line_number":303,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_d9d41ded","line":300,"updated":"2015-08-31 19:27:11.000000000","message":"why optimally? Do you intend of doing a sub-optimal work? :)","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"ab4fa6f9056697e2a3a5867527173953a587219e","unresolved":false,"context_lines":[{"line_number":297,"context_line":"* Modify python-neutronclient to support tagging resources and searching"},{"line_number":298,"context_line":"   and filtering according to tags"},{"line_number":299,"context_line":"* Iterate on ways to block backend specific information in the tags"},{"line_number":300,"context_line":"  (optimally, plugins should not be aware of tags at all, or retrieve them)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"Dependencies"},{"line_number":303,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":7,"id":"da20952f_c9786ffb","line":300,"in_reply_to":"da20952f_d9d41ded","updated":"2015-09-02 10:20:50.000000000","message":"fixed :)","commit_id":"c01549839fcf63a9a1fab6a08eef73979a5d27f2"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ff89a96b7954d7526413c388a72cee26b15d2179","unresolved":false,"context_lines":[{"line_number":92,"context_line":"and the tag is a string value attached to this resource."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":95,"context_line":"is saved in the DB."},{"line_number":96,"context_line":"Adding tags references in this object can help us keep data integrity"},{"line_number":97,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":98,"context_line":"when the resource it self is deleted."}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_7d43f36c","line":95,"updated":"2015-09-10 08:04:50.000000000","message":"Reference can be helpful","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"74019994b0756a9aaadc7b6f7ea24b61e09425c4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"and the tag is a string value attached to this resource."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":95,"context_line":"is saved in the DB."},{"line_number":96,"context_line":"Adding tags references in this object can help us keep data integrity"},{"line_number":97,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":98,"context_line":"when the resource it self is deleted."}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_14264016","line":95,"in_reply_to":"da20952f_7d43f36c","updated":"2015-09-10 15:43:03.000000000","message":"Will add as soon as Kevin will provide me with one, i think its still not documented anywhere","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ff89a96b7954d7526413c388a72cee26b15d2179","unresolved":false,"context_lines":[{"line_number":100,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"It is important to note that invalid entries doesnt introduce invalid behaviour as"},{"line_number":103,"context_line":"the process of searching/filtering tags also involves fetching the resource it self."},{"line_number":104,"context_line":"(the API requests are per resource type)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Even if not common, two users can try to tag a resource with"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_9d3da7df","line":103,"updated":"2015-09-10 08:04:50.000000000","message":"it self \u003d\u003e itself","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"74019994b0756a9aaadc7b6f7ea24b61e09425c4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"It is important to note that invalid entries doesnt introduce invalid behaviour as"},{"line_number":103,"context_line":"the process of searching/filtering tags also involves fetching the resource it self."},{"line_number":104,"context_line":"(the API requests are per resource type)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Even if not common, two users can try to tag a resource with"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_342104fd","line":103,"in_reply_to":"da20952f_9d3da7df","updated":"2015-09-10 15:43:03.000000000","message":"Done","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ff89a96b7954d7526413c388a72cee26b15d2179","unresolved":false,"context_lines":[{"line_number":104,"context_line":"(the API requests are per resource type)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Even if not common, two users can try to tag a resource with"},{"line_number":107,"context_line":"the same value, due to the uniqueness constraint, the second try will fail and"},{"line_number":108,"context_line":"the second user will need to pick a different tag value."},{"line_number":109,"context_line":"It is recommended and should be documented that users prefix tags with their"},{"line_number":110,"context_line":"\"namespace\" names to avoid such cases."}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_fd05c313","line":107,"updated":"2015-09-10 08:04:50.000000000","message":"try\u003d\u003eattempt","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"74019994b0756a9aaadc7b6f7ea24b61e09425c4","unresolved":false,"context_lines":[{"line_number":104,"context_line":"(the API requests are per resource type)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"Even if not common, two users can try to tag a resource with"},{"line_number":107,"context_line":"the same value, due to the uniqueness constraint, the second try will fail and"},{"line_number":108,"context_line":"the second user will need to pick a different tag value."},{"line_number":109,"context_line":"It is recommended and should be documented that users prefix tags with their"},{"line_number":110,"context_line":"\"namespace\" names to avoid such cases."}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_f41aacc5","line":107,"in_reply_to":"da20952f_fd05c313","updated":"2015-09-10 15:43:03.000000000","message":"Done","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ff89a96b7954d7526413c388a72cee26b15d2179","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"Adding tenant_id to Table"},{"line_number":114,"context_line":"--------------------------"},{"line_number":115,"context_line":"to solve the above problem, we can add \u0027tenant_id\u0027 column to the table::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    CREATE TABLE tags ("},{"line_number":118,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_a00ba023","line":115,"updated":"2015-09-10 08:04:50.000000000","message":"To","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"74019994b0756a9aaadc7b6f7ea24b61e09425c4","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"Adding tenant_id to Table"},{"line_number":114,"context_line":"--------------------------"},{"line_number":115,"context_line":"to solve the above problem, we can add \u0027tenant_id\u0027 column to the table::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    CREATE TABLE tags ("},{"line_number":118,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"}],"source_content_type":"text/x-rst","patch_set":9,"id":"da20952f_548278c9","line":115,"in_reply_to":"da20952f_a00ba023","updated":"2015-09-10 15:43:03.000000000","message":"Done","commit_id":"357f1c14b83dea1be2da9e9d92c56e7b29399c13"}],"specs/mitaka/add-tags-to-core-resources.rst":[{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"1a4d19342ece555fba710d3ee36a491ebef7cb2d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":75,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":76,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":77,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":78,"context_line":"        deleted_at DATETIME,"},{"line_number":79,"context_line":"        deleted INT DEFAULT 0"},{"line_number":80,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":11,"id":"da20952f_2bc0912a","line":77,"updated":"2015-09-11 15:49:40.000000000","message":"This is redundant since a primary key is inherently a unique key.","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":75,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":76,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":77,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":78,"context_line":"        deleted_at DATETIME,"},{"line_number":79,"context_line":"        deleted INT DEFAULT 0"},{"line_number":80,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_3862bed9","line":77,"in_reply_to":"da20952f_2bc0912a","updated":"2015-09-13 11:23:08.000000000","message":"Yes, i changed to allow multiple tags for the same resource id by making resource_id MUL key and adding a row id for this.","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":75,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":76,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":77,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":78,"context_line":"        deleted_at DATETIME,"},{"line_number":79,"context_line":"        deleted INT DEFAULT 0"},{"line_number":80,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_786836bb","line":77,"in_reply_to":"da20952f_2bc0912a","updated":"2015-09-13 11:23:08.000000000","message":"You are right, i changed this to have PRI id key and resource_id as a MUL key (i want to allow multiple tags for the same resource id","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"1a4d19342ece555fba710d3ee36a491ebef7cb2d","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        tenant_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":120,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":121,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":122,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":123,"context_line":"        deleted_at DATETIME,"},{"line_number":124,"context_line":"        deleted INT DEFAULT 0"},{"line_number":125,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":11,"id":"da20952f_eb2a99e6","line":122,"updated":"2015-09-11 15:49:40.000000000","message":"If you intend to add tenant_id here then this is redundant as well, otherwise two users from different tenant can\u0027t use the same tag on a resource as this effectively will allow only one tag per resource even if tenant_id is different.\n\nOn a side note, I\u0027m not sure why is it even a problem that needs solving, i.e. do you intend each tenant to only be able to see the tags that he put on the resource? What about tags the admin put there?","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        tenant_id CHAR(36) NOT NULL PRIMARY KEY,"},{"line_number":120,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":121,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":122,"context_line":"        CONSTRAINT resource_tag_constraint UNIQUE (resource_id, tag),"},{"line_number":123,"context_line":"        deleted_at DATETIME,"},{"line_number":124,"context_line":"        deleted INT DEFAULT 0"},{"line_number":125,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_1879fa93","line":122,"in_reply_to":"da20952f_eb2a99e6","updated":"2015-09-13 11:23:08.000000000","message":"Its a problem for shared resources.\n\nIts also a problem because think that now you can have the same tag possibly used to identify two different resources. (but the user filter/search the list according to the tag, so we will need the tenant id to map between the results and the request)\n\nAs discussed, admin is a special case which we say is on the user responsibility. unless any better solution.","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"1a4d19342ece555fba710d3ee36a491ebef7cb2d","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":177,"context_line":"    }"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"If the number of tags exceeds the limit of tags per network, shall return"},{"line_number":180,"context_line":"a `400 Bad Request`"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Add a single tag on a network ::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"da20952f_6b268917","line":179,"updated":"2015-09-11 15:49:40.000000000","message":"How and where is this limit defined?","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":177,"context_line":"    }"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"If the number of tags exceeds the limit of tags per network, shall return"},{"line_number":180,"context_line":"a `400 Bad Request`"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Add a single tag on a network ::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_35064721","line":179,"in_reply_to":"da20952f_6b268917","updated":"2015-09-13 11:23:08.000000000","message":"At this stage it will either be hard coded or in the configuration file, i will add a line here","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"1a4d19342ece555fba710d3ee36a491ebef7cb2d","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"Other Deployer Impact"},{"line_number":301,"context_line":"---------------------"},{"line_number":302,"context_line":"tags are available to deployers but not to use for a specific backend"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"Developer Impact"},{"line_number":305,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"da20952f_8b3c3d30","line":302,"updated":"2015-09-11 15:49:40.000000000","message":"nit: s/tags/Tags/","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":299,"context_line":""},{"line_number":300,"context_line":"Other Deployer Impact"},{"line_number":301,"context_line":"---------------------"},{"line_number":302,"context_line":"tags are available to deployers but not to use for a specific backend"},{"line_number":303,"context_line":""},{"line_number":304,"context_line":"Developer Impact"},{"line_number":305,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_151d4373","line":302,"in_reply_to":"da20952f_8b3c3d30","updated":"2015-09-13 11:23:08.000000000","message":"Done","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":7921,"name":"Mike Kolesnik","email":"mkolesni@redhat.com","username":"mkolesni"},"change_message_id":"1a4d19342ece555fba710d3ee36a491ebef7cb2d","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"Developer Impact"},{"line_number":305,"context_line":"----------------"},{"line_number":306,"context_line":"tags are available to developers but not to use for a specific backend"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"Community Impact"},{"line_number":309,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"da20952f_4b42a5ac","line":306,"updated":"2015-09-11 15:49:40.000000000","message":"nit: s/tags/Tags/","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"c2a7110bd07a99cbdf99de9a86add8e9d32f09e0","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"Developer Impact"},{"line_number":305,"context_line":"----------------"},{"line_number":306,"context_line":"tags are available to developers but not to use for a specific backend"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"Community Impact"},{"line_number":309,"context_line":"----------------"}],"source_content_type":"text/x-rst","patch_set":11,"id":"ba15a1d1_b511f75f","line":306,"in_reply_to":"da20952f_4b42a5ac","updated":"2015-09-13 11:23:08.000000000","message":"Done","commit_id":"d687c58f3c7c188e26056146023b5190bf9afcaf"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":"their instances with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_83d26833","line":48,"updated":"2015-10-12 18:45:26.000000000","message":"instance in OpenStack parlance is used to refer to a VM. If you respin, could you choose a different term, like \u0027resource\u0027?","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":"their instances with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_65c8a075","line":48,"in_reply_to":"7a2fa921_83d26833","updated":"2015-11-08 07:04:20.000000000","message":"Done","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Similar to the approved nova spec `tag instances`_, and in accordance to"},{"line_number":53,"context_line":"these `guidelines`_."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"This spec proposes to support adding tags to Neutron resources which"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_23cb5474","line":52,"updated":"2015-10-12 18:45:26.000000000","message":"here is fine, obviously.","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"This spec proposes to support adding tags to Neutron resources which"},{"line_number":56,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":57,"context_line":"In an optimal implementation these tags will only be visible in the API level and"},{"line_number":58,"context_line":"not be available in the plugin level."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_0395f83e","line":57,"updated":"2015-10-12 18:45:26.000000000","message":"I think this statement opens up the doubt that we might be open to a design that allows tags to be visible and treated by backend. I think we won\u0027t, so we should be more prescriptive here and say:\n\nIn the proposed implementation these tags will only be visibible...","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"This spec proposes to support adding tags to Neutron resources which"},{"line_number":56,"context_line":"are not meant to be interpreted by any specific backend implementation."},{"line_number":57,"context_line":"In an optimal implementation these tags will only be visible in the API level and"},{"line_number":58,"context_line":"not be available in the plugin level."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Data Model Impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_25a138aa","line":57,"in_reply_to":"7a2fa921_0395f83e","updated":"2015-11-08 07:04:20.000000000","message":"Done","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"and the tag is a string value attached to this resource."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":96,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":97,"context_line":"Adding tags references in this object can help us keep data integrity"},{"line_number":98,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":99,"context_line":"when the resource it self is deleted."}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_63eb8cb1","line":96,"updated":"2015-10-12 18:45:26.000000000","message":"In light of [1], is the schema below still viable? I find a bit confusing to read these notes in this order.\n\n[1] https://review.openstack.org/#/c/222079/","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"and the tag is a string value attached to this resource."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":96,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":97,"context_line":"Adding tags references in this object can help us keep data integrity"},{"line_number":98,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":99,"context_line":"when the resource it self is deleted."}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_e5aa5085","line":96,"in_reply_to":"7a2fa921_63eb8cb1","updated":"2015-11-08 07:04:20.000000000","message":"Yes, i will explain this in the updated version, but basically if i am using Kevin patch, it will be easier but limits the functionality (the way i understand it)\n\nThe user will only be able to use one tag per resource (because we want to be able to filter and search the resources according to tags) and also this adds the tags field to any resource even if its not needed/used.\n\nOf course there are solutions to this.. but i prefer to get the community feedback what is the better approach.","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries doesnt introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_c3daa017","line":103,"updated":"2015-10-12 18:45:26.000000000","message":"do not","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries doesnt introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_05b0b4f3","line":103,"in_reply_to":"7a2fa921_c3daa017","updated":"2015-11-08 07:04:20.000000000","message":"Done","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":137,"context_line":"In this case one tenant shouldn\u0027t get the results of the other and the tenant_id value"},{"line_number":138,"context_line":"in the tags table will help for that."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Admin user can still introduce conflicts with this solution."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"REST API Impact"},{"line_number":143,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_835fc874","line":140,"updated":"2015-10-12 18:45:26.000000000","message":"So at this point I am unclear to which proposal you\u0027re gonna adopt. Model #1, model #2, or the one based on Kevin\u0027s proposal?","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":137,"context_line":"In this case one tenant shouldn\u0027t get the results of the other and the tenant_id value"},{"line_number":138,"context_line":"in the tags table will help for that."},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"Admin user can still introduce conflicts with this solution."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"REST API Impact"},{"line_number":143,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_05b514cc","line":140,"in_reply_to":"7a2fa921_835fc874","updated":"2015-11-08 07:04:20.000000000","message":"I will combine model #1 and #2, for Kevins proposal, see comment above, it make things easier but limits the functionality.\n\nWould like the community feedback how to proceed","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":14605,"name":"vikram.choudhary","email":"vikschw@gmail.com","username":"vikram.choudhary"},"change_message_id":"c1fd7fceddf1afc8a1072d4629b6404d8c7039ca","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Complex queries may have contradictory parameters. Example::"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    GET /v2.0/networks?tags\u003dblue\u0026not-tags\u003dblue"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":281,"context_line":"there are no such networks and Neutron will return an empty list."}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba15a1d1_f97b33bc","line":278,"updated":"2015-09-17 14:38:44.000000000","message":"both the tags and not-tags are \u0027blue\u0027?","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"3bbb314df0b6e2e327dafe798c6b378036a3f6ca","unresolved":false,"context_lines":[{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Complex queries may have contradictory parameters. Example::"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"    GET /v2.0/networks?tags\u003dblue\u0026not-tags\u003dblue"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":281,"context_line":"there are no such networks and Neutron will return an empty list."}],"source_content_type":"text/x-rst","patch_set":12,"id":"ba15a1d1_9c28da34","line":278,"in_reply_to":"ba15a1d1_f97b33bc","updated":"2015-09-17 17:20:47.000000000","message":"This section talks about \"contradictory parameters\" so thats an invalid search which should return no results (but no failure)","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4be3edc6fa0b2a94f5edf7cbf7bc1e412e3d2d9f","unresolved":false,"context_lines":[{"line_number":303,"context_line":"(only if tags are supplied)."},{"line_number":304,"context_line":"Resource retrieval/updates needs to also fetch tags information if exists."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"IPv6 Impact"},{"line_number":307,"context_line":"-----------"},{"line_number":308,"context_line":"None"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"7a2fa921_23511463","line":306,"updated":"2015-10-12 18:45:26.000000000","message":"We simplified the spec template in Liberty, can you use that one instead of this? Some of these sections have gone away for a reason.","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"a58061ce354acfa338c85b6e54cfffeeae50a3c3","unresolved":false,"context_lines":[{"line_number":303,"context_line":"(only if tags are supplied)."},{"line_number":304,"context_line":"Resource retrieval/updates needs to also fetch tags information if exists."},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"IPv6 Impact"},{"line_number":307,"context_line":"-----------"},{"line_number":308,"context_line":"None"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"da85f559_a5952841","line":306,"in_reply_to":"7a2fa921_23511463","updated":"2015-11-08 07:04:20.000000000","message":"Done","commit_id":"c85a50ebca577a796e22a1828386e156892d80dc"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_7d7b622a","line":29,"updated":"2015-11-12 22:57:08.000000000","message":"4) allow operators to tag information about provider networks (e.g. high-bandwith, low-latency, etc)\n\n5) new features like get-me-a-network or a similar port scheduler could choose a network for a port based on tags","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c544d6e1f352f3747118059c2ceadcc601a36b79","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_ef81c2c4","line":29,"in_reply_to":"9a8ffd7b_19a9f4df","updated":"2015-11-30 22:57:20.000000000","message":"If we start asking ourselves this question, we\u0027d be stepping into ontology territory. Tags are a mechanism; what one does with it, goes beyond the nature of mechanism. But yes, there\u0027s a danger of having the same tags having two different meanings or two tags having the same meaning. Without a well defined ontology we can\u0027t address this issue, but tags are not useless because of a lack of an ontology.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":9515,"name":"Matthew Kassawara","email":"mkassawara@gmail.com","username":"ionosphere80"},"change_message_id":"5e92569a8d17176e54de707a82abe2828d8ec05a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_19a9f4df","line":29,"in_reply_to":"9a8ffd7b_1e10faa7","updated":"2015-11-30 21:45:34.000000000","message":"At least public/private is fairly easy to indicate using a standardized boolean such as \"external: True\" or \"provider: True\", although word choice is important to convey the correct meaning. Alternatively, because public/external/provider networks may not always offer connectivity to the internet, it might be easier for such a tag to indicate that a network is private/internal such as \"private: True\".","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_66ff2a35","line":29,"in_reply_to":"9a8ffd7b_4e480f88","updated":"2015-12-01 09:55:25.000000000","message":"The \"standardization\" in my view needs to happen from the user of the tags (who ever that is), if you want to leverage tags for the use case, you can add a \"wrapper\" code/API that only let you categorize networks the way you want and block anything else.\n(And it can use the tags mechanism \"behind the scenes\" to avoid code duplication)\n\nThe tags mechanism is used for it, but remains generic to fit other use cases as we dont want to start complicating things just yet.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"ae3b1a6793cb54a346d51da2ed2c33cbd2a2b690","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_4e480f88","line":29,"in_reply_to":"9a8ffd7b_ef81c2c4","updated":"2015-12-01 00:21:54.000000000","message":"After reading Armando\u0027s comment, I\u0027m thinking that the ontology idea isn\u0027t really something that Neutron should be taking on.  If we start defining such a thing it should not be done here in the context of this spec and probably shouldn\u0027t be Neutron that does it at all.\n\n@Monty:  Since users can tag things themselves, maybe you could tag your networks the way you want once and then your scripts can use them from there on.  Does it have to be a deployer provided tag?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_860b2e7d","line":29,"in_reply_to":"da85f559_7d7b622a","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8f775b2cd55e677c10d8804b809539ef60d283d5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"   OpenStack networks in mixed environments, for example for project Kuryr,"},{"line_number":27,"context_line":"   map docker network id to neutron network id"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"3) Leverage tags by deployment tools"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Problem Description"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_1e10faa7","line":29,"in_reply_to":"da85f559_7d7b622a","updated":"2015-11-30 21:31:49.000000000","message":"Mordred brought up a simple use case today in IRC [1] that could be a good candidate for tags usage.  Basically, tag networks that can get you to the public internet.\n\nHowever, as mordred points out, the usefulness of this could be diminished if the tags are not standardized across deployments.  If one deployment decides to tag a network with \"public\", another uses \"external\", and another uses \"internet\" it will be difficult to go from cloud to cloud.\n\nIs there any interest in maintaining a list of standardized tags somehow.  I would imagine the list would be maintained in the neutron repository so that changes to the list can be reviewed.\n\n [1] http://eavesdrop.openstack.org/irclogs/%23openstack-neutron/%23openstack-neutron.2015-11-30.log.html#t2015-11-30T21:09:03","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ef89242db6833ee39fabfcff47342e72633800a3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"to group and categorize objects in the domain model."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_953304ab","line":40,"updated":"2015-11-10 19:33:48.000000000","message":"nit: add an API","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":37,"context_line":"to group and categorize objects in the domain model."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_0e6b55f2","line":40,"in_reply_to":"da85f559_953304ab","updated":"2015-11-11 16:32:59.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"61ca4b93e0970e8c770eb46d4d265cfeb47913f3","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_f53827a2","line":41,"updated":"2015-11-11 15:33:07.000000000","message":"\"an instance\" should be \"a network\"  or \"a neutron resource\", shouldn\u0027t it?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_6e6a21f0","line":41,"in_reply_to":"da85f559_f53827a2","updated":"2015-11-11 16:32:59.000000000","message":"good catch, i will change to \"a neutron resource\"","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"6e39b05929322a8e5507881521eac9c6dcb91124","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_10031d0f","line":42,"updated":"2015-11-12 23:07:42.000000000","message":"@Neil, my example in that review was referring to these tags. And IMO it\u0027s a perfectly valid use of tags because its a tool that allows operators to define arbitrary things about a networks (e.g. these are on the same l3 network, these have 5 nines guaruntees, these are PCI compliant, these use red cables, etc). My proposal was to allow ports to be scheduled to a network based on these arbitrary operator/user tags because it gives users the flexibility to place ports based on their own whims.\n\nSo Neutron users (operators or end-users) leveraging tags to indicate special things about the network is fine. What we don\u0027t want is the tags to tell the backend to behave in separate ways. In other words, tags should not impact the flow of traffic in any way. Some examples of bad tag use: a tag that changes traffic priority, a tag that disables broadcast, a tag that disables security groups.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_9d78862d","line":42,"updated":"2015-11-12 22:57:08.000000000","message":"Complexity isn\u0027t a great argument against tags. They are possibly the simplest thing you can add to a DB. :)\n\nThe \u0027problem\u0027 is that Neutron doesn\u0027t allow tagging of resources. The use cases for tagging are outlined in the previous section.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"33eb9e8435708a967e799e355f89adc4496c3c77","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_25e4efa9","line":42,"updated":"2015-11-12 17:45:49.000000000","message":"I am against this.  It seems to me that the Neutron DB and data model is already complicated enough as it is - and quite badly underdocumented - and that we should resist adding anything to it that is not strictly part of networking semantics that the data model must describe.\n\nFor any kind of non-Neutron-related information that you want to associate with a set of Neutron objects, why not just create another DB with tables mapping from the Neutron object ID to the information that you want to store?\n\nI would also point out that there is no actual problem described here.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_c62a96e7","line":42,"in_reply_to":"ba8a016a_05368003","updated":"2015-12-01 09:55:25.000000000","message":"I really think this conversation should have happened before the RFE got approved.\n\nThe way i see it, we are now into design level discussion, iterating and re-explaining if this feature is needed/not-needed is something that already should have happened before (if not, maybe its best to change the RFE process to reflect that?)\n\nI prefer we focus on the approved use-cases and how its best to implement this in Neutron\n(Of course thats only my point of view on how this process should look like)","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"1cc6526d93d55ee127263d555f8510069e50fe43","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_87033676","line":42,"in_reply_to":"da85f559_10031d0f","updated":"2015-11-13 13:11:14.000000000","message":"@Kevin - Thanks for commenting, and in particular clarifying that your comments on the L3 modelling spec are referring to these tags.\n\nWe now have a slightly complex situation where discussion of the application of tags in general is mixed up with interpretation of what they might or might not mean in the L3 modelling context.  I hope it\u0027s OK to try to disentangle that here...\n\nFor the L3 modelling requirement, there has to be a backend- and implementation-independent data model representation of the statement \u0027These VMs should have IP reachability to each other, but you shouldn\u0027t assume anything about whether they share an L2 domain.\u0027  Then, in any given deployment, and depending on the physical fabric and chosen Neutron backend/implementation, it might be that the backend/implementation has to do something to \u0027make it so\u0027.\n\nTherefore it seems clear to me that there are 2 reasons why this statement can\u0027t be represented using tags.  Firstly, because there is meaning here that is an important part of the connectivity that Neutron is being asked to provide, or saying that it does provide; and most reviewers here seem to think that tags should not be used for such core concepts.  Secondly, because the backend (plugin, agent, ML2 driver etc.) may have to _do_ something in order to provide that requested connectivity, and hence the fact that that connectivity is being requested must be passed down to the relevant backend APIs.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"446b6f8f195e699a5e7a2fed73938e020aefa765","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_36998779","line":42,"in_reply_to":"da85f559_25e4efa9","updated":"2015-11-12 18:48:33.000000000","message":"Neil, are you proposing Tag as a Service? Because if we went down this route, that\u0027s effectively what we need :)\n\nI think the rationale behind the introduction of tags is the same behind the use of tags in any software catalog system. You have tags in photo systems, video systems, book systems etc.\n\nIt\u0027s a data to describe data. This has nothing to do with the fact that the Neutron DB and data model is already complicated, this would not complicate it further, because there are no networking concepts associated with it.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"d23ce59deafdb0e7c91210404f7bd30dc32b04f3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_da3e14da","line":42,"in_reply_to":"da85f559_36998779","updated":"2015-11-12 22:43:10.000000000","message":"Armando, I\u0027m afraid I\u0027m not familiar with Tag as a Service, so I didn\u0027t mean to propose that myself.\n\nPerhaps you\u0027re right about this just being tags as in, e.g., photos; but I worry that it could become (or be abused as) a generic user data system, much like the recent proposal to support arbitrary JSON blobs in the IPAM DB tables.  A JSON blob could be encoded as a string and stored as a tag, couldn\u0027t it?  I guess we would know this was happening if someone proposed a patch to include tags on ML2 mechanism driver method calls.\n\nAnother data point, from the discussion at https://review.openstack.org/#/c/225384/, is that Kevin suggested using tags, rather than a specific new data model object, as a possible way of modelling that certain Neutron networks were IP-reachable to each other.  Probably Kevin had a different kind of tag in mind, but at the very least I think this shows that the terminology \u0027tag\u0027 does not unambiguously mean \u0027you must not assign any semantic meaning to this\u0027 to everyone.\n\nFinally, it just seems to me that there\u0027s no need for tag support to be in the Neutron core, because every Neutron object already has a nice unique ID that could be used as a hash key in some non-Neutron DB that stored the required information.  Probably I take an excessively purist and theoretical approach here, but I\u0027d say that if it is possible to decouple such data, it is better to do so.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"c14625b6f12638e90900ad3bb0193feaf57851fa","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_f6177fa0","line":42,"in_reply_to":"da85f559_36998779","updated":"2015-11-12 18:53:51.000000000","message":"What about the fact there isn\u0027t a problem described here?\n\n:)","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4ee3a3e3134189a4f583583c96e11d2f0a21c752","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_0ea3c89f","line":42,"in_reply_to":"da85f559_3865b6e0","updated":"2015-11-13 21:14:44.000000000","message":"@Shraddha, the JSON blobs were shot down because we don\u0027t want the behavior of the system to change based on random strings. The important distinction here is that the tags don\u0027t affect the behavior of anything, they can just be used to filter networks. If we have a port scheduling component that can take a list of networks and choose one for the port, it could also filter based on these tags.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":8515,"name":"Shraddha Pandhe","email":"shraddha.pandhe@yahoo.com","username":"spandhe"},"change_message_id":"895583ac26a3b3399cdb9ce7e1d1602bc4b95769","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_3865b6e0","line":42,"in_reply_to":"da85f559_87033676","updated":"2015-11-13 19:53:49.000000000","message":"@ Neil/Kevin,\n\nMy proposal of \u0027arbitrary JSON\u0027 blobs was shot down for the reason that \u0027we don\u0027t want operators to put any random strings\u0027. To solve the problem, I proposed extending the database itself, which is what Neil is proposing as well\n\nMy Spec: https://review.openstack.org/#/c/242688/\n\n\nI think extended database solves the problem of:\n1. No arbitrary data\n2. All use cases being discussed with the community before using \"tags\" or \"JSON\" blobs as shortcuts.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"4ee3a3e3134189a4f583583c96e11d2f0a21c752","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_8e87b811","line":42,"in_reply_to":"da85f559_87033676","updated":"2015-11-13 21:14:44.000000000","message":"There is an important clarification that I think is needed. I didn\u0027t mean that tags should imply that L3 connectivity is guaranteed. What I was pointing out in the other spec is that the general idea of scheduling ports to a group of networks can also be solved with tags. The guarantee isn\u0027t there for the API user that there is a particular connectivity between them so it\u0027s not providing the same contract, but it could be used by operators that just want to offer connectivity in pools of networks without making any guarantees.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"119337766d35e78a1fc4beefb72bb6dd8529a5c1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba8a016a_05368003","line":42,"in_reply_to":"da85f559_8e87b811","updated":"2015-11-16 11:37:40.000000000","message":"@Kevin - thanks for clarification about tags and L3 connectivity; I see your viewpoint now.  Tags are used in the Nova/Neutron communication to determine which compute host to choose for a particular VM, and a parallel but strictly independent mechanism (e.g. as in Carl\u0027s spec) is used to specify whatever connectivity is required between VMs.\n\nWith that viewpoint, are tags useful more generally in allowing Neutron to influence Nova\u0027s scheduling choices?  If so, that would be a strong motivation for this spec, and I like to understand that in more detail.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":8515,"name":"Shraddha Pandhe","email":"shraddha.pandhe@yahoo.com","username":"spandhe"},"change_message_id":"f80166808f6d2e845a77a1886db40f0851851d47","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_d240020a","line":42,"in_reply_to":"da85f559_8e87b811","updated":"2015-11-14 00:46:30.000000000","message":"@Kevin, I completely agree that tags are not as bad as JSON blobs. However, do you think extending the database will solve this and some other use cases as well?\n\nMy worry is that, once we add tags, it might get even tougher to get use-cases like ours to get in. What I mean to say is, tags might become the recommended solution for use cases like ours, even though it doesn\u0027t fully solve our problem.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"324372f8c87c761ee6ae212e622fd83e14f6956c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"In order to align Neutron\u0027s REST API with the Internet\u0027s common understanding"},{"line_number":40,"context_line":"of `resource tagging`_, we can add a API that allows normal users"},{"line_number":41,"context_line":"to add, remove and list tags for an instance."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Proposed Change"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_83b0d78c","line":42,"in_reply_to":"da85f559_d240020a","updated":"2015-11-15 21:02:56.000000000","message":"Right, extending the database to capture network reachability information is still a good thing to do. Tags will only offer one way to solve some issues but it won\u0027t cover the L3 to ToR use-case on its own.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":"their neutron resources with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Similar to the approved nova spec `tag instances`_, and in accordance to"},{"line_number":53,"context_line":"these `guidelines`_."}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_3d75da31","line":50,"updated":"2015-11-12 22:57:08.000000000","message":"an \u0027instance\u0027?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":47,"context_line":"This spec is for adding a new way for *API users* to be able to tag"},{"line_number":48,"context_line":"their neutron resources with simple strings."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Add an API that allows a user to add, remove, and list tags for an instance."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Similar to the approved nova spec `tag instances`_, and in accordance to"},{"line_number":53,"context_line":"these `guidelines`_."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_034970d0","line":50,"in_reply_to":"da85f559_3d75da31","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"In the REST API changes below, non-URL-safe characters in tags will need"},{"line_number":66,"context_line":"to be urlencoded if referred in the URI (for example, doing a"},{"line_number":67,"context_line":"DELETE /v2.0/networks/{network}/tags/{tag}, the {tag} would need to"},{"line_number":68,"context_line":"be urlencoded."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_5d721e4b","line":68,"updated":"2015-11-12 22:57:08.000000000","message":"remove this line about url encoding. It\u0027s not related to the data model.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"In the REST API changes below, non-URL-safe characters in tags will need"},{"line_number":66,"context_line":"to be urlencoded if referred in the URI (for example, doing a"},{"line_number":67,"context_line":"DELETE /v2.0/networks/{network}/tags/{tag}, the {tag} would need to"},{"line_number":68,"context_line":"be urlencoded."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_e62f9af4","line":68,"in_reply_to":"da85f559_5d721e4b","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    CREATE TABLE tags ("},{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_fd8d122b","line":72,"updated":"2015-11-12 22:57:08.000000000","message":"Please leverage my patch and just relate it to the new StandardAttribute ID (or whatever it ends up being called) for each resource. So it will be one table with a relationship to the StandardAttribute table.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"61ca4b93e0970e8c770eb46d4d265cfeb47913f3","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    CREATE TABLE tags ("},{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_903e8926","line":72,"updated":"2015-11-11 15:33:07.000000000","message":"Will there be a single table for each resource type? Or will each resource type have it\u0027s own?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"cd3545a819d4b6e71db9de89f855db4e4eaa47de","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    CREATE TABLE tags ("},{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_419b4c66","line":72,"in_reply_to":"da85f559_2ed419bb","updated":"2015-11-12 07:54:33.000000000","message":"I guess it really depends on how your queries are implemented. We should consider asking some openstack db experts here - this is really not my area of expertise. \n\nBut if your plan is to go with a single db for all resource types, maybe you can state this a little more clearly in the paragraph above.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    CREATE TABLE tags ("},{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_2ed419bb","line":72,"in_reply_to":"da85f559_903e8926","updated":"2015-11-11 16:32:59.000000000","message":"I thought about having a single table, do you think we should have a table for each resource type?\nThere are pros and cons to each method and it really depends on how widely tags are used","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    CREATE TABLE tags ("},{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_8611ee5f","line":72,"in_reply_to":"da85f559_fd8d122b","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":76,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":77,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":78,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"},{"line_number":79,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_1d933651","line":76,"updated":"2015-11-12 22:57:08.000000000","message":"where did the 60 char count come from? is that an openstack standard? if so, please add a comment indicating why 60 is the limit","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":74,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":75,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":76,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":77,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":78,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"},{"line_number":79,"context_line":"    );"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_262cc2aa","line":76,"in_reply_to":"da85f559_1d933651","updated":"2015-12-01 09:55:25.000000000","message":"Will add, this is the same limit done in other projects that uses tags.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ef89242db6833ee39fabfcff47342e72633800a3","unresolved":false,"context_lines":[{"line_number":94,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":95,"context_line":"Adding tag references in this object can help us keep data integrity"},{"line_number":96,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":97,"context_line":"when the resource it self is deleted."},{"line_number":98,"context_line":"However this limits the number of tags a single resource can have (one) as this table"},{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_55aefc98","line":97,"updated":"2015-11-10 19:33:48.000000000","message":"itself","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":94,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":95,"context_line":"Adding tag references in this object can help us keep data integrity"},{"line_number":96,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":97,"context_line":"when the resource it self is deleted."},{"line_number":98,"context_line":"However this limits the number of tags a single resource can have (one) as this table"},{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_ee7611d6","line":97,"in_reply_to":"da85f559_55aefc98","updated":"2015-11-11 16:32:59.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":96,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":97,"context_line":"when the resource it self is deleted."},{"line_number":98,"context_line":"However this limits the number of tags a single resource can have (one) as this table"},{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_bd978a39","line":99,"updated":"2015-11-12 22:57:08.000000000","message":"This isn\u0027t right. Check my comment above for how this can be leveraged.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"and make sure that all references for a specific resource are deleted"},{"line_number":97,"context_line":"when the resource it self is deleted."},{"line_number":98,"context_line":"However this limits the number of tags a single resource can have (one) as this table"},{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_d1032e0c","line":99,"in_reply_to":"da85f559_bd978a39","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"61ca4b93e0970e8c770eb46d4d265cfeb47913f3","unresolved":false,"context_lines":[{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_d0117105","line":102,"updated":"2015-11-11 15:33:07.000000000","message":"Sorry, not an  neutron db expert: But why can\u0027t we enforce this on the database layer using foreign key and cascading?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_f16192d4","line":102,"in_reply_to":"da85f559_36b8d074","updated":"2015-12-01 09:55:25.000000000","message":"Will use common neutron table (Kevin\u0027s work) to enforce it","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11307,"name":"Andreas Scheuring","email":"andreas.scheuring@de.ibm.com","username":"uniqueName"},"change_message_id":"cd3545a819d4b6e71db9de89f855db4e4eaa47de","unresolved":false,"context_lines":[{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_36b8d074","line":102,"in_reply_to":"da85f559_7133e6ab","updated":"2015-11-12 07:54:33.000000000","message":"yes probably. I have no clue how such things are handled in neutron/openstack in general. My proposal was just along my intuition.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":99,"context_line":"only has one entry per neutron resource."},{"line_number":100,"context_line":"Another option to keep data integrity is to have a cleaner thread which is invoked"},{"line_number":101,"context_line":"every X amount of time and clean \"invalid\" entries."},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_7133e6ab","line":102,"in_reply_to":"da85f559_d0117105","updated":"2015-11-11 16:32:59.000000000","message":"Its possible, i am not familiar enough with the performance implications of using that.\nMaybe someone with more knowledge on that subject can elaborate","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":107,"context_line":"Even if not common, two users can try to tag a resource with"},{"line_number":108,"context_line":"the same value, due to the uniqueness constraint, the second attempt will fail and"},{"line_number":109,"context_line":"the second user will need to pick a different tag value."},{"line_number":110,"context_line":"(Applies to shared resources)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Another problem which can arise is two different tenants that tag different"},{"line_number":113,"context_line":"resources with the same tag."}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_dd9cce5f","line":110,"updated":"2015-11-12 22:57:08.000000000","message":"In light of this comment, it\u0027s not clear to me why you have a tenant_id field in the tag table. If the tenant_id just matches the resource tenant_id, then it\u0027s redundant and should be removed. But if the tenant_id is the creator of the tag, this paragraph would be incorrect because different tentants would have tag uniqueness scoped to their tenant_id.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"Even if not common, two users can try to tag a resource with"},{"line_number":108,"context_line":"the same value, due to the uniqueness constraint, the second attempt will fail and"},{"line_number":109,"context_line":"the second user will need to pick a different tag value."},{"line_number":110,"context_line":"(Applies to shared resources)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Another problem which can arise is two different tenants that tag different"},{"line_number":113,"context_line":"resources with the same tag."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_f19e7262","line":110,"in_reply_to":"da85f559_dd9cce5f","updated":"2015-12-01 09:55:25.000000000","message":"I agree, i remove this paragraph as its incorrect.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0b9e58a77fc7a717d369d3a76db892bf38487bb7","unresolved":false,"context_lines":[{"line_number":107,"context_line":"Even if not common, two users can try to tag a resource with"},{"line_number":108,"context_line":"the same value, due to the uniqueness constraint, the second attempt will fail and"},{"line_number":109,"context_line":"the second user will need to pick a different tag value."},{"line_number":110,"context_line":"(Applies to shared resources)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"Another problem which can arise is two different tenants that tag different"},{"line_number":113,"context_line":"resources with the same tag."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_b0c1e482","line":110,"in_reply_to":"da85f559_dd9cce5f","updated":"2015-11-24 16:20:58.000000000","message":"I think this discussion on tenant_id-less resources is relevant here: https://review.openstack.org/#/c/244680/1/neutron/api/v2/base.py","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ef89242db6833ee39fabfcff47342e72633800a3","unresolved":false,"context_lines":[{"line_number":113,"context_line":"resources with the same tag."},{"line_number":114,"context_line":"When searching the table we will need to deduct which result to return to"},{"line_number":115,"context_line":"which request. (This can also be solved by trying to retrieve the resource"},{"line_number":116,"context_line":"it self and compare its tenant id as described above)."},{"line_number":117,"context_line":"To solve the above problems, I added \u0027tenant_id\u0027 column to the table."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_15cab44e","line":116,"updated":"2015-11-10 19:33:48.000000000","message":"itself","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":113,"context_line":"resources with the same tag."},{"line_number":114,"context_line":"When searching the table we will need to deduct which result to return to"},{"line_number":115,"context_line":"which request. (This can also be solved by trying to retrieve the resource"},{"line_number":116,"context_line":"it self and compare its tenant id as described above)."},{"line_number":117,"context_line":"To solve the above problems, I added \u0027tenant_id\u0027 column to the table."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_b12f0e87","line":116,"in_reply_to":"da85f559_15cab44e","updated":"2015-11-11 16:32:59.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":114,"context_line":"When searching the table we will need to deduct which result to return to"},{"line_number":115,"context_line":"which request. (This can also be solved by trying to retrieve the resource"},{"line_number":116,"context_line":"it self and compare its tenant id as described above)."},{"line_number":117,"context_line":"To solve the above problems, I added \u0027tenant_id\u0027 column to the table."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":120,"context_line":"to tag resources."}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_7da2829c","line":117,"updated":"2015-11-12 22:57:08.000000000","message":"I don\u0027t understand how different tenants tagging different resources would be an issue that you need to solve with a tenant_id column. Unless you mean that tenants shouldn\u0027t be able to see each other\u0027s tags, in which case I would reword this paragraph just to say that tags are private to the tenant.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"When searching the table we will need to deduct which result to return to"},{"line_number":115,"context_line":"which request. (This can also be solved by trying to retrieve the resource"},{"line_number":116,"context_line":"it self and compare its tenant id as described above)."},{"line_number":117,"context_line":"To solve the above problems, I added \u0027tenant_id\u0027 column to the table."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":120,"context_line":"to tag resources."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_5123be05","line":117,"in_reply_to":"da85f559_7da2829c","updated":"2015-12-01 09:55:25.000000000","message":"I will reword","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":140,"context_line":"    }"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    GET /v2.0/networks/{network_id}/tags"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_9d9f2650","line":142,"updated":"2015-11-12 22:57:08.000000000","message":"This isn\u0027t how the current API works. We should keep it consistent and just use the standard \u0027fields\u0027 method that is already supported by everything.\n\nGET /V2.0/networks/{network_id}.json?fields\u003dtags","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]"},{"line_number":140,"context_line":"    }"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    GET /v2.0/networks/{network_id}/tags"},{"line_number":145,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_91d5a6ba","line":142,"in_reply_to":"da85f559_9d9f2650","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Replace set of tags on a network ::"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    PUT /v2.0/networks/{network_id}/tags"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"with request payload ::"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_3dacfa8b","line":154,"updated":"2015-11-12 22:57:08.000000000","message":"similar here, let\u0027s keep it the same as any network update\n\nPUT /v2.0/networks/{network_id}\n\n{\n    \u0027tags\u0027: [\u0027foo\u0027, \u0027bar\u0027, \u0027baz\u0027]\n}","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"Replace set of tags on a network ::"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    PUT /v2.0/networks/{network_id}/tags"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"with request payload ::"},{"line_number":157,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_f1e432ad","line":154,"in_reply_to":"da85f559_3dacfa8b","updated":"2015-12-01 09:55:25.000000000","message":"Done","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":167,"context_line":""},{"line_number":168,"context_line":"If the number of tags exceeds the limit of tags per network, shall return"},{"line_number":169,"context_line":"a `400 Bad Request`"},{"line_number":170,"context_line":"(tags limit is either hard coded or configurable in neutron conf file)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Add a single tag on a network ::"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_5da9be7a","line":170,"updated":"2015-11-12 22:57:08.000000000","message":"we should look at using the quota engine for this. I\u0027m not sure how easy it is to integrate, but at least chat with Salvatore about it before we add an arbitrary restriction or another config knob.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Add a single tag on a network ::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Returns `201 Created`."},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_fdb432d5","line":174,"updated":"2015-11-12 22:57:08.000000000","message":"Having this type of logic living underneath the \u0027network\u0027 endpoint will be difficult with the current way requests are dispatched.\nWould you consider changing \u0027/tags/\u0027 to the top-level so it doesn\u0027t need to be intertwined with the core plugin update_network code? So a create would become:\n\nPUT /v2.0/tags/networks/{network_id}/{tag}\n\n\nIf not, I think we will need to do some work on the core API to handle separate endpoints for sub-resources.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Add a single tag on a network ::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    PUT /v2.0/networks/{network_id}/tags/{tag}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Returns `201 Created`."},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_d1c00ee3","line":174,"in_reply_to":"da85f559_fdb432d5","updated":"2015-12-01 09:55:25.000000000","message":"Agree, changed to reflect it","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"ef89242db6833ee39fabfcff47342e72633800a3","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":261,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"References"},{"line_number":264,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":265,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_f52850e4","line":262,"updated":"2015-11-10 19:33:48.000000000","message":"Do you plan to add cli commands?","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b182e7f88d878e3c7cde454e92fc85bd74fc40dd","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":261,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"References"},{"line_number":264,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":265,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_1dba56c1","line":262,"updated":"2015-11-12 22:57:08.000000000","message":"This needs CLI support. If it\u0027s difficult to add to the CLI that means that the API structure has diverged too much from the existing stuff. Allowing features to merge without any intention for CLI support is setting up a terrible user experience.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"193dc758a5f5c3c794578713a8858088fd28582e","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":261,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"References"},{"line_number":264,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":265,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"9a8ffd7b_0c319dec","line":262,"in_reply_to":"da85f559_1dba56c1","updated":"2015-12-01 09:55:25.000000000","message":"I didnt mean to imply in anyway that CLI is not needed, i just dont see how re-writing this spec with CLI commands is important right now.\n(Should be very similar to the REST calls)\nWe can iterate/discuss about it in the patch it self or add this here once the other tasks are done.\n\nI dont see anything a lot different/complex then any other CLI (but maybe i am wrong)","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"78ef5fb4c314b7836206d482cfea6f940b1b52e2","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":261,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"References"},{"line_number":264,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":265,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_5bbfbd60","line":262,"in_reply_to":"da85f559_71a8c68d","updated":"2015-11-12 07:09:44.000000000","message":"I think CLI commands or at least the intention to have such is good to mention in the spec, since it have impact on the end user and implies work item","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"6699b3634a5fadd95113160a2d991daa3db8d705","unresolved":false,"context_lines":[{"line_number":259,"context_line":""},{"line_number":260,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":261,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"References"},{"line_number":264,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":265,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":13,"id":"da85f559_71a8c68d","line":262,"in_reply_to":"da85f559_f52850e4","updated":"2015-11-11 16:32:59.000000000","message":"We probably will want to add support for this in the CLI, i don\u0027t however see it as high priority.\n\nI also don\u0027t think its that interesting to list them here, i guess they will be very similar to the REST calls.\nOnce this finally gets approved we can start iterating on what is the CLI commands syntax.","commit_id":"35c76a71711e567ac817e7f1d57cfef531246ad1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24bf91ebe9daffd52747a1a6cf1e848657621677","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":75,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":76,"context_line":"        standard_attribute_id BIGINT NOT NULL FOREIGN KEY,"},{"line_number":77,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_de3ddfc4","line":77,"updated":"2015-12-08 17:16:35.000000000","message":"in face of [1], I wonder if this should be called project_id.\n\n[1] https://blueprints.launchpad.net/neutron/+spec/keystone-v3","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"f5ae73c8773d588d40925d7412774cefbbfe5d95","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":75,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":76,"context_line":"        standard_attribute_id BIGINT NOT NULL FOREIGN KEY,"},{"line_number":77,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_864885b4","line":77,"in_reply_to":"7a740942_de3ddfc4","updated":"2015-12-13 13:56:34.000000000","message":"good idea, will change","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24bf91ebe9daffd52747a1a6cf1e848657621677","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"},{"line_number":81,"context_line":"    );"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_3e7e636a","line":80,"updated":"2015-12-08 17:16:35.000000000","message":"If the relationship between resource and tags is 0 to many, then the primary key of this table should be (standart_attribute_id, id). Not sure I fully understand the reason for this unique constraint either. Can you elaborate?","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"f5ae73c8773d588d40925d7412774cefbbfe5d95","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"},{"line_number":81,"context_line":"    );"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_c600cd36","line":80,"in_reply_to":"7a740942_3e7e636a","updated":"2015-12-13 13:56:34.000000000","message":"I am actually not sure if resource_id is really needed now that we have standard_attribute_id (Kevin?)\n\nWith standard attribute i guess this constraint is no longer needed","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        tenant_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"        CONSTRAINT resource_tenant_tag_constraint UNIQUE (resource_id, tenant_id, tag)"},{"line_number":81,"context_line":"    );"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_ce0bffd4","line":80,"in_reply_to":"7a740942_c600cd36","updated":"2015-12-21 11:36:34.000000000","message":"Even if not, I would not worry too much about adding it.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24bf91ebe9daffd52747a1a6cf1e848657621677","unresolved":false,"context_lines":[{"line_number":92,"context_line":"In this table schema resource_id represent the UUID of the Neutron resource"},{"line_number":93,"context_line":"and the tag is a string value attached to this resource."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":96,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":97,"context_line":"standard_attribute_id reference the Neutron resource entry in that common table"},{"line_number":98,"context_line":"for every tag entry we add."}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_be8a5362","line":95,"updated":"2015-12-08 17:16:35.000000000","message":"This is completed now.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"f5ae73c8773d588d40925d7412774cefbbfe5d95","unresolved":false,"context_lines":[{"line_number":92,"context_line":"In this table schema resource_id represent the UUID of the Neutron resource"},{"line_number":93,"context_line":"and the tag is a string value attached to this resource."},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"There is a process taking place in Neutron to create a common resource object which"},{"line_number":96,"context_line":"is saved in the DB. view `common neutron object`_ for more details."},{"line_number":97,"context_line":"standard_attribute_id reference the Neutron resource entry in that common table"},{"line_number":98,"context_line":"for every tag entry we add."}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_66f9d94d","line":95,"in_reply_to":"7a740942_be8a5362","updated":"2015-12-13 13:56:34.000000000","message":"will fix wording","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Tags are private to the tenant that added them, this is why tenant_id is needed"},{"line_number":108,"context_line":"per entry."}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_cee3ffd7","line":105,"range":{"start_line":105,"start_character":26,"end_line":105,"end_character":34},"updated":"2015-12-21 11:36:34.000000000","message":"I am not entirely sure what you mean here... what is an invalid entry?","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"410f27ec35ce5a679504c8fbca383e8211269c3b","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"It is important to note that invalid entries do not introduce invalid behaviour as"},{"line_number":104,"context_line":"the process of searching/filtering tags also involves fetching the resource itself."},{"line_number":105,"context_line":"(the API requests are per resource type)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Tags are private to the tenant that added them, this is why tenant_id is needed"},{"line_number":108,"context_line":"per entry."}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_ae28cc9a","line":105,"range":{"start_line":105,"start_character":26,"end_line":105,"end_character":34},"in_reply_to":"3a7e1126_cee3ffd7","updated":"2015-12-22 06:06:36.000000000","message":"This was suppose to be deleted, will remove in next patch, basically what i meant by \"invalid entries\" are when we still have the tag entry but the resource itself is already deleted","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Add a single tag on a network ::"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Returns `201 Created`."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_8e5c177e","line":165,"updated":"2015-12-21 11:36:34.000000000","message":"I would do this in a second step. You can keep it in this spec but as you surely have noticed neutron does not really have something in its framework to handle multi-value attributes like tags through the API.\n\nI leave to you to explain why you reckon a PUT is better than a POST here ;)","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a1873d0866658aab37daecd275bdb8e14225975a","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"Add a single tag on a network ::"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Returns `201 Created`."},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_2d12b857","line":165,"in_reply_to":"3a7e1126_8e5c177e","updated":"2015-12-21 16:57:40.000000000","message":"ignore comment","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    GET /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Returns `204 No Content` if tag exist on a network."},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_ee2efba3","line":174,"updated":"2015-12-21 11:36:34.000000000","message":"Franky I do not get what the use case for this is.\n\nCompared with GET /V2.0/networks/{network_id}.json?fields\u003dtags you will be saving a few tens of bytes in bandwidth if all you need to do is check for a single tag... but this sounds really \"meh\"","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a1873d0866658aab37daecd275bdb8e14225975a","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    GET /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Returns `204 No Content` if tag exist on a network."},{"line_number":177,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_ad530816","line":174,"in_reply_to":"3a7e1126_ee2efba3","updated":"2015-12-21 16:57:40.000000000","message":"ignore comment\n\n(I still do not get the use case, but ignore it!)","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Remove all tags on a network ::"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Returns `204 No Content`."},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_c9a1b9f9","line":189,"updated":"2015-12-21 11:36:34.000000000","message":"Why the tags prefix? (this question applies not just to this example).\n\nNote that you could achieve the same with:\n\n PUT /v2.0/networks/\u003cnetwork_id\u003e\n\n{\u0027tags\u0027: []}","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a1873d0866658aab37daecd275bdb8e14225975a","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Remove all tags on a network ::"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Returns `204 No Content`."},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_ed459042","line":189,"in_reply_to":"3a7e1126_c9a1b9f9","updated":"2015-12-21 16:57:40.000000000","message":"The guideline does not have the tag prefix...","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"410f27ec35ce5a679504c8fbca383e8211269c3b","unresolved":false,"context_lines":[{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Remove all tags on a network ::"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Returns `204 No Content`."},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_8945ca43","line":189,"in_reply_to":"3a7e1126_ed459042","updated":"2015-12-22 06:06:36.000000000","message":"From the envisioned use cases, i dont want to add code that fetch tags (from the tag table) for every resource in Neutron.\n\nNot every resource going to have tags in it, only when the user specifically try to query/add/delete tags, and then the first action will be to search and update the tag table\n\nSo i am unsure we want to read/write tags unless the user specify it explicitly","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":201,"context_line":"To request the list of networks that have a single tag, ``tags`` argument"},{"line_number":202,"context_line":"should be set to the desired tag name. Example::"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    GET /v2.0/networks?tags\u003dred"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"To request the list of networks that have two or more tags, the ``tags``"},{"line_number":207,"context_line":"argument should be set to the list of tags, separated by commas. In this"}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_09e2612f","line":204,"updated":"2015-12-21 11:36:34.000000000","message":"This will require you to do some changes in the API framework, because tags is a list and the filtering mechanism will try and do exact match instead.\n\nHow will you solve this?","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"410f27ec35ce5a679504c8fbca383e8211269c3b","unresolved":false,"context_lines":[{"line_number":201,"context_line":"To request the list of networks that have a single tag, ``tags`` argument"},{"line_number":202,"context_line":"should be set to the desired tag name. Example::"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    GET /v2.0/networks?tags\u003dred"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"To request the list of networks that have two or more tags, the ``tags``"},{"line_number":207,"context_line":"argument should be set to the list of tags, separated by commas. In this"}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_a9b2064a","line":204,"in_reply_to":"3a7e1126_09e2612f","updated":"2015-12-22 06:06:36.000000000","message":"This suppose to search the tags table and bring all entries which are networks and tag value is red, we have an entry in the tag table per tag, so if a specific network has 2 tags it will have 2 entries in the tag table","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"71fb13d72f13ebe753a31017a23f79ff96721c89","unresolved":false,"context_lines":[{"line_number":217,"context_line":"network will be included in the query result. Example that returns the networks"},{"line_number":218,"context_line":"that have the \"red\" or the \"blue\" tag::"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    GET /v2.0/networks?tags-any\u003dred,blue"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"To request the list of networks that do not have one or more tags, the"},{"line_number":223,"context_line":"``not-tags`` argument should be set to the list of tags, separated by commas."}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_e91fd5b4","line":220,"updated":"2015-12-21 11:36:34.000000000","message":"Do we really need to introduce special filtering keywords :-|\nDo you have a reference to API that behave like this?\n\nIf you really need AND/OR/NOT, it should be part of the value of the query parameter in my opinion.\n\nThe semantics of query parameters is not unique in RESTful APIs. In Neutron we have been using AND as a convention when multiple parameters are specified.\n\nTherefore the case where you need a resource with multiple tags could be:\n\nGET /v2.0/networks?tags\u003dred\u0026tags\u003dblue\n\n(I agree this however suggests more OR, so we might reconsider, but we also need to keep consistency in mind)\n\nWhen you need any resource with one or more of the tags:\n\nGET /v2.0/networks?tags\u003dred,blue\n\n(I agree this might suggests more AND as well...)\n\nAnd finally for negation:\n\nGET /v2.0/networks?tags\u003d~red\n\nSo if you want a resource which is blue but not red:\n\nGET /v2.0/networks?tags\u003d~red\u0026tags\u003dblue\n\nIf you need a resource that can be either blue or different from red, but surely green:\n\nGET /v2.0/networks?tags\u003d~red,blue\u0026tags\u003dgreen\n\nAnd if you need a resource with no tags... \nwell I don\u0027t know how to specify this case if not by introducing [], which might be a good idea after all.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a1873d0866658aab37daecd275bdb8e14225975a","unresolved":false,"context_lines":[{"line_number":217,"context_line":"network will be included in the query result. Example that returns the networks"},{"line_number":218,"context_line":"that have the \"red\" or the \"blue\" tag::"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    GET /v2.0/networks?tags-any\u003dred,blue"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"To request the list of networks that do not have one or more tags, the"},{"line_number":223,"context_line":"``not-tags`` argument should be set to the list of tags, separated by commas."}],"source_content_type":"text/x-rst","patch_set":15,"id":"3a7e1126_2d6718ea","line":220,"in_reply_to":"3a7e1126_e91fd5b4","updated":"2015-12-21 16:57:40.000000000","message":"ignore","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"d5be0c19591847ab73d07b9be84966a8bd546134","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":252,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"References"},{"line_number":255,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":256,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"9a8ffd7b_8b948ae8","line":253,"updated":"2015-12-01 12:36:27.000000000","message":"Sorry to raise CLI question again. There is no need to enter into exact semantics of the commands, but I think it\u0027s good to have a note in the spec that CLI commands are expected to be provided. This will set a user expectations and clarify the scope of the work.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"f5ae73c8773d588d40925d7412774cefbbfe5d95","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":252,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"References"},{"line_number":255,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":256,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_6690f9ed","line":253,"in_reply_to":"7a740942_1e0e07e5","updated":"2015-12-13 13:56:34.000000000","message":"ok, will add some examples","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"00f392a8460d4f460359343444e21b09d33994fe","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":252,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"References"},{"line_number":255,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":256,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"9a8ffd7b_c2a43ea7","line":253,"in_reply_to":"9a8ffd7b_8b948ae8","updated":"2015-12-03 05:31:43.000000000","message":"Irena, as far as i am concern you can always raise issues :) no need to apologize.\n\nI will add this as you suggest, i wanted to do it and forgot.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"24bf91ebe9daffd52747a1a6cf1e848657621677","unresolved":false,"context_lines":[{"line_number":250,"context_line":""},{"line_number":251,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":252,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"References"},{"line_number":255,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":256,"context_line":".. _resource tagging: http://en.wikipedia.org/wiki/Tag_(metadata)"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7a740942_1e0e07e5","line":253,"in_reply_to":"9a8ffd7b_c2a43ea7","updated":"2015-12-08 17:16:35.000000000","message":"it\u0027d be good to have a glimpse on the commands that must be implemented for these API\u0027s to be exercised.","commit_id":"a8f9d490b2569401347bc8a3ea7563f697629a07"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c1142bc9ff829480e6f5288f75f14eef237f92f4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"For the database schema, the following table constructs would suffice::"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    CREATE TABLE tags ("},{"line_number":74,"context_line":"        id CHAR(36) NOT NULL PRI KEY,"},{"line_number":75,"context_line":"        resource_id CHAR(36) NOT NULL MUL KEY,"},{"line_number":76,"context_line":"        standard_attribute_id BIGINT NOT NULL FOREIGN KEY,"},{"line_number":77,"context_line":"        project_id VARCHAR(255) NOT NULL MUL KEY,"},{"line_number":78,"context_line":"        tag VARCHAR(60) NOT NULL CHARACTER SET utf8"},{"line_number":79,"context_line":"         COLLATION utf8_ci PRIMARY KEY,"},{"line_number":80,"context_line":"    );"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a5ae5dd_42bd4a01","line":79,"range":{"start_line":74,"start_character":8,"end_line":79,"end_character":39},"updated":"2016-02-09 06:46:31.000000000","message":"Feedback from PoC implementation: standard_attribute_id and tag only what we need.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"b7172cdee3d3e4706ec88b538ef5dd774923e57c","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Tags are private to the project that added them, this is why project_id is needed"},{"line_number":103,"context_line":"per entry."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":106,"context_line":"to tag resources."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba63e191_c0fff432","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":5},"updated":"2016-01-18 23:32:54.000000000","message":"Could you clarify? project_id will be resource project_id or the project_id used by the user when adding the tag?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d9aff5cad8ebadbdb342d9b886a63a422d7fb1b1","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Tags are private to the project that added them, this is why project_id is needed"},{"line_number":103,"context_line":"per entry."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":106,"context_line":"to tag resources."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_1e7f4aab","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":5},"in_reply_to":"9a68dd71_9e0be423","updated":"2016-02-15 23:38:48.000000000","message":"Fine for me, i just want to ensure we don\u0027t want to allow to define tags hidden to normal users using a project !\u003d resource-project","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af27e319459444338d2724fc1198f510dc45dfef","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Tags are private to the project that added them, this is why project_id is needed"},{"line_number":103,"context_line":"per entry."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":106,"context_line":"to tag resources."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"9a68dd71_9e0be423","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":5},"in_reply_to":"ba63e191_a95aa84e","updated":"2016-01-25 07:22:32.000000000","message":"Reality is I am pretty sure the actual schema is not going to look like the one reported in this spec. You\u0027re also right that the project_id might end up being omitted as being tracked in the resource\u0027s model.\n\nHaving said that, the bottom is this: each resource will have a one-to-many relationship to tags (e.g. a network can have 0 or more tags associated to it). The logical schema will have to translate this conceptual relationship. This will be translated according to notes [1], where a new tags table will be made available. This will have a foreign key constraint to standard_attribute_id and it may \u0027cache\u0027 resource_id and project_id/tenant_id to save the cost of a join but that\u0027s a logical schema optimization.\n\n[1] http://docs.openstack.org/developer/neutron/devref/db_layer.html#the-standard-attribute-table","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"5adb779582c15d7f86c94090e1edfdb6356c6f66","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Tags are private to the project that added them, this is why project_id is needed"},{"line_number":103,"context_line":"per entry."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":106,"context_line":"to tag resources."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"ba63e191_a95aa84e","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":5},"in_reply_to":"ba63e191_c0fff432","updated":"2016-01-20 00:22:46.000000000","message":"I want a little more detailed explanation too.\nIf project_id is same as resource\u0027s, it is not necessary to store to tags table.\nIf project_id is (admin)user\u0027s adding the tag and it is not same as resource\u0027s, does it mean it is not visible to non-admin users ? Or it is visible to non-admin users but they cannot be deleted (I think it is reasonable than not-visible) ?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"af27e319459444338d2724fc1198f510dc45dfef","unresolved":false,"context_lines":[{"line_number":102,"context_line":"Tags are private to the project that added them, this is why project_id is needed"},{"line_number":103,"context_line":"per entry."},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Admin user can still introduce conflicts with this solution if it chooses"},{"line_number":106,"context_line":"to tag resources."},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"REST API Impact"}],"source_content_type":"text/x-rst","patch_set":16,"id":"9a68dd71_0b2fb8a1","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":5},"in_reply_to":"ba63e191_c0fff432","updated":"2016-01-25 07:22:32.000000000","message":"it\u0027s both: it\u0027s the resource\u0027s owner.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c1142bc9ff829480e6f5288f75f14eef237f92f4","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Replace set of tags on a network ::"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    PUT /v2.0/networks/{network_id}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"with request payload ::"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a5ae5dd_a2475e1c","line":140,"range":{"start_line":140,"start_character":4,"end_line":140,"end_character":35},"updated":"2016-02-09 06:46:31.000000000","message":"Maybe, you mean \"PUT /v2.0/tags/networks/{network_id}\"?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"Replace set of tags on a network ::"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    PUT /v2.0/networks/{network_id}"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"with request payload ::"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_7edc5ce4","line":140,"range":{"start_line":140,"start_character":4,"end_line":140,"end_character":35},"in_reply_to":"5a5ae5dd_a2475e1c","updated":"2016-02-12 06:17:57.000000000","message":"If we regard tag as an attribute of the network resource, this sunds reasonable.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c1142bc9ff829480e6f5288f75f14eef237f92f4","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Add a single tag on a network ::"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a5ae5dd_a21c3e14","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":46},"updated":"2016-02-09 06:46:31.000000000","message":"Feedback from PoC implementation: I prefer \"/v2.0/networks/{network_id}/tags/{tag}\" and it follows api-wg. I believe that it\u0027s reasonable rather than \"/v2.0/tags/networks/{network_id}/{tag}\".","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f3bc86c72bb3c976fcddf7e1e3c79c598a1646e8","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Add a single tag on a network ::"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_9c3ec0d8","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":46},"in_reply_to":"3a57f1b5_0b9873bf","updated":"2016-02-12 06:30:38.000000000","message":"API-WG suggests PUT. Please ignore it.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6b0ce94bf81c5f1f7ab8879e33e5c41b41c0e156","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Add a single tag on a network ::"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_06471cbc","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":46},"in_reply_to":"3a57f1b5_9c3ec0d8","updated":"2016-02-15 12:33:46.000000000","message":"By the way we should definitely change the URI as suggested by Hirofumi. This for respect of the API-wg guideline, but mostly for common sense and API consistency!!!","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Add a single tag on a network ::"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    PUT /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_0b9873bf","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":46},"in_reply_to":"5a5ae5dd_a21c3e14","updated":"2016-02-12 06:17:57.000000000","message":"Generally agree with Hirofumi, but PUT to /networks/{id}/tags/{tag} to add a new tag.\nWhen considering /networks/{id}/tags as collection,\nPUT sounds odd, POST sounds good to me.\n\nWhat does API-WG suggest now?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"c1142bc9ff829480e6f5288f75f14eef237f92f4","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"5a5ae5dd_a2e3de04","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"updated":"2016-02-09 06:46:31.000000000","message":"I prefer \"409 Conflict\".","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f3bc86c72bb3c976fcddf7e1e3c79c598a1646e8","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_fc2d74a8","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"3a57f1b5_0176eb05","updated":"2016-02-12 06:30:38.000000000","message":"API-WG suggests 204.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"7cb6a47df39d075bd021d1f305885379bd658930","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_75234206","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"3a57f1b5_fc2d74a8","updated":"2016-02-15 04:02:27.000000000","message":"API-WG doesn\u0027t it.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_0176eb05","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"5a5ae5dd_a2e3de04","updated":"2016-02-12 06:17:57.000000000","message":"I guess the author wants to avoid an error.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"ac15f94b0e7ecb72f9e02563bd5fce8ff76cb458","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_e72129fd","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"dae33548_3edcce11","updated":"2016-02-16 10:01:36.000000000","message":"@Salvatore Orlando: We may get 201 or 204. I doesn\u0027t think that it\u0027s idempotent. If we make API idempotent, we should return 201 here.\n\n@Cedric Brandily: I think that we should follows the reference as well but it says \"If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.\" and this case doesn\u0027t modify existing resource so the rule isn\u0027t applied.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":4149,"name":"Itsuro Oda","email":"oda@valinux.co.jp","username":"oda-g"},"change_message_id":"439f336cde1cd040ea719630688b08a7ea7c6e33","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_c3e86b7f","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"dae33548_66dd4814","updated":"2016-02-15 22:57:13.000000000","message":"hi all,\n\nIs it necessary to distinguish whether a tag already exists or not ?\nMy vote is 201 regardless a tag exists or not (according to api-wg guideline).","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7847c34cae721c134b6278d38c1f80d1b6b06865","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_de622bad","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"dae33548_75234206","updated":"2016-02-15 07:05:38.000000000","message":"409 sounds good to me now.\n\nI re-checked API-WG guideline and I was wrong.\nIt suggests 201 when a requested tag is created successfully [1].\nThere is no suggestion when a requested tag already exists.\nL.164 is this case. 409 sounds good.\n\n[1] http://specs.openstack.org/openstack/api-wg/guidelines/tags.html#addressing-individual-tags","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d9aff5cad8ebadbdb342d9b886a63a422d7fb1b1","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_3edcce11","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"dae33548_c3e86b7f","updated":"2016-02-15 23:38:48.000000000","message":"I believe api-wg follows HTTP RFC[1]: we should return different codes when the resource is created (201) or updated (200/204).\n\n\n[1] from https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html :\n\n The PUT method [...] If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to indicate successful completion of the request.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"6b0ce94bf81c5f1f7ab8879e33e5c41b41c0e156","unresolved":false,"context_lines":[{"line_number":162,"context_line":"Returns `201 Created`."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"If the tag already exists, no error is raised, it just returns the"},{"line_number":165,"context_line":"`204 No Content`"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_66dd4814","line":165,"range":{"start_line":165,"start_character":0,"end_line":165,"end_character":16},"in_reply_to":"dae33548_de622bad","updated":"2016-02-15 12:33:46.000000000","message":"I would consider the idea of keeping 204 no content.\nThis is because one might expect this kind of operations to be idempotent.\n\nwhat is the conflict if I apply again a tag that\u0027s already applied?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    GET /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Returns `204 No Content` if tag exist on a network."},{"line_number":172,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_e1806fc2","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":46},"updated":"2016-02-12 06:17:57.000000000","message":"Can\u0027t we use GET /networks/{network_id} ?\n\nOr GET /networks/{network_id}/tags/{tag}","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"f3bc86c72bb3c976fcddf7e1e3c79c598a1646e8","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"Check if a tag exists or not on a network ::"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    GET /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"Returns `204 No Content` if tag exist on a network."},{"line_number":172,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_5713415b","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":46},"in_reply_to":"3a57f1b5_e1806fc2","updated":"2016-02-12 06:30:38.000000000","message":"API-WG does not define this case.\nAt the moment, I am not sure \nGET /v2.0/tags/networks/{network_id}/tags{tag}","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":"Remove a single tag on a network ::"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    DELETE /v2.0/tags/networks/{network_id}/{tag}"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"Returns `204 No Content` upon success. Returns a `404 Not Found` if you"},{"line_number":180,"context_line":"attempt to delete a tag that does not exist."}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_01926bf6","line":177,"range":{"start_line":177,"start_character":3,"end_line":177,"end_character":49},"updated":"2016-02-12 06:17:57.000000000","message":"If we use\n\n  POST /networks/{id}/tags/{tag}\n\nto add a new tag to a network resource,\nwe can delete a single tag from a network by\n\n  DELETE /networks/{id}/tags/{tag}","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Remove all tags on a network ::"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"Returns `204 No Content`."},{"line_number":187,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_e1f5cf56","line":184,"updated":"2016-02-12 06:17:57.000000000","message":"My general question is whether we need \"/tags\" as a top resource.\nIf we want to delete all tags on a network, we can PUT an empty tag list [] to a network.\n\n  {\u0027networks\u0027:\n     {\u0027tags\u0027: []}\n   }","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"57590719adf2348ac29b127bb0d85cab8265595c","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Remove all tags on a network ::"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"Returns `204 No Content`."},{"line_number":187,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_f78eed77","line":184,"in_reply_to":"3a57f1b5_e1f5cf56","updated":"2016-02-12 06:44:58.000000000","message":"If we regard tag as attribute, that\u0027s right. I guess that tag closes sub-resource rather than attributes so api-wg prepared DELETE method .","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"3945160ca2f2868907fc0135eaf1515503793a71","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":"Remove all tags on a network ::"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    DELETE /v2.0/tags/networks/{network_id}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"Returns `204 No Content`."},{"line_number":187,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_d796513e","line":184,"in_reply_to":"3a57f1b5_f78eed77","updated":"2016-02-12 07:02:23.000000000","message":"Yes, API-WG guideline is consistent and it looks better to follow API-WG guideline (if our implementation allows it).\n\nWhen I looked at L.140, I thought \"tags\" attribute is writable\nand wrote this comment.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    GET /v2.0/networks?tags\u003dblue\u0026not-tags\u003dblue"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":247,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"CLI Examples"},{"line_number":250,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_3cc78c97","line":247,"updated":"2016-02-12 06:17:57.000000000","message":"One thing to note.\n\nIn the current neutron API framework, when a field is specified multiple times, it will be converted into a list.\n\nFor example, /v2.0/networks?name\u003dnet1\u0026name\u003dnet2\nis converted into {\u0027name\u0027: [\u0027net1\u0027, \u0027net2\u0027]} and this value is passed as \"filters\" parameter to a corresponding plugin.\n\nThe same thing applies to \"tags\" query.\n\nIf a URL is /v2.0/networks?tags\u003dred,blue\u0026tags\u003dgreen,yellow\nit will be converted into {\"targs\": [\"red,blue\"], [\"green,yellow\"]} to a plugin implementation.\n\nI think it is valid and it will return networks which have \"red\" and \"blue\" tags and networks which have \"green\" and \"yellow\" tags.\n\nDoes it make sense?","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"ac15f94b0e7ecb72f9e02563bd5fce8ff76cb458","unresolved":false,"context_lines":[{"line_number":244,"context_line":"    GET /v2.0/networks?tags\u003dblue\u0026not-tags\u003dblue"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"In this case we should let Neutron find these networks. Obviously"},{"line_number":247,"context_line":"there are no such networks and Neutron will return an empty list."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"CLI Examples"},{"line_number":250,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_0cba72c0","line":247,"in_reply_to":"3a57f1b5_3cc78c97","updated":"2016-02-16 10:01:36.000000000","message":"Yes, I think so.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d9aff5cad8ebadbdb342d9b886a63a422d7fb1b1","unresolved":false,"context_lines":[{"line_number":251,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":252,"context_line":"might look like::"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"   neutron tag-create --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":255,"context_line":"   neutron tag-delete --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":256,"context_line":"   neutron tag-list --resource_type network --tag blue"},{"line_number":257,"context_line":"   neutron tag-list --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_5e655243","line":254,"range":{"start_line":254,"start_character":15,"end_line":254,"end_character":21},"updated":"2016-02-15 23:38:48.000000000","message":"tag-create is a bit confusing as someone could assume it crashs if the tag is already defined, tag-add seems better?\n\nMoreover i would prefer we use the format:\n\n neutron tag-create --resource-type network --resource \u003cnetwork-id-or-name\u003e ...\n\nApplications love uuids, not us :)","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d9aff5cad8ebadbdb342d9b886a63a422d7fb1b1","unresolved":false,"context_lines":[{"line_number":253,"context_line":""},{"line_number":254,"context_line":"   neutron tag-create --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":255,"context_line":"   neutron tag-delete --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":256,"context_line":"   neutron tag-list --resource_type network --tag blue"},{"line_number":257,"context_line":"   neutron tag-list --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_9eed1a8e","line":256,"range":{"start_line":256,"start_character":11,"end_line":256,"end_character":14},"updated":"2016-02-15 23:38:48.000000000","message":"What return \"tag-list ... --tag blue\"? All \"blue\" resources of a certain type? It seems such query can be done using:\n\n neutron net/subnet/port-list --tag blue","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"85d233b038737935b0894fe346a421bb7511ae7e","unresolved":false,"context_lines":[{"line_number":251,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":252,"context_line":"might look like::"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"   neutron tag-create --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":255,"context_line":"   neutron tag-delete --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":256,"context_line":"   neutron tag-list --resource_type network --tag blue"},{"line_number":257,"context_line":"   neutron tag-list --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"References"},{"line_number":260,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"3a57f1b5_1cc4105d","line":257,"range":{"start_line":254,"start_character":3,"end_line":257,"end_character":94},"updated":"2016-02-12 06:17:57.000000000","message":"If we have \"tags\" attribute as a sub resource of network.\nit seems natural to enhance net-* commands.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d9aff5cad8ebadbdb342d9b886a63a422d7fb1b1","unresolved":false,"context_lines":[{"line_number":251,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":252,"context_line":"might look like::"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"   neutron tag-create --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":255,"context_line":"   neutron tag-delete --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":256,"context_line":"   neutron tag-list --resource_type network --tag blue"},{"line_number":257,"context_line":"   neutron tag-list --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"References"},{"line_number":260,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_7e95b6e2","line":257,"range":{"start_line":254,"start_character":3,"end_line":257,"end_character":94},"in_reply_to":"3a57f1b5_1cc4105d","updated":"2016-02-15 23:38:48.000000000","message":"it implies to define resource-tag-create/delete/list for each resource type","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"ac15f94b0e7ecb72f9e02563bd5fce8ff76cb458","unresolved":false,"context_lines":[{"line_number":251,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":252,"context_line":"might look like::"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"   neutron tag-create --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":255,"context_line":"   neutron tag-delete --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b --tag blue"},{"line_number":256,"context_line":"   neutron tag-list --resource_type network --tag blue"},{"line_number":257,"context_line":"   neutron tag-list --resource_type network --resource_id 8953d683-29ad-4be3-b73f-060727c7849b"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"References"},{"line_number":260,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dae33548_676fd9c5","line":257,"range":{"start_line":254,"start_character":3,"end_line":257,"end_character":94},"in_reply_to":"dae33548_7e95b6e2","updated":"2016-02-16 10:01:36.000000000","message":"I agree with Akihiro\u0027s suggestion.","commit_id":"6e5308eab8aff98c79e3d373f8219bd59af111ce"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"a739f461c4c17e2afdce37bdb34cf314b54be5ab","unresolved":false,"context_lines":[{"line_number":244,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron net-update \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron net-delete \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":17,"id":"dae33548_2ad755c0","line":247,"updated":"2016-02-16 10:41:42.000000000","message":"is this \"PUT /v2.0/networks/{network_id}/tags\"?\n\nor \"PUT /v2.0/networks/{network_id}/tags/{tag}\"?","commit_id":"3ea2e3f78055156a8a2ca0ddf3fc7f1f0c9a3648"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"a739f461c4c17e2afdce37bdb34cf314b54be5ab","unresolved":false,"context_lines":[{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron net-update \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron net-delete \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":17,"id":"dae33548_aa636540","line":248,"updated":"2016-02-16 10:41:42.000000000","message":"this means to delete a network with the tag?\nwhat happens if multiple networks have the tag?","commit_id":"3ea2e3f78055156a8a2ca0ddf3fc7f1f0c9a3648"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"a25659e66be35e492e1a9df734437d87bdfe7fb1","unresolved":false,"context_lines":[{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron net-update \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron net-delete \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":17,"id":"dae33548_6dc4d75e","line":248,"in_reply_to":"dae33548_aa636540","updated":"2016-02-16 10:50:04.000000000","message":"Umm...That\u0027s right. Maybe we prefer tag-delete.","commit_id":"3ea2e3f78055156a8a2ca0ddf3fc7f1f0c9a3648"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"9a087730f8946444174490f51475070c721da488","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    GET /V2.0/networks/{network_id}.json?fields\u003dtags"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Response ::"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_9b5a0c4f","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":22},"updated":"2016-02-17 00:24:55.000000000","message":"It\u0027s a bit strange to support:\n\n GET /networks/{network_id}?fields\u003dtags\n PUT /networks/{network_id}/tags\n GET /networks/{network_id}/tags/{tag}\n PUT /networks/{network_id}/tags/{tag}\n DELETE /networks/{network_id}/tags/{tag}\n\nbut not:\n\n GET /networks/{network_id}/tags","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"6693cc01979c511e9160d1c85f92c964e23aa2d2","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    GET /V2.0/networks/{network_id}.json?fields\u003dtags"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Response ::"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_ff56915a","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":22},"in_reply_to":"dae33548_3a4f756c","updated":"2016-02-17 09:47:07.000000000","message":"Fine for me","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2d33212c1d1fabb22dee8a95a3b8334dcf78a1f6","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    GET /V2.0/networks/{network_id}.json?fields\u003dtags"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Response ::"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_3a4f756c","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":22},"in_reply_to":"dae33548_96d783be","updated":"2016-02-17 03:27:34.000000000","message":"the reality is that we have to operate within the constraint of the API framework as we have it. Once we are conscious of this fact, I am sure certain guidelines can\u0027t be followed strictly.","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"e1d57452886c99199f506ad9b2fc3e5ba1cf3f44","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":"Get **only** a list of tags for the specified network ::"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    GET /V2.0/networks/{network_id}.json?fields\u003dtags"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"Response ::"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_96d783be","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":22},"in_reply_to":"dae33548_9b5a0c4f","updated":"2016-02-17 00:56:03.000000000","message":"I think so, too. I guess that neutron folks don\u0027t become familiar with these API because they were for cross projects. However we should follow them which were defined by API-WG.","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"9a087730f8946444174490f51475070c721da488","unresolved":false,"context_lines":[{"line_number":244,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron tag-create --resource_type network --resource \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron tag-delete --resource_type network --resource_id \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_5b16c455","line":247,"range":{"start_line":247,"start_character":24,"end_line":247,"end_character":37},"updated":"2016-02-17 00:24:55.000000000","message":"it should be: --resource-type and --resource","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"6693cc01979c511e9160d1c85f92c964e23aa2d2","unresolved":false,"context_lines":[{"line_number":244,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron tag-create --resource_type network --resource \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron tag-delete --resource_type network --resource_id \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_5f9cdd0e","line":247,"range":{"start_line":247,"start_character":24,"end_line":247,"end_character":37},"in_reply_to":"dae33548_0e47ca4b","updated":"2016-02-17 09:47:07.000000000","message":"Perhaps i was unclear but no need to respin for this remark","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4993c303e181830df1b83c965108e5463ec3b888","unresolved":false,"context_lines":[{"line_number":244,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron tag-create --resource_type network --resource \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron tag-delete --resource_type network --resource_id \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_0e47ca4b","line":247,"range":{"start_line":247,"start_character":24,"end_line":247,"end_character":37},"in_reply_to":"dae33548_11789d8e","updated":"2016-02-17 08:42:45.000000000","message":"CLI review can cover this :-)","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"e1d57452886c99199f506ad9b2fc3e5ba1cf3f44","unresolved":false,"context_lines":[{"line_number":244,"context_line":"The following examples are used to illustrate how the CLI for adding/deleting/searching tags"},{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron tag-create --resource_type network --resource \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron tag-delete --resource_type network --resource_id \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_11789d8e","line":247,"range":{"start_line":247,"start_character":24,"end_line":247,"end_character":37},"in_reply_to":"dae33548_5b16c455","updated":"2016-02-17 00:56:03.000000000","message":"OK. I will update if respin.","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"},{"author":{"_account_id":7715,"name":"Hirofumi Ichihara","email":"ichihara.hirofumi@gmail.com","username":"Hirofumi-Ichihara"},"change_message_id":"e1d57452886c99199f506ad9b2fc3e5ba1cf3f44","unresolved":false,"context_lines":[{"line_number":245,"context_line":"might look like::"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"   neutron tag-create --resource_type network --resource \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":248,"context_line":"   neutron tag-delete --resource_type network --resource_id \u003cnetwork-id-or-name\u003e --tag blue"},{"line_number":249,"context_line":"   neutron net-list --tag blue"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"References"}],"source_content_type":"text/x-rst","patch_set":18,"id":"dae33548_b169f1c0","line":248,"range":{"start_line":248,"start_character":22,"end_line":248,"end_character":60},"updated":"2016-02-17 00:56:03.000000000","message":"ditto.","commit_id":"222aec5e195f35b329b7ebf93df5bc1a2d0996e9"}]}
