)]}'
{"guidelines/capabilities.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"46bc3e36020cc1d111abcb6fa80903e9911870d2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Whether a certain action is or is not available should be discoverable through"},{"line_number":22,"context_line":"the API so that the user (or his automation) could decide on an alternative"},{"line_number":23,"context_line":"action (or simply fail) before actually trying to execute the action."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"API considerations"},{"line_number":26,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_6aadb187","line":23,"updated":"2016-10-19 09:15:28.000000000","message":"In these discussions I\u0027ve often wondered if the proposals would be helped with a deeper explanation of why \"failing to execute the action\" is an insufficient indicator that the capability is not available. Is there a high cost to trying and getting back a 403, 404 or some other 4xx that indicates \"nope, sorry, that\u0027s a real thing in the service, but you can\u0027t do it\". What\u0027s important about knowing in advance? What are the disadvantages of discovery by trying, especially if the alternate paths are \"try something different\" and \"fail\".\n\nI\u0027m not saying knowing is not important, I\u0027m saying why it is should be made explicit.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"025d683ee8006c2551a4253ef8356b4a16682613","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Whether a certain action is or is not available should be discoverable through"},{"line_number":22,"context_line":"the API so that the user (or his automation) could decide on an alternative"},{"line_number":23,"context_line":"action (or simply fail) before actually trying to execute the action."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"API considerations"},{"line_number":26,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"da6895a0_66e4003b","line":23,"in_reply_to":"da6895a0_2fbcd904","updated":"2016-11-07 15:26:40.000000000","message":"I think flavor can be modified by introducing a new capability, but already created VMs will not get the capability. Because of that we still need that info on the VMs side.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"13176478053f1b2e9c797d2408489ed733d0cbe2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Whether a certain action is or is not available should be discoverable through"},{"line_number":22,"context_line":"the API so that the user (or his automation) could decide on an alternative"},{"line_number":23,"context_line":"action (or simply fail) before actually trying to execute the action."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"API considerations"},{"line_number":26,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_8a14904d","line":23,"in_reply_to":"fa6399be_6aadb187","updated":"2016-10-20 12:01:48.000000000","message":"I think the brightest example of where discovery by trying is failing is on resource types. I don\u0027t really want to create a volume of each volume type to find the ones offering me consistency groups support. Or a VM for each flavor to see which ones are live-resizable.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"8c4b46a81d34e0bbdb5cedc06c896465b4ffe83d","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Whether a certain action is or is not available should be discoverable through"},{"line_number":22,"context_line":"the API so that the user (or his automation) could decide on an alternative"},{"line_number":23,"context_line":"action (or simply fail) before actually trying to execute the action."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"API considerations"},{"line_number":26,"context_line":"------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"da6895a0_2fbcd904","line":23,"in_reply_to":"fa6399be_8a14904d","updated":"2016-10-21 15:49:25.000000000","message":"forgive my ignorance, but why doesn\u0027t the flavor itself say whether it is live-resizable? and if it does, what does the capability provide instead that is better?","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f79bfecc6be47afd9b9f060a455166c7a317d40c","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  * Detecting availability of features dependent on internal cloud deployment"},{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_9671f678","line":35,"updated":"2016-11-03 14:21:13.000000000","message":"You missed the note that this is an authenticated call, so the results, even at this level, are based on the user\u0027s token.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"577bc2c759b3e0e81abf18edf21d77446456d17c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":40,"context_line":"    resource type."}],"source_content_type":"text/x-rst","patch_set":1,"id":"da6895a0_5aeee8ec","line":37,"updated":"2016-10-25 15:29:05.000000000","message":"do drivers fall in this category? e.g. ironic drivers define what can be done to nodes (see http://specs.openstack.org/openstack/ironic-specs/specs/backlog/driver-capabilities.html for something we\u0027ve put together long ago but never implemented)","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"52714759483a603318395be12fd80ce89f184244","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":40,"context_line":"    resource type."}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a629dbe_78922b59","line":37,"in_reply_to":"ba5da102_5bad9399","updated":"2016-11-07 15:51:30.000000000","message":"Ah, in which case, drivers matches this model. Apologies.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"6ba4d520db7d8e091e766a91e3ca769f47b215b6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":40,"context_line":"    resource type."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_5bad9399","line":37,"in_reply_to":"ba5da102_76c6229b","updated":"2016-11-03 14:29:05.000000000","message":"\u003e Drivers are not API discoverable\n\nIn Ironic they are. We have an API endpoint to list them, and a node has a \"driver\" field.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f79bfecc6be47afd9b9f060a455166c7a317d40c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":40,"context_line":"    resource type."}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_76c6229b","line":37,"in_reply_to":"da6895a0_5aeee8ec","updated":"2016-11-03 14:21:13.000000000","message":"Drivers are not API discoverable, but flavors or types might map to a specific driver. Need to focus on API discoverable concepts here.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"46bc3e36020cc1d111abcb6fa80903e9911870d2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"  * Detecting which actions that are available for that resource due to any"},{"line_number":45,"context_line":"    constraint."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Recommended API design"},{"line_number":48,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_8a44c5b7","line":45,"updated":"2016-10-19 09:15:28.000000000","message":"Can you go into more detail on my having the information in three different places is effective and efficient? No doubt there are reasons, but those reasons need to be clear.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"f79bfecc6be47afd9b9f060a455166c7a317d40c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"  * Detecting which actions that are available for that resource due to any"},{"line_number":45,"context_line":"    constraint."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Recommended API design"},{"line_number":48,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_96f816c5","line":45,"in_reply_to":"fa6399be_45ea6910","updated":"2016-11-03 14:21:13.000000000","message":"Maybe we should add a worked example to clear up some of the confusion here?","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"13176478053f1b2e9c797d2408489ed733d0cbe2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"  * Detecting which actions that are available for that resource due to any"},{"line_number":45,"context_line":"    constraint."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"Recommended API design"},{"line_number":48,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_45ea6910","line":45,"in_reply_to":"fa6399be_8a44c5b7","updated":"2016-10-20 12:01:48.000000000","message":"Definitely the reasons are:\n\n- Some capabilities are on cloud-level and should be readable even if we don\u0027t have any resources in the cloud.\n- Resource type level helps us to know what will be possible to do with a resource of such type - even if we don\u0027t have such resource created already.\n- Resource level tells us exactly what we can do with existing resource which saves user from need to combine info from both upper levels.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"6b88393ce908001d047620a69da2a7ac7f0f4dfa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"Recommended API design"},{"line_number":48,"context_line":"----------------------"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Cloud level"},{"line_number":51,"context_line":"^^^^^^^^^^^"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":".. code:: javascript"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    GET /capabilities"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    {"},{"line_number":58,"context_line":"        \"allowed\": ["}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_34c19be5","line":55,"range":{"start_line":50,"start_character":0,"end_line":55,"end_character":21},"updated":"2016-10-27 04:35:53.000000000","message":"I am not sure what this \"Cloud level\" means..\n\nAccording to line 32, this level seems top level of each cloud but actual resource(in this case, /capabilities) exists on resource type level(Nova, Cinder, etc).\n\nSo how to represent this \"Cloud level\"? Nova should represent that as the central component of OpenStack?\nIf so, that means Nova needs to collect all capabilities from different components and that is different from current direction of Nova, because Nova team is trying to drop proxy APIs now.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"025d683ee8006c2551a4253ef8356b4a16682613","unresolved":false,"context_lines":[{"line_number":47,"context_line":"Recommended API design"},{"line_number":48,"context_line":"----------------------"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"Cloud level"},{"line_number":51,"context_line":"^^^^^^^^^^^"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":".. code:: javascript"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    GET /capabilities"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    {"},{"line_number":58,"context_line":"        \"allowed\": ["}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a629dbe_725ecc46","line":55,"range":{"start_line":50,"start_character":0,"end_line":55,"end_character":21},"in_reply_to":"ba5da102_34c19be5","updated":"2016-11-07 15:26:40.000000000","message":"Definitely it shouldn\u0027t be centralized in Nova. I\u0027ve meant only a single service level.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"46bc3e36020cc1d111abcb6fa80903e9911870d2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    {"},{"line_number":58,"context_line":"        \"allowed\": ["},{"line_number":59,"context_line":"            {"},{"line_number":60,"context_line":"                \"id\": \"CAPABILITY_1\","},{"line_number":61,"context_line":"                \"link\": \"/resources/{id}/capability1\""},{"line_number":62,"context_line":"            }"},{"line_number":63,"context_line":"        ],"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_8aeda5b9","line":60,"updated":"2016-10-19 09:15:28.000000000","message":"Where do these ids come from and what do they mean? Why isn\u0027t the URI in link a sufficient id (since it is, by definition, an identifier)?\n\nWould it make sense for these to be formatted using \u0027rel\u0027 attributes as is common with many link representations?","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"13176478053f1b2e9c797d2408489ed733d0cbe2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    {"},{"line_number":58,"context_line":"        \"allowed\": ["},{"line_number":59,"context_line":"            {"},{"line_number":60,"context_line":"                \"id\": \"CAPABILITY_1\","},{"line_number":61,"context_line":"                \"link\": \"/resources/{id}/capability1\""},{"line_number":62,"context_line":"            }"},{"line_number":63,"context_line":"        ],"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa6399be_e53ffdb1","line":60,"in_reply_to":"fa6399be_8aeda5b9","updated":"2016-10-20 12:01:48.000000000","message":"I grabbed that from Nova\u0027s spec. Actually an URL and human readable description would be sufficient and I like the idea. Using el to provide human readable single word description also makes sense to me.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"30251b12d5e3979a49556924bca21ba9c1524e97","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    {"},{"line_number":58,"context_line":"        \"allowed\": ["},{"line_number":59,"context_line":"            {"},{"line_number":60,"context_line":"                \"id\": \"CAPABILITY_1\","},{"line_number":61,"context_line":"                \"link\": \"/resources/{id}/capability1\""},{"line_number":62,"context_line":"            }"},{"line_number":63,"context_line":"        ],"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_5b591334","line":60,"in_reply_to":"fa6399be_e53ffdb1","updated":"2016-11-03 14:25:41.000000000","message":"I thought in the cross project session we would start with just the human description here.\n\nMostly because there is no url/link we could give that would work really for all the instance action things.\n\nMy preference would be to support GET /capabilities/\u003cid\u003e to get more information on each id, which could include the link, eventually, if thats what we want.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"30251b12d5e3979a49556924bca21ba9c1524e97","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":".. code:: javascript"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    GET /resource_types/{id}/capabilities"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    {"},{"line_number":84,"context_line":"        \"allowed\": ["}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_1bef9b1e","line":81,"updated":"2016-11-03 14:25:41.000000000","message":"Maybe go for a specific example, like volume type?","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"577bc2c759b3e0e81abf18edf21d77446456d17c","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"allowed\": ["},{"line_number":85,"context_line":"            {"},{"line_number":86,"context_line":"                \"id\": \"CAPABILITY_1\","},{"line_number":87,"context_line":"                \"link\": \"/resources/{id}/capability1\""},{"line_number":88,"context_line":"            }"},{"line_number":89,"context_line":"        ],"},{"line_number":90,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"da6895a0_dab838e8","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":41},"updated":"2016-10-25 15:29:05.000000000","message":"Do I get it right that this {id} is not the same as {id} on line 81?","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"30251b12d5e3979a49556924bca21ba9c1524e97","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \"allowed\": ["},{"line_number":85,"context_line":"            {"},{"line_number":86,"context_line":"                \"id\": \"CAPABILITY_1\","},{"line_number":87,"context_line":"                \"link\": \"/resources/{id}/capability1\""},{"line_number":88,"context_line":"            }"},{"line_number":89,"context_line":"        ],"},{"line_number":90,"context_line":"    }"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ba5da102_1b7a3b88","line":87,"range":{"start_line":87,"start_character":36,"end_line":87,"end_character":41},"in_reply_to":"da6895a0_dab838e8","updated":"2016-11-03 14:25:41.000000000","message":"I vote we drop the link for now.","commit_id":"bc80d22a7a4cc3f84572a5c3ae2737070772bb33"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b12368b75f72714d4e476bb8ab3d910dcc5897d4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"As we have multiple levels on which availability of an action can occur, our"},{"line_number":29,"context_line":"API also need to have multiple levels:"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  * Detecting availability of features dependent on internal cloud deployment"},{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings, as the call is authenticated, so"},{"line_number":36,"context_line":"    results are based on user\u0027s token."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9a629dbe_0ca579b4","line":36,"range":{"start_line":31,"start_character":0,"end_line":36,"end_character":38},"updated":"2016-11-14 09:25:24.000000000","message":"So there isn\u0027t a way for user to distinguish he didn\u0027t have one capability due to the cloud deployment or the policy settings.\n\nIs there a requirement for the user about they want to know the exactly reason why he didn\u0027t get the capability? If it is due to the policy, the user can try to change to another powerful account.","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2fbc9e2aba7c76fea2368a20bea7b0a1edaaa6ee","unresolved":false,"context_lines":[{"line_number":28,"context_line":"As we have multiple levels on which availability of an action can occur, our"},{"line_number":29,"context_line":"API also need to have multiple levels:"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  * Detecting availability of features dependent on internal cloud deployment"},{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings, as the call is authenticated, so"},{"line_number":36,"context_line":"    results are based on user\u0027s token."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a77a97e_81bbfd71","line":36,"range":{"start_line":31,"start_character":0,"end_line":36,"end_character":38},"in_reply_to":"9a629dbe_0ca579b4","updated":"2016-11-15 13:31:34.000000000","message":"We\u0027ve talked about that at the Design Summit session. I actually ended up following John\u0027s advice and designing the API in the easiest way possible.\n\nAre we actually able to expand this API in a backward-compatible way with more info? Maybe we should do dictionaries on level where we have booleans now?\n\nJohn, can you comment here?","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"5b3ce27914a283cd100076a4fe54e171ea519ad4","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":".. code:: javascript"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    GET /capabilities"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a77a97e_c7410565","line":56,"updated":"2016-11-17 18:26:36.000000000","message":"I\u0027d recommend a shorter, simpler, easier-to-spell word. In swift, we use \"/info\".","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bb0736fb9d34034a8cf97600b467e37fb491cce9","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. code:: javascript"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    GET /resource/{id}/capabilities"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    {"},{"line_number":92,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a77a97e_90d5b7ba","line":89,"range":{"start_line":89,"start_character":9,"end_line":89,"end_character":17},"updated":"2016-11-16 22:40:59.000000000","message":"Per your examples above, this should probably be \"volume\".","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"fdde80ea549e3840415c4cd99e39e081b0d9d51e","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. code:: javascript"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    GET /resource/{id}/capabilities"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    {"},{"line_number":92,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":2,"id":"5a74a57a_27c76246","line":89,"range":{"start_line":89,"start_character":9,"end_line":89,"end_character":17},"in_reply_to":"7a77a97e_90d5b7ba","updated":"2016-11-24 17:37:57.000000000","message":"Done","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bb0736fb9d34034a8cf97600b467e37fb491cce9","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"volume-replication\": False"},{"line_number":95,"context_line":"        },"},{"line_number":96,"context_line":"    }"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a77a97e_abb08444","line":97,"updated":"2016-11-16 22:40:59.000000000","message":"We should have a references section or something in here where you can link to the summit etherpad:\n\nhttps://etherpad.openstack.org/p/ocata-xp-unified-capabilities-api","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"fdde80ea549e3840415c4cd99e39e081b0d9d51e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"volume-replication\": False"},{"line_number":95,"context_line":"        },"},{"line_number":96,"context_line":"    }"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"5a74a57a_67c15a2e","line":97,"in_reply_to":"7a77a97e_abb08444","updated":"2016-11-24 17:37:57.000000000","message":"Done","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"5b3ce27914a283cd100076a4fe54e171ea519ad4","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"volume-replication\": False"},{"line_number":95,"context_line":"        },"},{"line_number":96,"context_line":"    }"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a77a97e_87bd4d6a","line":97,"in_reply_to":"7a77a97e_abb08444","updated":"2016-11-17 18:26:36.000000000","message":"Wow, I totally missed that session.","commit_id":"cd5c215d437738ea300fac86f289c5bb4a1965b3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"------------------"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As we have multiple levels on which availability of an action can occur, our"},{"line_number":29,"context_line":"API also need to have multiple levels:"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_4578da2a","line":29,"updated":"2016-12-14 10:03:55.000000000","message":"Is it worth calling out a separate list of things that apply to all the APIs here, such as:\n\n* Results being specific to the specified keystone token (i.e. its an authenticated call for all of these URLs)\n* policy settings are taken into account (using above token)\n* system abilities based on current configuration\n* False means an operation isn\u0027t possible, no matter what additional params you specify, True just means there are times and parameters that mean that operation is possible.\n\nWhen the scope comes into things, it really just scopes the consideration of  the discussion to the specific instance.\n\nOne open question I have in my mind is when you scope it to an instance or volume, do we take into account the current state of that resource and what operations are possible? Such as, you can\u0027t delete a volume that is in-use. I am tempted to say No, but thats probably not what the UI folks would like? Thoughts?","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"------------------"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"As we have multiple levels on which availability of an action can occur, our"},{"line_number":29,"context_line":"API also need to have multiple levels:"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_f580398d","line":29,"in_reply_to":"1a6eadb0_4578da2a","updated":"2016-12-16 12:59:05.000000000","message":"I\u0027ve listed most of these in lines 13-19. I\u0027ve added your last point here.\n\nAbout the states of the resource - this is race-condition prone. For example: volume has ``migration-status`` property, which isn\u0027t user-facing. It can block doing deletes on such volume, but only for the period of migration. Now if Horizon will ask Cinder about the volume actions and get the response that at this moment deletion is impossible, it would disable \"Delete\" button. The problem is - just a moment later the volume may become deletable again. It\u0027s better to have state-based exclusion resolved at the moment the action is taken.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  * Detecting availability of features dependent on internal cloud deployment"},{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings, as the call is authenticated, so"},{"line_number":36,"context_line":"    results are based on user\u0027s token."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_45bb7a27","line":34,"range":{"start_line":34,"start_character":4,"end_line":34,"end_character":11},"updated":"2016-12-14 10:03:55.000000000","message":"Maybe add a little more detail like: \"such as what drivers are being used\"?","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"* Cloud level"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"  * Detecting availability of features dependent on internal cloud deployment"},{"line_number":34,"context_line":"    details."},{"line_number":35,"context_line":"  * Detecting deployment policy settings, as the call is authenticated, so"},{"line_number":36,"context_line":"    results are based on user\u0027s token."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_7f56c806","line":34,"range":{"start_line":34,"start_character":4,"end_line":34,"end_character":11},"in_reply_to":"1a6eadb0_45bb7a27","updated":"2016-12-16 12:59:05.000000000","message":"Done","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":41,"context_line":"    resource type."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_e5a3a64d","line":41,"updated":"2016-12-14 10:03:55.000000000","message":"Examples I think would help, maybe: you can have two cinder volume types, and only one of the types might support export.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":38,"context_line":"* Resource type level (Nova flavor, Cinder volume type, Neutron flavor…)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"  * Detecting actions that will be available for resources created from such"},{"line_number":41,"context_line":"    resource type."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_5abcbaba","line":41,"in_reply_to":"1a6eadb0_e5a3a64d","updated":"2016-12-16 12:59:05.000000000","message":"Done","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  * Detecting which actions that are available for that resource due to any"},{"line_number":46,"context_line":"    constraint."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Recommended API design"},{"line_number":49,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_25d83eef","line":46,"updated":"2016-12-14 10:03:55.000000000","message":"I think examples would help here, like: a Nova instance running under ironic can\u0027t be snapshotted, but a instance running on KVM in the same cloud can be snapshotted.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"* Resource level (Nova server, Cinder volume…)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"  * Detecting which actions that are available for that resource due to any"},{"line_number":46,"context_line":"    constraint."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Recommended API design"},{"line_number":49,"context_line":"----------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_3a153e9b","line":46,"in_reply_to":"1a6eadb0_25d83eef","updated":"2016-12-16 12:59:05.000000000","message":"Done","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"39e3537e2179435fce256559649f2c3a10b1a5a5","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_6a785fc5","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":35},"updated":"2016-12-13 19:46:50.000000000","message":"I also like the suggestion (from patch set 2) of switching from boolean to dictionary in values for each capability.\n\nThe dictionary could be as simple as ``available`` with ``(True|False)`` values at the onset. \n\nSwitching this to a dictionary now leaves more room for additional (optional) value on a per-project basis as well as for extension of the guideline in the future by the WG.\n\nfor example: \n * a verbose ``description`` of the capability\n * ``availability`` hints such as: (available|unsupported|prohibited|unavailable|...)\n * an ``options`` list or ``max|min`` values where appropriate\n * rel links where appropriate\n\nThe ``availability`` key could be used as additional optional guidance about why a capability is [not] available. There would be negative security implications to publishing an availability as ``prohibited`` (by policy) on some (perhaps all) capabilities, and similar risks surround other potential hints, so defer the exploration of these hints for now.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_b0fc0fb9","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":35},"in_reply_to":"1a6eadb0_074b6188","updated":"2016-12-16 12:59:05.000000000","message":"So do you think I should make this dictionaries instead of booleans? Dicts are way easier to extend later.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"1dfd6543702890249d097d278444cf509f27aac3","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_c4e88713","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":35},"in_reply_to":"1a6eadb0_6a785fc5","updated":"2016-12-13 20:18:38.000000000","message":"I\u0027d caution against the \"description\" field. Pushback i\u0027ve gotten in the past on that comes down to \"I don\u0027t want to have to redeploy every time the marketing department decides to change something\". If we\u0027re looking for human-readable stuff, here, I\u0027d suggest there\u0027s a *lot* that should be changed.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_074b6188","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":35},"in_reply_to":"1a6eadb0_c4e88713","updated":"2016-12-14 10:03:55.000000000","message":"Leaving the room for extension is not a terrible idea. But I do like the simplicity of this approach, and the consistency that would give us.\n\nI would much rather we get agreement on something really simple, and expand it later. If leaving room for expansion helps with that, I am OK with it.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"},{"line_number":64,"context_line":"            \"cloud\": \"/capabilities\","}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_8513d2b7","line":61,"updated":"2016-12-14 10:03:55.000000000","message":"We should be specific about the fact this list is the same for all users. i.e. you can see what you don\u0027t have access to. There is no hiding of items in the list based on the users token.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":58,"context_line":"    {"},{"line_number":59,"context_line":"        \"capabilities\": {"},{"line_number":60,"context_line":"            \"volume-backups\": True,"},{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"},{"line_number":64,"context_line":"            \"cloud\": \"/capabilities\","}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_fa80268d","line":61,"in_reply_to":"1a6eadb0_8513d2b7","updated":"2016-12-16 12:59:05.000000000","message":"Done","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            \"volume-replication\": False"},{"line_number":62,"context_line":"        },"},{"line_number":63,"context_line":"        \"scopes\": {"},{"line_number":64,"context_line":"            \"cloud\": \"/capabilities\","},{"line_number":65,"context_line":"            \"volume-type\": \"/volume-types/{type_id}/capabilities\","},{"line_number":66,"context_line":"            \"volume\": \"/volumes/{volume_id}/capabilities\""},{"line_number":67,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_875f7140","line":64,"updated":"2016-12-14 10:03:55.000000000","message":"Nit: Somehow this seems redundant, but I like the consistency of having it here.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"39e3537e2179435fce256559649f2c3a10b1a5a5","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. code:: javascript"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    GET /volume/{id}/capabilities"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    {"},{"line_number":92,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_af77e938","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":20},"updated":"2016-12-13 19:46:50.000000000","message":"why is this not \u0027/volumes/{volume_id}\u0027 for consistency?","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"c0de36c3ed3d7b25f7f34aa731a76e0b614e28c1","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":".. code:: javascript"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    GET /volume/{id}/capabilities"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    {"},{"line_number":92,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_5f5bf5f5","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":20},"in_reply_to":"1a6eadb0_af77e938","updated":"2016-12-16 12:59:05.000000000","message":"Yup, it should. Done.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"39e3537e2179435fce256559649f2c3a10b1a5a5","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"volume-replication\": False"},{"line_number":95,"context_line":"        },"},{"line_number":96,"context_line":"    }"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"References"},{"line_number":99,"context_line":"----------"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_ea638f18","line":97,"updated":"2016-12-13 19:46:50.000000000","message":"I would like to see discussion of the purpose of the ``capabilities`` and ``scopes`` nodes included here. They are underspecified for easy application right now.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"33528e054da54fb5c2cca0935a89202184e23ad7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            \"volume-replication\": False"},{"line_number":95,"context_line":"        },"},{"line_number":96,"context_line":"    }"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"References"},{"line_number":99,"context_line":"----------"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a6eadb0_255bde55","line":97,"in_reply_to":"1a6eadb0_ea638f18","updated":"2016-12-14 10:03:55.000000000","message":"Added some ideas above to help describe the examples. Putting that in here too is no bad thing.","commit_id":"85a4cd953f14e8ca4fa7a712bafb14b7789c51c6"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3616dbb55071749a4bb7c0ec42e4ebe07aeaae62","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Cloud level"},{"line_number":63,"context_line":"^^^^^^^^^^^"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. code:: javascript"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    GET /capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_0aeee1eb","line":64,"updated":"2017-01-04 13:49:24.000000000","message":"Should we add the question the user is asking here, i.e. \"Can I do volume-backups on this cloud?\"\n\nIf you have access to multiple clouds, but really need to do a volume-backup, then you can choose a cloud that supports what you need for some resource type.\n\nThis could be used by CLI tools to trim down the help text to only the actions the user has access to do on that cloud.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2ed6eabb82805db49204d9eeb44ec22230afa0af","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Cloud level"},{"line_number":63,"context_line":"^^^^^^^^^^^"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":".. code:: javascript"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    GET /capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_aac5430b","line":64,"in_reply_to":"ba5201f7_0aeee1eb","updated":"2017-01-09 12:16:20.000000000","message":"Done","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3616dbb55071749a4bb7c0ec42e4ebe07aeaae62","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Resource type level"},{"line_number":86,"context_line":"^^^^^^^^^^^^^^^^^^^"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":".. code:: javascript"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    GET /volume-types/{type_id}/capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_caca196e","line":87,"updated":"2017-01-04 13:49:24.000000000","message":"As above, Can I do volume backups with type_id_7?\n\nThis helps you pick with volume type to use, if you want to be able to backup your volume.\n\nHorizon and other UIs could use this to have a good guess at what buttons to display for each of the volumes of a given type.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2ed6eabb82805db49204d9eeb44ec22230afa0af","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"Resource type level"},{"line_number":86,"context_line":"^^^^^^^^^^^^^^^^^^^"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":".. code:: javascript"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    GET /volume-types/{type_id}/capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_eacf4b27","line":87,"in_reply_to":"ba5201f7_caca196e","updated":"2017-01-09 12:16:20.000000000","message":"Done","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3616dbb55071749a4bb7c0ec42e4ebe07aeaae62","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Resource level"},{"line_number":104,"context_line":"^^^^^^^^^^^^^^"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. code:: javascript"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    GET /volume/{volume_id}/capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_0a73414e","line":105,"updated":"2017-01-04 13:49:24.000000000","message":"Can I do volume-backup on volume_id_7?\n\nAs its an expensive operation, there is intentionally no bulk operation can could be used in a big list of volumes to update a UI, but it could be used in a volume specific screen to show what operations are not available.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2ed6eabb82805db49204d9eeb44ec22230afa0af","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"Resource level"},{"line_number":104,"context_line":"^^^^^^^^^^^^^^"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. code:: javascript"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    GET /volume/{volume_id}/capabilities"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_2ada33ea","line":105,"in_reply_to":"ba5201f7_0a73414e","updated":"2017-01-09 12:16:20.000000000","message":"Done","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3616dbb55071749a4bb7c0ec42e4ebe07aeaae62","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. code:: javascript"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    GET /volume/{volume_id}/capabilities"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    {"},{"line_number":111,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_aa97958e","line":108,"updated":"2017-01-04 13:49:24.000000000","message":"We should include this detail here:\n\nNow it would be nice to include capabilities inside the resource its-self.\n\nThe problem is its very expensive to ask the resource provider if actions are possible, you need to go ask the resource provider. Now you can do caching etc, to \"fix\" that.\n\nIt just seems pragmatic to keep this outside the main resource because of the cost.\n\nThere are alternatives we could discuss here too: including in the main resource representation (too expensive to implement), including when you add a query string or a sub resource as proposed here.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2ed6eabb82805db49204d9eeb44ec22230afa0af","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":".. code:: javascript"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    GET /volume/{volume_id}/capabilities"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    {"},{"line_number":111,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_aa61c313","line":108,"in_reply_to":"ba5201f7_aa97958e","updated":"2017-01-09 12:16:20.000000000","message":"I\u0027m not sure if I\u0027ve got this right - please evaluate changes I\u0027ve proposed in the next patchset.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3616dbb55071749a4bb7c0ec42e4ebe07aeaae62","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            }"},{"line_number":118,"context_line":"        }"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"References"},{"line_number":122,"context_line":"----------"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_aaf95582","line":120,"updated":"2017-01-04 13:49:24.000000000","message":"I think we should define if these capabilities are related to the current state of the resource. i.e. define how much can this information be cached.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"2ed6eabb82805db49204d9eeb44ec22230afa0af","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            }"},{"line_number":118,"context_line":"        }"},{"line_number":119,"context_line":"    }"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"References"},{"line_number":122,"context_line":"----------"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba5201f7_aa162356","line":120,"in_reply_to":"ba5201f7_aaf95582","updated":"2017-01-09 12:16:20.000000000","message":"If having these information cached could block user from doing something from the GUI, I don\u0027t think it\u0027s a good idea to do caching on server side. We should use standard HTTP 1.1 caching mechanisms, that leave caching on the client side, so client is always able to get latest info if really needed. I\u0027ll add this info here.","commit_id":"554fcb92f3695e2a323bb8dd8e00790742cb29e9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2afbecf68f6edf17587273ae00e14fc4adf8f619","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":".. code:: javascript"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    GET /capabilities"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    {"},{"line_number":77,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a461143_75154c47","line":74,"updated":"2017-01-30 17:58:34.000000000","message":"Dean makes a good comment about this.\n\nI was assuming this is a per API endpoint goal, and each endpoint should adopt the same format.\n\nWe should make that clear here.","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71e579259c09aa5cc3ae60460c855e077e49bef7","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":".. code:: javascript"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    GET /capabilities"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    {"},{"line_number":77,"context_line":"        \"capabilities\": {"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa31d9ce_2be2da9f","line":74,"in_reply_to":"3a461143_75154c47","updated":"2017-02-13 13:57:04.000000000","message":"I\u0027ve added this explanation.","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2afbecf68f6edf17587273ae00e14fc4adf8f619","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    GET /capabilities"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    {"},{"line_number":77,"context_line":"        \"capabilities\": {"},{"line_number":78,"context_line":"            \"volume-backups\": {"},{"line_number":79,"context_line":"                \"available\": true"},{"line_number":80,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a461143_b8f88bc4","line":77,"updated":"2017-01-30 17:58:34.000000000","message":"Should this include the scope name somehow?","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71e579259c09aa5cc3ae60460c855e077e49bef7","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    GET /capabilities"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    {"},{"line_number":77,"context_line":"        \"capabilities\": {"},{"line_number":78,"context_line":"            \"volume-backups\": {"},{"line_number":79,"context_line":"                \"available\": true"},{"line_number":80,"context_line":"            },"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa31d9ce_abec0a90","line":77,"in_reply_to":"3a461143_b8f88bc4","updated":"2017-02-13 13:57:04.000000000","message":"Switched that to be scope name.","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2afbecf68f6edf17587273ae00e14fc4adf8f619","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            }"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"        \"scopes\": {"},{"line_number":86,"context_line":"            \"cloud\": \"/capabilities\","},{"line_number":87,"context_line":"            \"volume-type\": \"/volume-types/{type_id}/capabilities\","},{"line_number":88,"context_line":"            \"volume\": \"/volumes/{volume_id}/capabilities\""},{"line_number":89,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a461143_78a8e3db","line":86,"range":{"start_line":86,"start_character":13,"end_line":86,"end_character":18},"updated":"2017-01-30 17:58:34.000000000","message":"This name seems a little random here.\n\nI am tempted by either a list of end points, or we a document into the scopes, and consider a \"parent\" pointer, which is null in the case of the \"cloud\" scope, something like:\n\n   scopes: {\n       \"cloud\": {\"link\": \"/capabilities\", \"parent\": null},\n       \"volume-type\": {link: \"...\", parent: \"cloud\"},\n       \"volume\": {link: \"...\", parent: \"volume-type\"}\n    ]","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71e579259c09aa5cc3ae60460c855e077e49bef7","unresolved":false,"context_lines":[{"line_number":83,"context_line":"            }"},{"line_number":84,"context_line":"        },"},{"line_number":85,"context_line":"        \"scopes\": {"},{"line_number":86,"context_line":"            \"cloud\": \"/capabilities\","},{"line_number":87,"context_line":"            \"volume-type\": \"/volume-types/{type_id}/capabilities\","},{"line_number":88,"context_line":"            \"volume\": \"/volumes/{volume_id}/capabilities\""},{"line_number":89,"context_line":"        }"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa31d9ce_2ba73a50","line":86,"range":{"start_line":86,"start_character":13,"end_line":86,"end_character":18},"in_reply_to":"3a461143_78a8e3db","updated":"2017-02-13 13:57:04.000000000","message":"I\u0027ve changed the name to \u0027service\u0027 - maybe it\u0027ll clarify the fact that this is per-service endpoint. I\u0027ve also added this parent field.","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2afbecf68f6edf17587273ae00e14fc4adf8f619","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            \"volume-type\": \"/volume-types/{type_id}/capabilities\","},{"line_number":88,"context_line":"            \"volume\": \"/volumes/{volume_id}/capabilities\""},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"    }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Resource type level"},{"line_number":93,"context_line":"^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3a461143_7b38dd3d","line":90,"updated":"2017-01-30 17:58:34.000000000","message":"Dean makes a good point about listing all the cloud wide and type specific capabilities in a single API call.\n\nI wonder if something like this would work:\n\n    GET /capabilities\n    {\n        \"scopes\": {\n             \"cloud\": {\n                 \"type\": \"inline\",\n                 \"parent\": null,\n                 \"capabilities\": {\"foo\": {\"available\": True\"}....},\n                 \"link\": \"/capabilities\"\n             },\n             \"volume-type\": {\n                 \"type\": \"sub-scope-inline\",\n                 \"parent\": \"cloud\",\n                 \"sub-scopes\": {\n                     \"type1\": {\n                         \"type\": \"inline\",\n                         \"parent\": \"volume-type\",\n                         \"capabilities\": {\"bar\": {\"available\": True\"}....},\n                         \"link\": \"/volume-types/type1/capabilities\"\n                     }\n                 },\n                 \"link\": \"/volume-types/{type_id}/capabilities\"\n             }\n             \"volume\": {\n                 \"type\": \"scope-link\",\n                 \"parent\": \"volume-type\",\n                 \"link\": \"/volume/{volume_id}/capabilities\"\n             }\n        }\n    }","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"71e579259c09aa5cc3ae60460c855e077e49bef7","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            \"volume-type\": \"/volume-types/{type_id}/capabilities\","},{"line_number":88,"context_line":"            \"volume\": \"/volumes/{volume_id}/capabilities\""},{"line_number":89,"context_line":"        }"},{"line_number":90,"context_line":"    }"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"Resource type level"},{"line_number":93,"context_line":"^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":6,"id":"fa31d9ce_c98786d5","line":90,"in_reply_to":"3a461143_7b38dd3d","updated":"2017-02-13 13:57:04.000000000","message":"The problem of this case is that in Cinder\u0027s case sometimes even for volume-type we would need to call down to the driver.\n\nHow about we\u0027ll keep first version as is? It should be trivial to extend the schema here.","commit_id":"6e6f3124bbc96d12febdb87f3b2de3b808bdb76b"},{"author":{"_account_id":17645,"name":"Shan Guo","email":"guoshan.jolie@gmail.com","username":"guoshan"},"change_message_id":"9ada59fb8bb00de7980f58bfa88b6dc5d5117dbc","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"This level aims to answer questions like \"Can I do volume backup of a volume"},{"line_number":133,"context_line":"``bar``?\". As this can be an expensive operation, it\u0027s not intended to support"},{"line_number":134,"context_line":"bulk requests for mulitple volumes, but can be used in Horizon\u0027ss single"},{"line_number":135,"context_line":"resource pages, to determine which action buttons should be enabled."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":".. code:: javascript"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_15174f52","line":134,"range":{"start_line":134,"start_character":63,"end_line":134,"end_character":65},"updated":"2017-03-07 06:58:31.000000000","message":"extral \"s\"","commit_id":"1586db8c96ac45f3d0a97d94e9e22ee0e55af1a2"},{"author":{"_account_id":17645,"name":"Shan Guo","email":"guoshan.jolie@gmail.com","username":"guoshan"},"change_message_id":"9ada59fb8bb00de7980f58bfa88b6dc5d5117dbc","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"This level aims to answer questions like \"Can I do volume backup of a volume"},{"line_number":133,"context_line":"``bar``?\". As this can be an expensive operation, it\u0027s not intended to support"},{"line_number":134,"context_line":"bulk requests for mulitple volumes, but can be used in Horizon\u0027ss single"},{"line_number":135,"context_line":"resource pages, to determine which action buttons should be enabled."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":".. code:: javascript"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9a30ddce_b5176353","line":134,"range":{"start_line":134,"start_character":18,"end_line":134,"end_character":26},"updated":"2017-03-07 06:58:31.000000000","message":"nit: multiple","commit_id":"1586db8c96ac45f3d0a97d94e9e22ee0e55af1a2"}]}
