)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"23b0cb5ed059dec134759ec399193504fde875fc","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"It\u0027s proposed to add API related code to the repository to"},{"line_number":16,"context_line":"enable the whole artifact functionality."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I6eace86df1b153d080287d09d523b6f909d9caf7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a016987_5bcf4b7f","line":17,"updated":"2015-05-28 00:39:16.000000000","message":"Would you mind adding the APIImpact flag so the API-WG sees this?","commit_id":"8eb9a045823d2843a3bb1298a95226ab3efe4a5d"},{"author":{"_account_id":11391,"name":"Mikhail Fedosin","email":"mfedosin@redhat.com","username":"fedosinme"},"change_message_id":"2e6c3a53f494a68511dc409702bbff232918f140","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"It\u0027s proposed to add API related code to the repository to"},{"line_number":16,"context_line":"enable the whole artifact functionality."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I6eace86df1b153d080287d09d523b6f909d9caf7"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5afe65bd_0e5746cf","line":17,"in_reply_to":"7a016987_5bcf4b7f","updated":"2015-06-03 18:28:03.000000000","message":"Done","commit_id":"8eb9a045823d2843a3bb1298a95226ab3efe4a5d"}],"specs/kilo/artifact-repository.rst":[{"author":{"_account_id":16683,"name":"Alexey Galkin","email":"agalkin@mirantis.com","username":"agalkin"},"change_message_id":"be5d845fb5d8063977f1c073744eb180fd409081","unresolved":false,"context_lines":[{"line_number":17,"context_line":"store, search and retrieve their artifacts, their metadata and associated"},{"line_number":18,"context_line":"binary objects."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"This specifiction defines artifact declarative model, plugin loading system and"},{"line_number":21,"context_line":"database schema. Artifact API will be described in additional specification."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a26ad4f_1d3225f2","line":20,"updated":"2015-10-28 16:17:31.000000000","message":"Please fix typo:\n\nspecifiction -\u003e specification","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"}],"specs/liberty/artifacts-api.rst":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"defined by the artifact type definition (i.e. by the plugin), which usually"},{"line_number":37,"context_line":"should be plural of the artifact type name."},{"line_number":38,"context_line":"For example, for artifacts of type \"template\" this constant may be called"},{"line_number":39,"context_line":"\u0027templates\u0027, so the API endpoints will start with `/v3/artifacts/templates`."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"The `artifact_type` constant should unambiguously identify the"},{"line_number":42,"context_line":"artifact type, so the values of this constants should be unique among all the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_0e96734c","line":39,"updated":"2015-06-05 15:41:14.000000000","message":"Why bother having the /artifacts/ be part of the API at all? Why not have the v3/ root URL return a JSON-Home document with all of the queryable artifact types and use those artifact types as collection resources off the root.\n\nFor instance, presume there are 3 types of artifact plugins:\n\n - images\n - HOT templates\n - applications\n\nYou would have a JSON-Home document that looks something like this:\n\n {\n    \"resources\": {\n        \"rel/images\": {\n            \"href-template\": \"/images\",\n            \"href-vars\": {\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"POST\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        },\n        \"rel/image\": {\n            \"href-template\": \"/images/{image}\",\n            \"href-vars\": {\n                \"image\": \"param/image\"\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"DELETE\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        },\n        \"rel/hot_templates\": {\n            \"href-template\": \"/hot_templates\",\n            \"href-vars\": {\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"POST\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        },\n        \"rel/image\": {\n            \"href-template\": \"/hot_templates/{template}\",\n            \"href-vars\": {\n                \"template\": \"param/template\"\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"DELETE\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        },\n        \"rel/applications\": {\n            \"href-template\": \"/applications\",\n            \"href-vars\": {\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"POST\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        },\n        \"rel/image\": {\n            \"href-template\": \"/applications/{application}\",\n            \"href-vars\": {\n                \"application\": \"param/application\"\n            },\n            \"hints\": {\n                \"allow\": [\"GET\", \"DELETE\"],\n                \"formats\": {\n                    \"application/json\": {}\n                }\n            }\n        }\n    }\n }\n\nThat way, the artifact types are easily discovered via JSON-Home resources collection and there\u0027s no need for a top-level \"artifacts\" part of the URL.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"e737d2768ad5ba5891d168bb6fa9876f18c1a6c7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"defined by the artifact type definition (i.e. by the plugin), which usually"},{"line_number":37,"context_line":"should be plural of the artifact type name."},{"line_number":38,"context_line":"For example, for artifacts of type \"template\" this constant may be called"},{"line_number":39,"context_line":"\u0027templates\u0027, so the API endpoints will start with `/v3/artifacts/templates`."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"The `artifact_type` constant should unambiguously identify the"},{"line_number":42,"context_line":"artifact type, so the values of this constants should be unique among all the"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_e018b486","line":39,"in_reply_to":"3afb71cf_0e96734c","updated":"2015-06-06 00:14:36.000000000","message":"Jay, how do tasks and metadefs fit into this then? Neither are immutable blobs of data that can be stored as artifacts. This is why we decided to go with /v3/artifacts/* iirc","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_d626b715","line":49,"updated":"2015-06-05 13:23:04.000000000","message":"I agree with Sean that this sounds like media types and content negotiation.\n\nMore generally if you\u0027re writing a spec for an api and you use the word \"may\" you probably want to re-evaluate that section to make it explicitly unambiguous.\n\nIn this case the result is URIs for individual resources which are not stable and stable URIs ought to be a primary goal. type_version sounds like an indicator of a different representation of an existing resource, or potentially a revision of the resource. In either case the current extant resource needs to have some primacy with a nice stable URI.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_c94fc369","line":49,"updated":"2015-06-04 15:45:25.000000000","message":"The idea of having an optional component in the middle of the URL path is odd, and I think will lead to a confusing implementation.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_f2671eb5","line":49,"in_reply_to":"3afb71cf_c7674024","updated":"2015-08-26 16:00:26.000000000","message":"The response from mid-cycle meetup:\n[Alexander Tivelkov] The answer here is that type name and version is much more then just a format of returned data: it is the name of the actual thing which handles the request, including various data trasformation and validation logic, which does not neccesary affects the format of input or output data. Also, type and type version info are needed for the request which return the value other then the actual artifacts (e.g. \u0027get a value of a property\u0027 which may either return a binary stream or a json value of a particular artifact attribute) or don\u0027t return the value at all (e.g. \u0027delete an artifact\u0027)","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_eea0b792","line":49,"in_reply_to":"3afb71cf_d626b715","updated":"2015-06-05 15:41:14.000000000","message":"This is slightly different from content negotiation, IMO. However, I do agree that having an optional component to the URL is odd and error-prone.\n\nI think a simple query string argument for version would suffice:\n\n GET /applications/{application_id}?version\u003d2","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_cc904198","line":49,"in_reply_to":"3afb71cf_eea0b792","updated":"2015-08-26 16:00:26.000000000","message":"Response from mid-cycle meetup:\n[Alexander Tivelkov] I agree. However, the need to always specify the type version of a plugin is cumbersome, especially if some plugins are really simple and are unlikely to have multiple versions. Another option is to specify the type_version as a query parameter (e.g. METHOD /v3/artifacts/{type_name}/{id}/{path}?type_version\u003d..), however this may be confusing as people may expect that for GET requests it will filter the artifacts based on their type_version (given that it is recorded when the artifact type is created). \nDoes anybody see other options?","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fdacfddf1d504bf8a012d2bdf2994037b8648dc8","unresolved":false,"context_lines":[{"line_number":46,"context_line":"containing a SemVer-compliant string prefixed with `v`, e.g. `v1.1.5`. This"},{"line_number":47,"context_line":"will identify the particular version of the artifact type if there are many of"},{"line_number":48,"context_line":"them available. In the \"List Artifacts\" and \"Get an Artifact\" API calls the"},{"line_number":49,"context_line":"`type_version` is optional and may be omitted."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_c7674024","line":49,"in_reply_to":"5afe65bd_c94fc369","updated":"2015-06-05 11:19:25.000000000","message":"So, this really seems like it\u0027s basically a reimplementation of mime types and content negotiation in the URL instead. That seems like it would be better to:\n\nGET /v3/artifacts\nAccept: openstack/{artifact_type}+{type_version}\n\n(Note: exact rules on what\u0027s legit with mime types probably need to be debated as well, but just for the idea)","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"},{"line_number":53,"context_line":"   * **GET /v3/artifacts/{artifact_type}/[{type_version}/]drafts** - list"},{"line_number":54,"context_line":"        artifact drafts"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        Returns the list of artifacts in CREATING state having the specified"},{"line_number":57,"context_line":"        type and owned by the current tenant. If the user is administrator"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_09e6fb43","line":54,"updated":"2015-06-04 15:45:25.000000000","message":"A more straightforward implementation in my opinion is to move the type_version part to the end, and to put the filter in the query string:\n\n\n    GET /v3/artifacts/{artifact_type}//type_versions/{type_version}]?f_state\u003dcreating","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"* **List artifacts**"},{"line_number":53,"context_line":"   * **GET /v3/artifacts/{artifact_type}/[{type_version}/]drafts** - list"},{"line_number":54,"context_line":"        artifact drafts"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        Returns the list of artifacts in CREATING state having the specified"},{"line_number":57,"context_line":"        type and owned by the current tenant. If the user is administrator"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_6c0fb588","line":54,"in_reply_to":"5afe65bd_09e6fb43","updated":"2015-08-26 16:00:26.000000000","message":"Fixed with the following API implementation:\nGET /v3/artifacts/{artifact_type}//type_versions/{type_version}]","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        Returns the list of artifacts in CREATING state having the specified"},{"line_number":57,"context_line":"        type and owned by the current tenant. If the user is administrator"},{"line_number":58,"context_line":"        returns the artifacts in CREATING state owned by all the tenants."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"   * **GET /v3/artifacts/{artifact_type}/[{type_version}/]** - list artifacts"},{"line_number":61,"context_line":"        which are ready for usage"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_2e112fad","line":58,"updated":"2015-06-05 15:41:14.000000000","message":"Are you saying that every artifact is going to have a CREATING state, even if no such state is actually necessary?\n\nWhat precisely is the purpose of a DRAFT artifact, anyway? I\u0027m not entirely sure what use case they are intended to serve? Could you give an example?","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        Visibility metadata field to PUBLIC."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   * **GET /v3/artifacts/{artifact_type}/[{type_version}/]deactivated** - list"},{"line_number":68,"context_line":"        artifacts in DEACTIVATED state."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns the list of artifacts in DEACTIVATE state which are temporary"},{"line_number":71,"context_line":"        suspended from usage."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_2972d77b","line":68,"updated":"2015-06-04 15:45:25.000000000","message":"Filtering is typically done in the query string. Same as above, what I propose is something like this:\n\n    GET /v3/artifacts/{artifact_type}/type_versions/{type_version}?f_state\u003ddeactivated\n\nSee API-WG guideline on filtering currently under review: https://review.openstack.org/#/c/177468/","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        Visibility metadata field to PUBLIC."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   * **GET /v3/artifacts/{artifact_type}/[{type_version}/]deactivated** - list"},{"line_number":68,"context_line":"        artifacts in DEACTIVATED state."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns the list of artifacts in DEACTIVATE state which are temporary"},{"line_number":71,"context_line":"        suspended from usage."}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_ac7cedeb","line":68,"in_reply_to":"5afe65bd_2972d77b","updated":"2015-08-26 16:00:26.000000000","message":"Done","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fdacfddf1d504bf8a012d2bdf2994037b8648dc8","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        artifacts in DEACTIVATED state."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns the list of artifacts in DEACTIVATE state which are temporary"},{"line_number":71,"context_line":"        suspended from usage."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   * URL parameters:"},{"line_number":74,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_330abdd3","line":71,"updated":"2015-06-05 11:19:25.000000000","message":"So, honestly having drafts and deactivated in the path seems slight weird to me. It seems like status\u003ddraft, status\u003dinactive, status\u003dactive (which is the default if not status is passed) as params is a little more sensible, as there might be a reason you\u0027d want all of them so you could pass status multiple times.\n\nThis is more of a minor style thing.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        artifacts in DEACTIVATED state."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns the list of artifacts in DEACTIVATE state which are temporary"},{"line_number":71,"context_line":"        suspended from usage."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   * URL parameters:"},{"line_number":74,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_2c69bd25","line":71,"in_reply_to":"3afb71cf_330abdd3","updated":"2015-08-26 16:00:26.000000000","message":"Done","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        artifacts in DEACTIVATED state."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        Returns the list of artifacts in DEACTIVATE state which are temporary"},{"line_number":71,"context_line":"        suspended from usage."},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"   * URL parameters:"},{"line_number":74,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_aee2bf9d","line":71,"in_reply_to":"3afb71cf_330abdd3","updated":"2015-06-05 15:41:14.000000000","message":"I think Sean and Miguel are correct here, and actually I think it\u0027s more than just a minor style thing. The above looks similar to the /detail URLs that we are trying to get rid of eventually...","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"          3. **gt**: greater than;"},{"line_number":107,"context_line":"          4. **ge**: greater or equal than;"},{"line_number":108,"context_line":"          5. **lt**: lesser than;"},{"line_number":109,"context_line":"          6. **le**: lesser or equal than."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        * Set comparison filtering is available for all the set-valued"},{"line_number":112,"context_line":"          type-specific metadata fields as well as common field \"tags\"."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_6929ef36","line":109,"updated":"2015-06-04 15:45:25.000000000","message":"API-WG is reviewing a guideline document on filtering (link above). We hope to have it ready in time to be used in this spec.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":106,"context_line":"          3. **gt**: greater than;"},{"line_number":107,"context_line":"          4. **ge**: greater or equal than;"},{"line_number":108,"context_line":"          5. **lt**: lesser than;"},{"line_number":109,"context_line":"          6. **le**: lesser or equal than."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        * Set comparison filtering is available for all the set-valued"},{"line_number":112,"context_line":"          type-specific metadata fields as well as common field \"tags\"."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_11c5728d","line":109,"updated":"2015-06-05 15:41:14.000000000","message":"Some of this advanced filtering language seems to be a little over the top, and something that the Searchlight project will likely have a richer, more standardized query language for doing group searches.\n\nI\u0027d almost prefer to see this advanced group search filtering left out of the Artifacts API for simplicity reasons and instead focus the Artifacts API on being a good RESTful API for:\n\n * Describing the schema (artifact type) of various\n   objects (artifacts) in a system\n * Validating data records for artifacts added to the\n   system with strong JSONSchema protection\n * Providing consistent, fast single-key lookup performance\n   for all artifact types with some basic filtering (nothing\n   complex)","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":106,"context_line":"          3. **gt**: greater than;"},{"line_number":107,"context_line":"          4. **ge**: greater or equal than;"},{"line_number":108,"context_line":"          5. **lt**: lesser than;"},{"line_number":109,"context_line":"          6. **le**: lesser or equal than."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        * Set comparison filtering is available for all the set-valued"},{"line_number":112,"context_line":"          type-specific metadata fields as well as common field \"tags\"."}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_ef717745","line":109,"in_reply_to":"5afe65bd_6929ef36","updated":"2015-08-26 16:00:26.000000000","message":"The following recommendations from this spec were applied:\n- rename the query parameter to f_\u003cproperty name\u003e\n- remove **eq** from list of operators because it should be supported by \u003d.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":114,"context_line":"          Set comparison requires a property name to be specified as query"},{"line_number":115,"context_line":"          parameter. The property may be repeated several times, e.g. the query"},{"line_number":116,"context_line":"          `?tags\u003dabc\u0026tags\u003dcde\u0026tags\u003dqwerty` will filter artifacts having either"},{"line_number":117,"context_line":"          \u0027abc, \u0027cde\u0027 or \u0027qwerty\u0027 tags associated."},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        * Checking for entry into the array property is performed by **in**"},{"line_number":120,"context_line":"          operation. It\u0027s done the same way as other filters, e.g."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_4e3b4bec","line":117,"updated":"2015-06-05 15:41:14.000000000","message":"Please follow the tags API WG guidelines:\n\nhttps://github.com/openstack/api-wg/blob/master/guidelines/tags.rst\n\nYou can even just leave a note saying for artifact tags, the API WG guidelines (link) will be followed.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"2e74dcb0f6c4f9fab164995e005ca37a52fea16b","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        Artifacts API will align with the `API Working group sorting guidelines"},{"line_number":129,"context_line":"        \u003chttps://github.com/openstack/api-wg/blob/master/guidelines/"},{"line_number":130,"context_line":"        pagination_filter_sort.rst\u003e`_ and support the following parameter on"},{"line_number":131,"context_line":"        the request:"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        * sort: Comma-separated list of sort keys, each key is optionally"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_ae03df0e","line":130,"updated":"2015-06-05 15:41:14.000000000","message":"++","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* **Create a new Artifact draft**"},{"line_number":164,"context_line":"   * **POST /v3/artifacts/{artifact_type}/{type_version}/drafts**"},{"line_number":165,"context_line":"   * Creates a new artifact record in database, the status of artifact is set"},{"line_number":166,"context_line":"     to CREATING. Request body may contain initial metadata of the artifact."},{"line_number":167,"context_line":"   * URL parameters:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_9719e6d9","line":164,"updated":"2015-06-04 15:45:25.000000000","message":"Since all artifacts are created as drafts, there is no need to specify the \"/drafts\" in the URL, so I would use:\n\n    POST /v3/artifacts/{artifact_type}//type_versions/{type_version}]","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fdacfddf1d504bf8a012d2bdf2994037b8648dc8","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"* **Create a new Artifact draft**"},{"line_number":164,"context_line":"   * **POST /v3/artifacts/{artifact_type}/{type_version}/drafts**"},{"line_number":165,"context_line":"   * Creates a new artifact record in database, the status of artifact is set"},{"line_number":166,"context_line":"     to CREATING. Request body may contain initial metadata of the artifact."},{"line_number":167,"context_line":"   * URL parameters:"},{"line_number":168,"context_line":"      * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_8a5b8f2e","line":165,"updated":"2015-06-05 11:19:25.000000000","message":"Again, I think artifact_type / type_version is really a mime type, and should just come in as Content-type - https://tools.ietf.org/html/rfc7231#section-3.1.1.5","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":167,"context_line":"   * URL parameters:"},{"line_number":168,"context_line":"      * `artifact_type` identifier of the artifact type, should be equal to a"},{"line_number":169,"context_line":"        valid constant defined in one of the active artifact plugins."},{"line_number":170,"context_line":"      * `type_version` identifier defining the version of artifact type."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"   * HTTP Responses:"},{"line_number":173,"context_line":"      * 201 if everything went fine. Location header is set to the artifact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_313cf592","line":170,"updated":"2015-06-05 13:23:04.000000000","message":"As the others have indicated, it seems that posting an artifact could be:\n\n     POST /v3/artifacts\n\nand artifact_type and type_version go in content-type.\n\nThis both makes more semantic sense (here, I have an artifact, I want to post it, and the type of artifact is in the provided representation) and is easier to explain/demonstrate.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":167,"context_line":"   * URL parameters:"},{"line_number":168,"context_line":"      * `artifact_type` identifier of the artifact type, should be equal to a"},{"line_number":169,"context_line":"        valid constant defined in one of the active artifact plugins."},{"line_number":170,"context_line":"      * `type_version` identifier defining the version of artifact type."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"   * HTTP Responses:"},{"line_number":173,"context_line":"      * 201 if everything went fine. Location header is set to the artifact"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_b208c6da","line":170,"in_reply_to":"3afb71cf_313cf592","updated":"2015-08-26 16:00:26.000000000","message":"The response from mid-cycle meetup:\n[Alexander Tivelkov] The answer here is that type name and version is much more then just a format of returned data: it is the name of the actual thing which handles the request, including various data trasformation and validation logic, which does not neccesary affects the format of input or output data. Also, type and type version info are needed for the request which return the value other then the actual artifacts (e.g. \u0027get a value of a property\u0027 which may either return a binary stream or a json value of a particular artifact attribute) or don\u0027t return the value at all (e.g. \u0027delete an artifact\u0027)","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":172,"context_line":"   * HTTP Responses:"},{"line_number":173,"context_line":"      * 201 if everything went fine. Location header is set to the artifact"},{"line_number":174,"context_line":"        location"},{"line_number":175,"context_line":"      * 404 if no Artifact Type is defined to handle specified value of"},{"line_number":176,"context_line":"        `artifact_type` and/or `type_version`"},{"line_number":177,"context_line":"      * 400 if an artifact of this type with the same name and version already"},{"line_number":178,"context_line":"        exists."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_b1f6a5d5","line":175,"updated":"2015-06-05 13:23:04.000000000","message":"If you switch to the URI I\u0027ve suggested just above (and the general concept of doing content-negotiation) the correct response would be 415","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":175,"context_line":"      * 404 if no Artifact Type is defined to handle specified value of"},{"line_number":176,"context_line":"        `artifact_type` and/or `type_version`"},{"line_number":177,"context_line":"      * 400 if an artifact of this type with the same name and version already"},{"line_number":178,"context_line":"        exists."},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"  * The response is a JSON-encoded representation of the created artifact."},{"line_number":181,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_31d87553","line":178,"updated":"2015-06-05 13:23:04.000000000","message":"You might want 409.\n\nAlso you\u0027ve used the term \"name\" here but I\u0027m not clear on where name comes from initially nor where it will be used later.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* **Publish an Artifact**"},{"line_number":184,"context_line":"   * **POST /v3/artifacts/{artifact_type}/{type_version}/{id}/publish**"},{"line_number":185,"context_line":"   * Publishes an artifact, i.e. moves it to ACTIVE state."},{"line_number":186,"context_line":"   * URL parameters:"},{"line_number":187,"context_line":"      * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_5786cedb","line":184,"updated":"2015-06-04 15:45:25.000000000","message":"This should be, in my opinion, a PUT request to the artifact URL that changes the state to ACTIVE.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"* **Publish an Artifact**"},{"line_number":184,"context_line":"   * **POST /v3/artifacts/{artifact_type}/{type_version}/{id}/publish**"},{"line_number":185,"context_line":"   * Publishes an artifact, i.e. moves it to ACTIVE state."},{"line_number":186,"context_line":"   * URL parameters:"},{"line_number":187,"context_line":"      * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_c7960394","line":184,"in_reply_to":"5afe65bd_5786cedb","updated":"2015-06-05 13:23:04.000000000","message":"miguel, technically that would require a full representation of the artifact in the body of the PUT, including an attribute that represents \"state\". As far as I can tell the representations under consideration here do not include a state attribute. Perhaps they should?\n\nHowever, given that the artifacts under consideration are often large, we don\u0027t want to be constantly passing around full representations just to activate them.\n\nGiven that, the options are PATCH (if \"state is in fact an attribute of the representation) the resource URI or POST to some kind of \"activator\" URI.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":203,"context_line":"   * The response is a JSON-encoded representation of the published artifact."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"* **Get an artifact**"},{"line_number":206,"context_line":"    * **GET /v3/artifacts/{artifact_type}/[{type_version}]/{id}**"},{"line_number":207,"context_line":"    * Returns an artifact record with all the common and type-specific metadata"},{"line_number":208,"context_line":"    * URL parameters:"},{"line_number":209,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_575dae77","line":206,"updated":"2015-06-04 15:45:25.000000000","message":"My proposal:\n\n    GET /v3/artifacts/{id}[/type_versions/{type_version}]","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":203,"context_line":"   * The response is a JSON-encoded representation of the published artifact."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"* **Get an artifact**"},{"line_number":206,"context_line":"    * **GET /v3/artifacts/{artifact_type}/[{type_version}]/{id}**"},{"line_number":207,"context_line":"    * Returns an artifact record with all the common and type-specific metadata"},{"line_number":208,"context_line":"    * URL parameters:"},{"line_number":209,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa1b9901_bb818191","line":206,"in_reply_to":"3afb71cf_47d0d353","updated":"2015-08-26 16:00:26.000000000","message":"So it is not easy to omit the artifact_type.\nThe response from mid-cycle meetup is the following:\n[Alexander Tivelkov] This is hard to implement, as the particular type may override even the DB API usage and the schema. For example, the ImageArtifact will route its request to  the v2 images controller, which relies on a legacy images db-api, while all the \"regular\" artifact types (i.e. the ones which subclass GenericArtifact) will use new artifact db-api and the tables added as part of artifacts repository work last cycle. In future we may get artifact types which even use different database instances (for example due to some performance optimizations) or even different DB architectures (mongo-based artifacts? Why not :)) In this case there is no way to query the exact type by a given id. The only option would be to try all the plugins one-by-one, which looks really, really bad.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":203,"context_line":"   * The response is a JSON-encoded representation of the published artifact."},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"* **Get an artifact**"},{"line_number":206,"context_line":"    * **GET /v3/artifacts/{artifact_type}/[{type_version}]/{id}**"},{"line_number":207,"context_line":"    * Returns an artifact record with all the common and type-specific metadata"},{"line_number":208,"context_line":"    * URL parameters:"},{"line_number":209,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_47d0d353","line":206,"in_reply_to":"5afe65bd_575dae77","updated":"2015-06-05 13:23:04.000000000","message":"yeah id should definition come closer to the top\n\nAnd depending on the outcome of discussion, type_version maybe in an Accept header.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":218,"context_line":"       * 404 if no artifact with the given ID was found or if the type of the"},{"line_number":219,"context_line":"         found artifact differs from type specified by `artifact_type`"},{"line_number":220,"context_line":"         parameter (if it is not equal to generic value \u0027artifacts\u0027) or if the"},{"line_number":221,"context_line":"         found artifact is not accessible by the current tenant."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    * The response is a JSON-encoded representation of the requested artifact."},{"line_number":224,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_8755abc7","line":221,"updated":"2015-06-05 13:23:04.000000000","message":"If accept headers are used, 406 will fit in here","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":225,"context_line":"* **Update an Artifact with PATCH call**"},{"line_number":226,"context_line":"    * **PATCH /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":227,"context_line":"    * Updates artifact\u0027s metadata fields. If the artifact is in state other"},{"line_number":228,"context_line":"      than CREATING then only mutable fields may be updated."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    * URL parameters:"},{"line_number":231,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_871a4b16","line":228,"updated":"2015-06-05 13:23:04.000000000","message":"There\u0027s a pending api-wg guideline on metadata as sub-resource which may be interesting:\n\nhttps://github.com/openstack/api-wg/blob/master/guidelines/metadata.rst","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"* **Update an Artifact with PUT or POST calls**"},{"line_number":258,"context_line":"    * **PUT /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":259,"context_line":"    * **POST /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":260,"context_line":"    * Updates artifact\u0027s metadata fields. If the artifact is in state other"},{"line_number":261,"context_line":"      than CREATING then only mutable fields may be updated."},{"line_number":262,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_77e66ab1","line":259,"updated":"2015-06-04 15:45:25.000000000","message":"Why POST here? If we are updating an existing entity PUT is the right method to use.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"* **Update an Artifact with PUT or POST calls**"},{"line_number":258,"context_line":"    * **PUT /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":259,"context_line":"    * **POST /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":260,"context_line":"    * Updates artifact\u0027s metadata fields. If the artifact is in state other"},{"line_number":261,"context_line":"      than CREATING then only mutable fields may be updated."},{"line_number":262,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_67ee2fee","line":259,"in_reply_to":"3afb71cf_93e73140","updated":"2015-06-05 13:23:04.000000000","message":"yeah: there should be only one way to do things","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fdacfddf1d504bf8a012d2bdf2994037b8648dc8","unresolved":false,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"* **Update an Artifact with PUT or POST calls**"},{"line_number":258,"context_line":"    * **PUT /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":259,"context_line":"    * **POST /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":260,"context_line":"    * Updates artifact\u0027s metadata fields. If the artifact is in state other"},{"line_number":261,"context_line":"      than CREATING then only mutable fields may be updated."},{"line_number":262,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_93e73140","line":259,"in_reply_to":"5afe65bd_77e66ab1","updated":"2015-06-05 11:19:25.000000000","message":"Agree","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"da9abd1632477ece740d6e8292a3b895c95332d3","unresolved":false,"context_lines":[{"line_number":292,"context_line":"    * The response is a JSON-encoded representation of an updated artifact."},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"* **Delete an Artifact**"},{"line_number":295,"context_line":"    * **DELETE /v3/artifacts/{artifact_type}/{type_version}/{id}**"},{"line_number":296,"context_line":"    * Deletes an artifact. See *Deleting an Artifact* for details"},{"line_number":297,"context_line":"    * URL parameters:"},{"line_number":298,"context_line":"       * `artifact_type` identifier of the artifact type, should be equal to a"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_c77cc322","line":295,"updated":"2015-06-05 13:23:04.000000000","message":"Does this delete the artifact what its form, or only a particular form out of several? (I\u0027m not entirely clear on whether there are multiple forms of the same artifact)\n\nIf the former just:\n\n   DELETE /v3/artifacts/{id}\n\nthat should be the main URI of the artifact: the one that is PUT, GET, and DELETE-ed","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":12606,"name":"Miguel Grinberg","email":"miguel.grinberg@gmail.com","username":"miguelgrinberg"},"change_message_id":"b28491874ac271c69b16acb4e1b8d7f10e815c5e","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"* GET /v3/artifacts/{artifact_type}/{id}"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"Retrieves an artifact with type `artifact_type` and id `id`."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"* PATCH /v3/artifacts/{artifact_type}/{type_version}/{id}"},{"line_number":329,"context_line":"  body \u003d [{\u0027op\u0027: \u0027add\u0027, \u0027path\u0027: \u0027/tags/-\u0027, \u0027value\u0027: \u0027new\u0027}]"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5afe65bd_d78e3ecf","line":326,"updated":"2015-06-04 15:45:25.000000000","message":"How do you find out what type_versions does this artifact have? Maybe this?\n\n    GET /v3/artifacts/{artifact_type}/{id}/type_versions","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":14676,"name":"Kairat Kushaev","email":"kkushaev@mirantis.com","username":"kairat_kushaev"},"change_message_id":"fbd1e3022b33f420843e79b5d7c5161a9587d700","unresolved":false,"context_lines":[{"line_number":323,"context_line":""},{"line_number":324,"context_line":"* GET /v3/artifacts/{artifact_type}/{id}"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"Retrieves an artifact with type `artifact_type` and id `id`."},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"* PATCH /v3/artifacts/{artifact_type}/{type_version}/{id}"},{"line_number":329,"context_line":"  body \u003d [{\u0027op\u0027: \u0027add\u0027, \u0027path\u0027: \u0027/tags/-\u0027, \u0027value\u0027: \u0027new\u0027}]"}],"source_content_type":"text/x-rst","patch_set":3,"id":"da20952f_79092731","line":326,"in_reply_to":"5afe65bd_d78e3ecf","updated":"2015-08-26 16:00:26.000000000","message":"You can use simple list artifact request with filtering to receive versions of artifacts.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fdacfddf1d504bf8a012d2bdf2994037b8648dc8","unresolved":false,"context_lines":[{"line_number":358,"context_line":"This request retrieves the value of BinaryObject property `blob`."},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"* PATCH /v3/artifacts/{artifact_type}/{type_version}/{id}"},{"line_number":361,"context_line":"  body \u003d [{\u0027op\u0027: \u0027remove\u0027, \u0027path\u0027: \u0027/blob\u0027}]"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"Security impact"},{"line_number":364,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_530539c0","line":361,"updated":"2015-06-05 11:19:25.000000000","message":"Typically the PUT POST GET flow is:\n\nPOST /things - create a new thing, returns /things/{id} as ref\n\nPUT /things/{id} - update said thing\n\nGET /things/{id} - get the thing\n\nGET and PUT should reference the same thing. The use of download seems weird here in the uri.","commit_id":"f04a8cd5673b673e6f5009cf5429437d9b76e2d2"}],"specs/mitaka/artifacts-api.rst":[{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"fb722a27f0250ba770cee223245ea71b2bb0ea07","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"All the APIs which are specific to the particular artifact type should be"},{"line_number":38,"context_line":"placed to `/v3/artifacts/{artifact_type}`, where `artifact_type` is a constant"},{"line_number":39,"context_line":"defined by the artifact type definition (i.e. by the plugin), which usually"},{"line_number":40,"context_line":"should be plural of the artifact type name."},{"line_number":41,"context_line":"For example, for artifacts of type \"template\" this constant may be called"},{"line_number":42,"context_line":"\u0027templates\u0027, so the API endpoints will start with `/v3/artifacts/templates`."}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba15a1d1_058651b9","line":39,"updated":"2015-09-21 15:04:31.000000000","message":"If this use of \"plugin\" means that different deployments may end up with different APIs, then we need to find some other solution that can better support interoperability requirements across deployments.","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"},{"author":{"_account_id":6159,"name":"Flavio Percoco Premoli","display_name":"flaper87","email":"flavio.percoco@flyrlabs.com","username":"flaper87"},"change_message_id":"eada783c756abb4a129867e3e5873965f177c7d5","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"All the APIs which are specific to the particular artifact type should be"},{"line_number":38,"context_line":"placed to `/v3/artifacts/{artifact_type}`, where `artifact_type` is a constant"},{"line_number":39,"context_line":"defined by the artifact type definition (i.e. by the plugin), which usually"},{"line_number":40,"context_line":"should be plural of the artifact type name."},{"line_number":41,"context_line":"For example, for artifacts of type \"template\" this constant may be called"},{"line_number":42,"context_line":"\u0027templates\u0027, so the API endpoints will start with `/v3/artifacts/templates`."}],"source_content_type":"text/x-rst","patch_set":7,"id":"7a2fa921_c672a349","line":39,"updated":"2015-10-13 00:13:11.000000000","message":"Just want to +1 Doug\u0027s comment (although you guys already mentioned that you were working on an interoperable version for this).","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"fb722a27f0250ba770cee223245ea71b2bb0ea07","unresolved":false,"context_lines":[{"line_number":49,"context_line":"identifier containing a SemVer-compliant string prefixed with `v`, e.g."},{"line_number":50,"context_line":"`/v3/artifacts/templates+v1.1.5`. This will identify the particular version of"},{"line_number":51,"context_line":"the artifact type if there are many of them available. In this case Artifact"},{"line_number":52,"context_line":"API uses the latest available version of artifact type."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* **List artifacts**"},{"line_number":55,"context_line":"   * **GET /v3/artifacts/{artifact_type}[+v{type_version}]**"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba15a1d1_e576bdd7","line":52,"updated":"2015-09-21 15:04:31.000000000","message":"Why use + instead of / to separate the type and the version?","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"fb722a27f0250ba770cee223245ea71b2bb0ea07","unresolved":false,"context_lines":[{"line_number":50,"context_line":"`/v3/artifacts/templates+v1.1.5`. This will identify the particular version of"},{"line_number":51,"context_line":"the artifact type if there are many of them available. In this case Artifact"},{"line_number":52,"context_line":"API uses the latest available version of artifact type."},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"* **List artifacts**"},{"line_number":55,"context_line":"   * **GET /v3/artifacts/{artifact_type}[+v{type_version}]**"},{"line_number":56,"context_line":"   * List all available artifacts."}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba15a1d1_60813b4d","line":53,"updated":"2015-09-21 15:04:31.000000000","message":"Is there an API to discover which artifact types and versions are supported by a given deployment?","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"},{"author":{"_account_id":2472,"name":"Doug Hellmann","email":"dhellmann@redhat.com","username":"doug-hellmann"},"change_message_id":"fb722a27f0250ba770cee223245ea71b2bb0ea07","unresolved":false,"context_lines":[{"line_number":398,"context_line":"type. As there may be multiple versions of the same type available, an optional"},{"line_number":399,"context_line":"string +v{type_version} may be included into each request to indicate the"},{"line_number":400,"context_line":"particular version of the plugin needed. It is optional, so if it is omitted"},{"line_number":401,"context_line":"the latest available version is used. Specification of the type_version in the"},{"line_number":402,"context_line":"URI does not limit the output to the artifacts created with the given type"},{"line_number":403,"context_line":"version."},{"line_number":404,"context_line":"For example, an artifact may be created with POST /v3/artifacts/some-type+v1"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba15a1d1_c05127da","line":401,"updated":"2015-09-21 15:04:31.000000000","message":"Other projects have defaulted to the oldest, rather than the newest, version to ensure maximum compatibility with clients. What are the pros and cons of doing that here?","commit_id":"779b74bdb0edcfcb3591f1837b1754b5c4159833"}]}
