)]}'
{"specs/keystone/ocata/project-metadata.rst":[{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"3f79c2cc7acf01b0e8858f5261933832220fa061","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Two use cases are outlined below:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Use Case 1. Post-Orchestration Processing"},{"line_number":26,"context_line":"------------------------------------------"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Operators may wish to perform post server orchestration processing, e.g.,"},{"line_number":29,"context_line":"retrieving and applying specific settings to all servers under a project."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_c76916c0","line":26,"range":{"start_line":26,"start_character":41,"end_line":26,"end_character":42},"updated":"2016-10-20 15:16:38.000000000","message":"nit: extra _","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"29be7f10f8549c6fc033ae65056184f6270796aa","unresolved":false,"context_lines":[{"line_number":229,"context_line":"Alternatives"},{"line_number":230,"context_line":"------------"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"1. Store the metadata external to keystone."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"   * Pro: No change to keystone required."},{"line_number":235,"context_line":"   * Con: Requires an external tool or work-around. This tool will need to be"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_c10cc244","line":232,"range":{"start_line":232,"start_character":0,"end_line":232,"end_character":43},"updated":"2016-10-19 21:33:39.000000000","message":"can quota limits be considered similar to project metadata? Because right now quota limits, as far as i see, not welcome in keystone :p","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"acf6ba463685ea4ab6d61cdd18b46a8812d7bb9d","unresolved":false,"context_lines":[{"line_number":229,"context_line":"Alternatives"},{"line_number":230,"context_line":"------------"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"1. Store the metadata external to keystone."},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"   * Pro: No change to keystone required."},{"line_number":235,"context_line":"   * Con: Requires an external tool or work-around. This tool will need to be"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_1eab5f76","line":232,"range":{"start_line":232,"start_character":0,"end_line":232,"end_character":43},"in_reply_to":"fa6399be_c10cc244","updated":"2016-10-20 14:27:46.000000000","message":"Not sure, currently the desire is to be able to store any metadata for the projects.","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"29be7f10f8549c6fc033ae65056184f6270796aa","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":"   * Pro: No additional SQL table modification is needed."},{"line_number":245,"context_line":"   * Con: The ``extra`` column currently stores some ancillary data,"},{"line_number":246,"context_line":"     e.g. user\u0027s email address. Allowing the API to modify this data"},{"line_number":247,"context_line":"     may cause conflicts. Security issues are also a concern."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"3. Add new text ``metadata`` column to the ``projects`` table."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_01595a5a","line":247,"range":{"start_line":246,"start_character":32,"end_line":247,"end_character":25},"updated":"2016-10-19 21:33:39.000000000","message":"what kind of conflicts?","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"29be7f10f8549c6fc033ae65056184f6270796aa","unresolved":false,"context_lines":[{"line_number":244,"context_line":"   * Pro: No additional SQL table modification is needed."},{"line_number":245,"context_line":"   * Con: The ``extra`` column currently stores some ancillary data,"},{"line_number":246,"context_line":"     e.g. user\u0027s email address. Allowing the API to modify this data"},{"line_number":247,"context_line":"     may cause conflicts. Security issues are also a concern."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"3. Add new text ``metadata`` column to the ``projects`` table."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_c15e8244","line":247,"range":{"start_line":247,"start_character":26,"end_line":247,"end_character":61},"updated":"2016-10-19 21:33:39.000000000","message":"what kind of security issues?","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"acf6ba463685ea4ab6d61cdd18b46a8812d7bb9d","unresolved":false,"context_lines":[{"line_number":244,"context_line":"   * Pro: No additional SQL table modification is needed."},{"line_number":245,"context_line":"   * Con: The ``extra`` column currently stores some ancillary data,"},{"line_number":246,"context_line":"     e.g. user\u0027s email address. Allowing the API to modify this data"},{"line_number":247,"context_line":"     may cause conflicts. Security issues are also a concern."},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"3. Add new text ``metadata`` column to the ``projects`` table."},{"line_number":250,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_de69e7bf","line":247,"range":{"start_line":247,"start_character":26,"end_line":247,"end_character":61},"in_reply_to":"fa6399be_c15e8244","updated":"2016-10-20 14:27:46.000000000","message":"Conflicts are with the current storing of emails in the extras field and the issue of accidentally overwriting that. Security-wise, there is this issue: https://bugs.launchpad.net/keystone/+bug/1576765","commit_id":"5a242711498ae66296f268cf00eac870004ee2f2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dbd12cc5d698b1fb5c7c8cd6c8126f5a6a0103e6","unresolved":false,"context_lines":[{"line_number":70,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":71,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":72,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":73,"context_line":"| extra         | varchar(255) | YES   |     | NULL    |"},{"line_number":74,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"ba5da102_3bbb3cc6","line":73,"range":{"start_line":73,"start_character":2,"end_line":73,"end_character":7},"updated":"2016-10-31 22:14:00.000000000","message":"probably not needed","commit_id":"d74478dc057e26601826969239f64efa30c16c2b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dbd12cc5d698b1fb5c7c8cd6c8126f5a6a0103e6","unresolved":false,"context_lines":[{"line_number":84,"context_line":"List all metadata for a specified project"},{"line_number":85,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"**Request:** ``GET /v3/projects/{project_id}/metadata``"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"**Parameters**"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"ba5da102_7bb5b4cb","line":87,"range":{"start_line":87,"start_character":45,"end_line":87,"end_character":53},"updated":"2016-10-31 22:14:00.000000000","message":"call it properties instead and you\u0027ve got my vote","commit_id":"d74478dc057e26601826969239f64efa30c16c2b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"dbd12cc5d698b1fb5c7c8cd6c8126f5a6a0103e6","unresolved":false,"context_lines":[{"line_number":183,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"**Request:** ``GET"},{"line_number":186,"context_line":"/v3/projects?meta[0].key\u003d{keyname}\u0026meta[0].value\u003d{valuename}\u0026meta[1].key\u003d{keyname}\u0026meta[1].value\u003d{valuename}``"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"**Parameters**"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"ba5da102_fbc1c42f","line":186,"range":{"start_line":186,"start_character":13,"end_line":186,"end_character":107},"updated":"2016-10-31 22:14:00.000000000","message":"ewwwwwww","commit_id":"d74478dc057e26601826969239f64efa30c16c2b"}],"specs/keystone/ocata/project-properties.rst":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":66,"context_line":"| project_id    | varchar(64)  | NO    | MUL | NULL    |"},{"line_number":67,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":68,"context_line":"| created_at    | datetime     | YES   |     | NULL    |"},{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_b1a3a44e","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":56},"updated":"2016-10-31 22:26:57.000000000","message":"whats the use case for having the timestamps? i\u0027d like to minimize writes to the keystone database","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"99fc40a4ff0d950f297f0b76d53729a62d733bf3","unresolved":false,"context_lines":[{"line_number":65,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":66,"context_line":"| project_id    | varchar(64)  | NO    | MUL | NULL    |"},{"line_number":67,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":68,"context_line":"| created_at    | datetime     | YES   |     | NULL    |"},{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_f43d0abc","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":56},"in_reply_to":"ba5da102_b1a3a44e","updated":"2016-10-31 23:12:06.000000000","message":"For audit purposes, these are hugely useful, and would only ever get written to when the value itself is also updated so should be a minor performance impact.\n\nPlease keep them. :)","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"72c692f0035e224efa131c151d03a31bf5ba7e28","unresolved":false,"context_lines":[{"line_number":65,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":66,"context_line":"| project_id    | varchar(64)  | NO    | MUL | NULL    |"},{"line_number":67,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":68,"context_line":"| created_at    | datetime     | YES   |     | NULL    |"},{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_d48ac6be","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":56},"in_reply_to":"ba5da102_f43d0abc","updated":"2016-10-31 23:20:01.000000000","message":"Should also note, these become even more useful when you can query for:\nprojects where properties contains \u003ckey\u003e and property updated \u003e\u003d \u003ctimestamp\u003e\n\nI actually have a use case for this already which I\u0027m doing via the \u0027extra\u0027 field. It\u0027s terribly inefficient due to having to list all projects and process their extra fields myself. This kind of query would both simplify and speed things up immensely.","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5ae7a46d572e57a3e090194ff42ddd5234e6c42e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":66,"context_line":"| project_id    | varchar(64)  | NO    | MUL | NULL    |"},{"line_number":67,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":68,"context_line":"| created_at    | datetime     | YES   |     | NULL    |"},{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_94e92e83","line":70,"range":{"start_line":68,"start_character":0,"end_line":70,"end_character":56},"in_reply_to":"ba5da102_f43d0abc","updated":"2016-10-31 23:19:48.000000000","message":"alright :)","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"**Request Parameters**"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"* ``properties (Optional)`` - Filters the response by property"},{"line_number":92,"context_line":"  key/value pair. **New**"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"**Response**"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_91b78085","line":92,"range":{"start_line":91,"start_character":0,"end_line":92,"end_character":25},"updated":"2016-10-31 22:26:57.000000000","message":"whats the query look like?","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"**Response**"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":".. code:: JSON"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    {"},{"line_number":99,"context_line":"        \"links\": {"},{"line_number":100,"context_line":"            \"next\": null,"},{"line_number":101,"context_line":"            \"previous\": null,"},{"line_number":102,"context_line":"            \"self\": \"http://example.com/identity/v3/projects\""},{"line_number":103,"context_line":"        },"},{"line_number":104,"context_line":"        \"projects\": ["},{"line_number":105,"context_line":"            {"},{"line_number":106,"context_line":"                \"is_domain\": false,"},{"line_number":107,"context_line":"                \"description\": null,"},{"line_number":108,"context_line":"                \"domain_id\": \"default\","},{"line_number":109,"context_line":"                \"enabled\": true,"},{"line_number":110,"context_line":"                \"id\": \"0c4e939acacf4376bdcd1129f1a054ad\","},{"line_number":111,"context_line":"                \"links\": {"},{"line_number":112,"context_line":"                    \"self\": \"http://example.com/identity/v3/projects/0c4e939acacf4376bdcd1129f1a054ad\""},{"line_number":113,"context_line":"                },"},{"line_number":114,"context_line":"                \"name\": \"admin\","},{"line_number":115,"context_line":"                \"parent_id\": null"},{"line_number":116,"context_line":"                \"properties\": {"},{"line_number":117,"context_line":"                    \"key1\": \"value1\","},{"line_number":118,"context_line":"                    \"key2\": \"value2\""},{"line_number":119,"context_line":"                }"},{"line_number":120,"context_line":"            },"},{"line_number":121,"context_line":"            {"},{"line_number":122,"context_line":"                \"is_domain\": false,"},{"line_number":123,"context_line":"                \"description\": null,"},{"line_number":124,"context_line":"                \"domain_id\": \"default\","},{"line_number":125,"context_line":"                \"enabled\": true,"},{"line_number":126,"context_line":"                \"id\": \"0cbd49cbf76d405d9c86562e1d579bd3\","},{"line_number":127,"context_line":"                \"links\": {"},{"line_number":128,"context_line":"                    \"self\": \"http://example.com/identity/v3/projects/0cbd49cbf76d405d9c86562e1d579bd3\""},{"line_number":129,"context_line":"                },"},{"line_number":130,"context_line":"                \"name\": \"demo\","},{"line_number":131,"context_line":"                \"parent_id\": null"},{"line_number":132,"context_line":"                \"properties\": {"},{"line_number":133,"context_line":"                    \"key\": \"value\""},{"line_number":134,"context_line":"                }"},{"line_number":135,"context_line":"            },"},{"line_number":136,"context_line":"            {"},{"line_number":137,"context_line":"                \"is_domain\": false,"},{"line_number":138,"context_line":"                \"description\": null,"},{"line_number":139,"context_line":"                \"domain_id\": \"default\","},{"line_number":140,"context_line":"                \"enabled\": true,"},{"line_number":141,"context_line":"                \"id\": \"2db68fed84324f29bb73130c6c2094fb\","},{"line_number":142,"context_line":"                \"links\": {"},{"line_number":143,"context_line":"                    \"self\": \"http://example.com/identity/v3/projects/2db68fed84324f29bb73130c6c2094fb\""},{"line_number":144,"context_line":"                },"},{"line_number":145,"context_line":"                \"name\": \"swifttenanttest2\","},{"line_number":146,"context_line":"                \"parent_id\": null"},{"line_number":147,"context_line":"                \"properties\": null"},{"line_number":148,"context_line":"            }"},{"line_number":149,"context_line":"        ]"},{"line_number":150,"context_line":"    }"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"Create project"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_9145c071","line":150,"range":{"start_line":96,"start_character":0,"end_line":150,"end_character":5},"updated":"2016-10-31 22:26:57.000000000","message":"you can simply write that the response will be updated to include properties when available, i\u0027m much more interested in how you plan on querying for keys and values","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"**Parameters**"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``name`` - The name of the project, which must be unique within the owning"},{"line_number":161,"context_line":"  domain. A project can have the same name as its domain."},{"line_number":162,"context_line":"* ``properties (Optional)`` - Property key/value pair. **New**"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"**Request**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_f1ac3c37","line":161,"range":{"start_line":160,"start_character":0,"end_line":161,"end_character":57},"updated":"2016-10-31 22:26:57.000000000","message":"remove this, you\u0027re not adding it","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"* ``name`` - The name of the project, which must be unique within the owning"},{"line_number":161,"context_line":"  domain. A project can have the same name as its domain."},{"line_number":162,"context_line":"* ``properties (Optional)`` - Property key/value pair. **New**"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"**Request**"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_f1735ce5","line":162,"range":{"start_line":162,"start_character":2,"end_line":162,"end_character":27},"updated":"2016-10-31 22:26:57.000000000","message":"``properties`` (Optional) - Key-value based properties to be added to a project upon creation","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":201,"context_line":"Show project details"},{"line_number":202,"context_line":"~~~~~~~~~~~~~~~~~~~~"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"**Request:** ``GET /v3/projects/{project_id}``"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"**Parameters**"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"* ``project_id`` - The project ID."},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"**Response**"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":".. code:: JSON"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    {"},{"line_number":215,"context_line":"        \"project\": {"},{"line_number":216,"context_line":"            \"is_domain\": false,"},{"line_number":217,"context_line":"            \"description\": null,"},{"line_number":218,"context_line":"            \"domain_id\": \"default\","},{"line_number":219,"context_line":"            \"enabled\": true,"},{"line_number":220,"context_line":"            \"id\": \"0c4e939acacf4376bdcd1129f1a054ad\","},{"line_number":221,"context_line":"            \"links\": {"},{"line_number":222,"context_line":"                \"self\": \"http://example.com/identity/v3/projects/0c4e939acacf4376bdcd1129f1a054ad\""},{"line_number":223,"context_line":"            },"},{"line_number":224,"context_line":"            \"name\": \"admin\","},{"line_number":225,"context_line":"            \"parent_id\": \"default\""},{"line_number":226,"context_line":"            \"properties\": {"},{"line_number":227,"context_line":"                \"key1\": \"value1\","},{"line_number":228,"context_line":"                \"key2\": \"value2\""},{"line_number":229,"context_line":"            }"},{"line_number":230,"context_line":"        }"},{"line_number":231,"context_line":"    }"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"New API Calls"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_b171e4e2","line":231,"range":{"start_line":204,"start_character":0,"end_line":231,"end_character":5},"updated":"2016-10-31 22:26:57.000000000","message":"just say:\n\n\"``GET /v3/projects/{project_id}`` will be updated to show any available properties\"","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"**Parameters**"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"* ``project_id`` - The project ID."},{"line_number":266,"context_line":"* ``key`` - The properties key."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"**Response**"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_b1480489","line":266,"range":{"start_line":266,"start_character":16,"end_line":266,"end_character":26},"updated":"2016-10-31 22:26:57.000000000","message":"property*","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":332,"context_line":"* ``key`` - The properties key."},{"line_number":333,"context_line":""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"List all projects that contain a specific key/value"},{"line_number":336,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"**Request:** ``GET"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_913ce0e3","line":335,"range":{"start_line":335,"start_character":0,"end_line":335,"end_character":51},"updated":"2016-10-31 22:26:57.000000000","message":"this is what i\u0027m interested in!","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":336,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"**Request:** ``GET"},{"line_number":339,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"**Parameters**"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_b13f24d5","line":339,"range":{"start_line":339,"start_character":0,"end_line":339,"end_character":134},"updated":"2016-10-31 22:26:57.000000000","message":"explain this please","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"eefab689f631312c2ca0ebaf2914595ab0bc1e67","unresolved":false,"context_lines":[{"line_number":336,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"**Request:** ``GET"},{"line_number":339,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"**Parameters**"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_f4218ab5","line":339,"range":{"start_line":339,"start_character":0,"end_line":339,"end_character":134},"in_reply_to":"ba5da102_b13f24d5","updated":"2016-10-31 23:29:31.000000000","message":"As a side note, will we be able to also query for properties based on their timestamp data?\n\nall projects which have a property that matches:\nkey\u003d\"foo\", value\u003d\"bar\", and updated_at\u003e\u003d\"2016-9-1T00:00:00\"","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":412,"context_line":"Adding rules to ``policy.json`` to control role-based access to the API calls."},{"line_number":413,"context_line":""},{"line_number":414,"context_line":""},{"line_number":415,"context_line":".. code-block:: yaml"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"   \"identity:list_properties\": \"rule:admin_required\","},{"line_number":418,"context_line":"   \"identity:create_properties\": \"rule:admin_required\","}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_1131b005","line":415,"range":{"start_line":415,"start_character":16,"end_line":415,"end_character":20},"updated":"2016-10-31 22:26:57.000000000","message":"ini?","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":".. code-block:: yaml"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"   \"identity:list_properties\": \"rule:admin_required\","},{"line_number":418,"context_line":"   \"identity:create_properties\": \"rule:admin_required\","},{"line_number":419,"context_line":"   \"identity:update_properties\": \"rule:admin_required\","},{"line_number":420,"context_line":"   \"identity:delete_properties\": \"rule:admin_required\""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_f40fca2b","line":417,"range":{"start_line":417,"start_character":37,"end_line":417,"end_character":51},"updated":"2016-10-31 22:26:57.000000000","message":"i\u0027m not sure narrowing this to admin_required for the GET/LIST operations is a good idea, take a look at the rules for getting and listing projects now","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":414,"context_line":""},{"line_number":415,"context_line":".. code-block:: yaml"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"   \"identity:list_properties\": \"rule:admin_required\","},{"line_number":418,"context_line":"   \"identity:create_properties\": \"rule:admin_required\","},{"line_number":419,"context_line":"   \"identity:update_properties\": \"rule:admin_required\","},{"line_number":420,"context_line":"   \"identity:delete_properties\": \"rule:admin_required\""},{"line_number":421,"context_line":""},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"Notifications Impact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_54007601","line":420,"range":{"start_line":417,"start_character":0,"end_line":420,"end_character":54},"updated":"2016-10-31 22:26:57.000000000","message":"also need to add \"get_property\"","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"1021618df4b417dd9f212ce203f344b736e6707f","unresolved":false,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"1. Implement the API\u0027s."},{"line_number":471,"context_line":"2. Add unit and tempest tests."},{"line_number":472,"context_line":"3. Update all appropriate documentation."},{"line_number":473,"context_line":""},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"Dependencies"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ba5da102_742ada7f","line":472,"range":{"start_line":472,"start_character":3,"end_line":472,"end_character":40},"updated":"2016-10-31 22:26:57.000000000","message":"also need to update the client and CLI","commit_id":"c1e25e5b80c685615ddf241e9167d1c38515a904"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Problem Description"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Operators often need to associate user-specific properties with a project."},{"line_number":25,"context_line":"Two use cases are outlined below:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Case 1. Post-Orchestration Processing"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_c692aaf5","line":24,"updated":"2016-11-03 15:04:29.000000000","message":"Is it really user-specific properties that you are after?","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Problem Description"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Operators often need to associate user-specific properties with a project."},{"line_number":25,"context_line":"Two use cases are outlined below:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Case 1. Post-Orchestration Processing"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_e1beb8ac","line":24,"in_reply_to":"ba5da102_c692aaf5","updated":"2016-11-03 15:13:45.000000000","message":"For our cloud yes, being able to tag what type of project each one is: sandbox/dev environment and who owns it: admin/member/reseller","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Operators often need to associate user-specific properties with a project."},{"line_number":25,"context_line":"Two use cases are outlined below:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Case 1. Post-Orchestration Processing"},{"line_number":28,"context_line":"-----------------------------------------"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Operators may wish to perform post server orchestration processing, e.g.,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_e6a40e4c","line":27,"updated":"2016-11-03 15:04:29.000000000","message":"I\u0027m not really sure what this is. Could you give an example? (I\u0027m thinking they means something like what DNS server a server should use, for example. Then based on the property in the project the correct one would be set. To me these are things that belong in the deployment framework.)","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"Operators often need to associate user-specific properties with a project."},{"line_number":25,"context_line":"Two use cases are outlined below:"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Case 1. Post-Orchestration Processing"},{"line_number":28,"context_line":"-----------------------------------------"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Operators may wish to perform post server orchestration processing, e.g.,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_41fda46c","line":27,"in_reply_to":"ba5da102_e6a40e4c","updated":"2016-11-03 15:13:45.000000000","message":"This is a generic description about what we do with tags we currently keep, but you\u0027re pretty much correct in that example. I can rewrite this to be clearer.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"19e973c268bf6fe03320a023b1754d97df3e054e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"Operators may wish to perform post server orchestration processing, e.g.,"},{"line_number":31,"context_line":"retrieving and applying specific settings to all servers under a project."},{"line_number":32,"context_line":"Properties storage will allow for the retrieval and application of these"},{"line_number":33,"context_line":"settings."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Case 2. Projects Organization and Bookkeeping"},{"line_number":36,"context_line":"-------------------------------------------------"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_3be61fe8","line":33,"updated":"2016-11-03 14:33:31.000000000","message":"This should not be a keystone stored value, as it specifically is for a server.  Vendor-data is a better way to do this.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":38,"context_line":"In the case of a large private cloud with many projects, there is a need"},{"line_number":39,"context_line":"to be able to categorize projects, and be able to select the projects of"},{"line_number":40,"context_line":"specific category. For example, different projects may belong to different"},{"line_number":41,"context_line":"billing code for internal tracking purposes. The operator can query"},{"line_number":42,"context_line":"all the projects with specific properties without resorting to naming"},{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_663d5edc","line":41,"updated":"2016-11-03 15:04:29.000000000","message":"*codes","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"19e973c268bf6fe03320a023b1754d97df3e054e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"specific category. For example, different projects may belong to different"},{"line_number":41,"context_line":"billing code for internal tracking purposes. The operator can query"},{"line_number":42,"context_line":"all the projects with specific properties without resorting to naming"},{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_fb066784","line":43,"updated":"2016-11-03 14:33:31.000000000","message":"This is a billing issue, and should be kept in the billing system.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":40,"context_line":"specific category. For example, different projects may belong to different"},{"line_number":41,"context_line":"billing code for internal tracking purposes. The operator can query"},{"line_number":42,"context_line":"all the projects with specific properties without resorting to naming"},{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_410be47c","line":43,"in_reply_to":"ba5da102_fb066784","updated":"2016-11-03 15:13:45.000000000","message":"less of a pure billing issue, than more of a keep track of project for billing purposes.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":40,"context_line":"specific category. For example, different projects may belong to different"},{"line_number":41,"context_line":"billing code for internal tracking purposes. The operator can query"},{"line_number":42,"context_line":"all the projects with specific properties without resorting to naming"},{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_261e0670","line":43,"in_reply_to":"ba5da102_fb066784","updated":"2016-11-03 15:04:29.000000000","message":"s/with/with a/","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"},{"line_number":47,"context_line":"maintain for large scale deployments with frequent project changes."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_0129ec89","line":46,"updated":"2016-11-03 15:04:29.000000000","message":"Are these properies changing much? Things like billing codes wouldn\u0027t change all that much right?","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"projects with particular convention. Additionally, on project modification"},{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"},{"line_number":47,"context_line":"maintain for large scale deployments with frequent project changes."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_418204c9","line":46,"in_reply_to":"ba5da102_0129ec89","updated":"2016-11-03 15:13:45.000000000","message":"This is also not written clearly, but we currently tag things based on what type of user is currently using the project, not keeping billing codes themselves in keystone.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"19e973c268bf6fe03320a023b1754d97df3e054e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"or deletion, proper cleanup of properties could occur without the need for an"},{"line_number":45,"context_line":"external tracking system. An external system would need to be kept"},{"line_number":46,"context_line":"up-to-date and properly synched with keystone, and would become difficult to"},{"line_number":47,"context_line":"maintain for large scale deployments with frequent project changes."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Proposed Change"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_bbf14f97","line":47,"updated":"2016-11-03 14:33:31.000000000","message":"Keystone provides a notification upon delete.  Have this trigger a mistral workflow.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":74,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":75,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_01080cd9","line":72,"updated":"2016-11-03 15:04:29.000000000","message":"Will uniqueness be enforced within a project_id?","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"d826659ae519c1915b05330e022892e95a45da70","unresolved":false,"context_lines":[{"line_number":69,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":70,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":71,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":72,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":73,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":74,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":75,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_6c245c0c","line":72,"in_reply_to":"ba5da102_01080cd9","updated":"2016-11-03 16:27:32.000000000","message":"yes","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":85,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"**Request:** ``GET"},{"line_number":88,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"**Parameters**"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_019e4cb8","line":88,"updated":"2016-11-03 15:04:29.000000000","message":"What is the properties[0] syntax? Are you trying to implement boolean *and* logic?","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"d826659ae519c1915b05330e022892e95a45da70","unresolved":false,"context_lines":[{"line_number":85,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"**Request:** ``GET"},{"line_number":88,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"**Parameters**"},{"line_number":91,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_8cc37037","line":88,"in_reply_to":"ba5da102_019e4cb8","updated":"2016-11-03 16:27:32.000000000","message":"Being able to pass in multiple key/value pairs in order to find project(s) that match","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"**Parameters**"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"* ``properties (Optional)`` - Key-value based properties to be added to a"},{"line_number":116,"context_line":"  project upon creation. **New**"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"**Example**"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_41f20407","line":115,"updated":"2016-11-03 15:04:29.000000000","message":"Do you really want anyone that has the ability to create or update a project to be able to change the property values? This seems like a security issue if you are using this for billing or administrative control of any kind.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"**Parameters**"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"* ``properties (Optional)`` - Key-value based properties to be added to a"},{"line_number":116,"context_line":"  project upon creation. **New**"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"**Example**"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_81b33c97","line":115,"in_reply_to":"ba5da102_41f20407","updated":"2016-11-03 15:13:45.000000000","message":"Would breaking this up into two steps, leaving project creation and updating free from touching properties and having their own call?","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    {"},{"line_number":184,"context_line":"        \"properties\": {"},{"line_number":185,"context_line":"            \"key\": \"example value\""},{"line_number":186,"context_line":"        }"},{"line_number":187,"context_line":"    }"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_81233c55","line":185,"updated":"2016-11-03 15:04:29.000000000","message":"This example implies the uniqueness I mentioned above.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f2a3a32a0e8a71814bae5a08988dbf63ddda0069","unresolved":false,"context_lines":[{"line_number":270,"context_line":"     serialization and deserialization of the stored JSON string."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"Security Impact"},{"line_number":274,"context_line":"---------------"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Adding rules to ``policy.json`` to control role-based access to the API calls."}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_01a48cb7","line":273,"updated":"2016-11-03 15:04:29.000000000","message":"I think you should talk about who should be able to edit properties and the dangers related to relying on the information for administrative functions.","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"c44e50bbc2ef87bc07a558c7e34c6bc9cea47b7b","unresolved":false,"context_lines":[{"line_number":270,"context_line":"     serialization and deserialization of the stored JSON string."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"Security Impact"},{"line_number":274,"context_line":"---------------"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Adding rules to ``policy.json`` to control role-based access to the API calls."}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba5da102_817a5cbb","line":273,"in_reply_to":"ba5da102_01a48cb7","updated":"2016-11-03 15:13:45.000000000","message":"Good point, will do","commit_id":"88a0d24f5d3a3ea3fe4e831807b9377727036f15"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f469de45016ff6271ef5c891986adfb900bf5bca","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Blueprint `projects-properties"},{"line_number":13,"context_line":"\u003chttps://blueprints.launchpad.net/keystone/+spec/projects-properties\u003e`_"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Similar to nova\u0027s server metadata [#]_ this blueprint adds API\u0027s to allow"},{"line_number":16,"context_line":"operators to store and associate properties with keystone projects."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_44037d42","line":15,"updated":"2016-11-09 14:58:52.000000000","message":"APIs","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":20380,"name":"Jeffrey Augustine","email":"jaugustineOS@outlook.com","username":"jaugustine"},"change_message_id":"1441d455cd07fae29e0170fe2c65a89470d8a75e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Blueprint `projects-properties"},{"line_number":13,"context_line":"\u003chttps://blueprints.launchpad.net/keystone/+spec/projects-properties\u003e`_"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Similar to nova\u0027s server metadata [#]_ this blueprint adds API\u0027s to allow"},{"line_number":16,"context_line":"operators to store and associate properties with keystone projects."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_9bcf907e","line":15,"in_reply_to":"9a629dbe_44037d42","updated":"2016-11-09 15:46:09.000000000","message":"Oh my.","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f469de45016ff6271ef5c891986adfb900bf5bca","unresolved":false,"context_lines":[{"line_number":64,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":65,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":66,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":67,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":68,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":69,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":70,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_80ec8190","line":67,"updated":"2016-11-09 14:58:52.000000000","message":"Is the key column going to be indexable? Can the same key be used more than once for a project? I\u0027m not entirely sure this example makes sense - but what if you have a property called project-contact and it\u0027s defined multiple times for a single project? Is there any sort of uniqueness constraint (I\u0027m assuming not because the metadata seems to be deployer specific)?\n\n\n  project_id: dcb6b0ec2b064885826440b2f0c010d3\n    project-contact: lbragstad\n    project-contact: stevemar\n    project-contact: gagehugo","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":20380,"name":"Jeffrey Augustine","email":"jaugustineOS@outlook.com","username":"jaugustine"},"change_message_id":"1441d455cd07fae29e0170fe2c65a89470d8a75e","unresolved":false,"context_lines":[{"line_number":64,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":65,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":66,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":67,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":68,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":69,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":70,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_dbfd883b","line":67,"in_reply_to":"9a629dbe_80ec8190","updated":"2016-11-09 15:46:09.000000000","message":"Yes! The key should be indexed and unique per project. If we allow non-unique keys per project that will add complexity to updating the key\u0027s value later on.","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":10420,"name":"Adrian Turjak","email":"devs+openstack@uncaught-exceptions.com","username":"adriant"},"change_message_id":"0e6009a497d7b59274fc03f2d19938e5c23af2b2","unresolved":false,"context_lines":[{"line_number":64,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":65,"context_line":"| updated_at    | datetime     | YES   |     | NULL    |"},{"line_number":66,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":67,"context_line":"| key           | varchar(255) | NO    |     | NULL    |"},{"line_number":68,"context_line":"+---------------+--------------+-------+-----+---------+"},{"line_number":69,"context_line":"| value         | varchar(255) | YES   |     | NULL    |"},{"line_number":70,"context_line":"+---------------+--------------+-------+-----+---------+"}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a77a97e_7ce1d4fd","line":67,"in_reply_to":"9a629dbe_dbfd883b","updated":"2016-11-17 00:21:29.000000000","message":"I actually kind of like the idea of them not being unique per project. As then you can do things exactly as Lance shows, and even:\n\"tag\": \"tag_1\"\n\"tag\": \"tag_2\"\n\nThere are many cases where this could be useful. They become less about direct 1:1 properties on a resource and more just key:values related to a resource which you can query.\n\nAll you\u0027d have to do is make them unique for:\nproject_id + key + value\n\nThe biggest problem is how to structure them in json.\n{\n    \"properties\": [\n        {\"key1\": \"value1\"},\n        {\"key1\": \"value2\"},\n        {\"key2\": \"value3\"},\n    ]\n}\nor\n{\n    \"properties\": {\n        \"key1\": [\n            \"value1\",\n            \"value2\"\n        ],\n        \"key2\": [\n            \"value3\"\n        ]\n    }\n}","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f469de45016ff6271ef5c891986adfb900bf5bca","unresolved":false,"context_lines":[{"line_number":77,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"**Request:** ``GET"},{"line_number":80,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"**Parameters**"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_64ac0136","line":80,"updated":"2016-11-09 14:58:52.000000000","message":"Is it possible to list properties for a single project?","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":20380,"name":"Jeffrey Augustine","email":"jaugustineOS@outlook.com","username":"jaugustine"},"change_message_id":"1441d455cd07fae29e0170fe2c65a89470d8a75e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"**Request:** ``GET"},{"line_number":80,"context_line":"/v3/projects?properties[0].key\u003d{keyname}\u0026properties[0].value\u003d{valuename}\u0026properties[1].key\u003d{keyname}\u0026properties[1].value\u003d{valuename}``"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"**Parameters**"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_87fbb6c0","line":80,"in_reply_to":"9a629dbe_64ac0136","updated":"2016-11-09 15:46:09.000000000","message":"This is meant to filter on specific keys, but it does look like the \"list all\" was lost. I\u0027ll re-add the GET v3/projects/{project_id}/properties/ which is intended to list all properties on a given project.","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f469de45016ff6271ef5c891986adfb900bf5bca","unresolved":false,"context_lines":[{"line_number":84,"context_line":"* ``properties (Optional)`` - Filters the response by property"},{"line_number":85,"context_line":"  key/value pair. **New**"},{"line_number":86,"context_line":"* ``keyname`` - The properties key."},{"line_number":87,"context_line":"* ``valuename`` - The properties value."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Check if a project contains a specified key"},{"line_number":90,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_a5f99782","line":87,"updated":"2016-11-09 14:58:52.000000000","message":"nit: The name here seems slightly redundant. If these are just key/value pairs could the name just be `key` and `value`?","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"},{"author":{"_account_id":20380,"name":"Jeffrey Augustine","email":"jaugustineOS@outlook.com","username":"jaugustine"},"change_message_id":"1441d455cd07fae29e0170fe2c65a89470d8a75e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"* ``properties (Optional)`` - Filters the response by property"},{"line_number":85,"context_line":"  key/value pair. **New**"},{"line_number":86,"context_line":"* ``keyname`` - The properties key."},{"line_number":87,"context_line":"* ``valuename`` - The properties value."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"Check if a project contains a specified key"},{"line_number":90,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":8,"id":"9a629dbe_87fad673","line":87,"in_reply_to":"9a629dbe_a5f99782","updated":"2016-11-09 15:46:09.000000000","message":"That\u0027s just meant to be our filler foo values for the above \"key\u003d{keyname}\" request.","commit_id":"8a29eef52ee3d19c734eb7ff5304ad25ff6e832d"}]}
