)]}'
{"specs/liberty/app-update.rst":[{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"511c35d17d29edcf34760b3e72cd421c14c045d3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"One approach to keep the app URL constant across app deployments is to use a heat template"},{"line_number":29,"context_line":"that has two resources, a load balancer and a server, and the load balancer connected to the server."},{"line_number":30,"context_line":"To ensure that the application\u0027s URL does not change across multiple deployments, the idea"},{"line_number":31,"context_line":"is to perform a heat stack up in which we create the new server, add it to the load balancer,"},{"line_number":32,"context_line":"and delete the old server when the new server is up."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"One way to effect the above change is to follow a two step protocol."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_18e06e95","line":31,"updated":"2015-06-10 22:19:43.000000000","message":"heat stack update","commit_id":"0e4758122c1527947a4d27c6fc5bba091237babb"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"511c35d17d29edcf34760b3e72cd421c14c045d3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"One way to effect the above change is to follow a two step protocol."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Step 1 will be to issue heat stack-update call with a template in which the new server is added."},{"line_number":37,"context_line":"Note that it may happen that step 1 itself may throw an exception if there is already"},{"line_number":38,"context_line":"an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick succession"},{"line_number":39,"context_line":"and the corresponding update actions are picked by two different deployers."},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"3afb71cf_78040249","line":37,"updated":"2015-06-10 22:19:43.000000000","message":"no need for the word \"itself\"","commit_id":"0e4758122c1527947a4d27c6fc5bba091237babb"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"58095ff7e96fd4ad05685dc5399306891ee5a600","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Proposed change"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"One approach to keep the app URL constant across app deployments is to use a heat template"},{"line_number":27,"context_line":"that has two resources, a load balancer and a server, and the load balancer connected to the server."},{"line_number":28,"context_line":"To ensure that the application\u0027s URL does not change across multiple deployments, the idea"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_6bfe123a","line":25,"updated":"2015-06-11 16:47:53.000000000","message":"The spec talks about the case where the heat stack only contains a *single* server. I am not sure if the proposed approach also applies to the multi-server scenario. But I do think it *should* not involve a major change to the approach in the future to support multi-server deployment.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"1fa1c8f7c8becbf6a4d63eef0417704f4ec3c116","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Proposed change"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"One approach to keep the app URL constant across app deployments is to use a heat template"},{"line_number":27,"context_line":"that has two resources, a load balancer and a server, and the load balancer connected to the server."},{"line_number":28,"context_line":"To ensure that the application\u0027s URL does not change across multiple deployments, the idea"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_6e73c0e8","line":25,"in_reply_to":"3afb71cf_6bfe123a","updated":"2015-06-11 16:58:48.000000000","message":"Could you clarify what you mean by multi-server scenairo?\nIs it, two different DUs or multiple servers of the same DU? \n\nThe latter case is really about autoscaling. The former case we are not even supporting currently in our data model (plan/app file only supports one DU case).\n\nThe autoscaling case should work in a similar manner to what is proposed here. We may have to define an autoscaling resource group I think. I haven\u0027t looked into how autoscaling would work.\nIn any case that should be addressed in a separate spec imo.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":6662,"name":"James Li","email":"yueli.m@gmail.com","username":"james-li-3"},"change_message_id":"58095ff7e96fd4ad05685dc5399306891ee5a600","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_ce0d14ea","line":33,"updated":"2015-06-11 16:47:53.000000000","message":"Here is my alternative thought: we don\u0027t have to do a stack UPDATE. we keep two stacks per app, one of which just contains a single LB, another one is the stack containing servers. \n\n\nOnce solum generates a new DU, solum creates a NEW server-stack with the new du, and associate the new server-stack to the LB, and then destroy the old server-stack.\n\n\nThe big advantage of this approach is solum already has the code to ensure concurrency correctness across simultaneous heat stacks. so we don\u0027t need to invent a new protocol.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"d0d2ec32018076956d00056e0b9a1232c129e7d5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_e11b417f","line":33,"in_reply_to":"3afb71cf_218cb97e","updated":"2015-06-11 17:28:55.000000000","message":"Not a specific one, but it is quite possible. Heat connects things by ids. Passing sever ids into another stack that manages a load balancer is possible.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"8f7e8a1eba54a3bfce3ddd5613251dcf6ac7d9b0","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_218cb97e","line":33,"in_reply_to":"3afb71cf_8eda7ce8","updated":"2015-06-11 17:03:40.000000000","message":"Randall -- \n\nCould you point me to an example of connecting a LB from one stack to a node in another stack.\n\nAlso, why do you think concurrency is not a big issue?","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"1fa1c8f7c8becbf6a4d63eef0417704f4ec3c116","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_8167ede9","line":33,"in_reply_to":"3afb71cf_ce0d14ea","updated":"2015-06-11 16:58:48.000000000","message":"I don\u0027t know if it is possible to connect a LB from one stack with a node in another stack in Heat.\n\nAlso, breaking the actions into separate actions as you are proposing  will actually lead to race conditions. How do we ensure that there are never more than one active server stacks in the system for an app in the presence of multiple deployers? (correctness property 2 identified below).\n\nAlso, I don\u0027t think solum already has code to ensure concurrency correctness across simultaneous heat stack creates in a multi-deployer scenario. We don\u0027t coordinate between different deployers (point identified in discussion of correctness property 3 below).","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"5287f4a08ed46d01225abaa15368f421cf509e9e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_8eda7ce8","line":33,"in_reply_to":"3afb71cf_ce0d14ea","updated":"2015-06-11 16:52:47.000000000","message":"That works too, but I don\u0027t think the concurrency is a big issue either way.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"4e91c695f12268d094d355deb4f7aa7ed23b98e4","unresolved":false,"context_lines":[{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_3f8cd07e","line":33,"in_reply_to":"3afb71cf_e11b417f","updated":"2015-06-11 17:49:38.000000000","message":"Ok, I will need to verify this.\n\nWould the test steps be:\n\n1) Create two HOTs. One with only a server resource and another with only a LB resource.\n\n2) Create the server stack (s1)\n\n3) Extract the server id from (s1). Lets call it sid.\n\n4) Create the LB stack (l1)\n\n5) Update the LB stack (l1) by passing in the id of the server (sid)\n\nExpected outcome is that the LB is connected to the server.\n\n\nHaving said that, James, lets discuss what you meant by Solum already handling concurrent stack creates from different deployers. Because we don\u0027t do any coordination between different deployers.\nAlso, assuming that this approach also works, then the steps such as those identified above are essentially the protocol that I am referring to in the spec. For this protocol also we would have to prove that the correctness properties identified in the spec hold.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_89717d0e","line":37,"updated":"2015-06-10 22:57:26.000000000","message":"This shouldn\u0027t be an issue after Liberty when convergence phase 1 lands.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"d0d2ec32018076956d00056e0b9a1232c129e7d5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_2102790c","line":37,"in_reply_to":"3afb71cf_01cf7db4","updated":"2015-06-11 17:28:55.000000000","message":"Not yet but should be available in Liberty.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"76aa99bc29a6c4e0823b5927d912cd068fa4ec52","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_2e16e8f1","line":37,"in_reply_to":"3afb71cf_13ffd6ab","updated":"2015-06-11 16:50:28.000000000","message":"Convergence will allow you to send multiple updates and Heat will converge on what is the latest desired state. This may actually be sub-optimal in this case given that you want to pace updates in such a way as to allow for old connections to die off. Just something to be aware of that you won\u0027t have to worry too much about now.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"4e91c695f12268d094d355deb4f7aa7ed23b98e4","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_dff13c03","line":37,"in_reply_to":"3afb71cf_2102790c","updated":"2015-06-11 17:49:38.000000000","message":"Ok.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"8f7e8a1eba54a3bfce3ddd5613251dcf6ac7d9b0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_01cf7db4","line":37,"in_reply_to":"3afb71cf_2e16e8f1","updated":"2015-06-11 17:03:40.000000000","message":"I see. Is convergence already available?\n\nIs it available in Rackspace version of Heat?","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Step 1 (add new server) will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"},{"line_number":36,"context_line":"is already an UPDATE_IN_PROGRESS. This may happen if there are two code updates submitted in quick"},{"line_number":37,"context_line":"succession and the corresponding update actions are picked by two different deployers."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"Step 2 (delete old server) will be to issue heat stack-update call with a template from which"},{"line_number":40,"context_line":"the old server is deleted. Note that after step 1 we need to wait till the stack\u0027s status changes"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_13ffd6ab","line":37,"in_reply_to":"3afb71cf_89717d0e","updated":"2015-06-11 16:15:28.000000000","message":"I see.. Could you elaborate a bit on this point?","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":46,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_89485db4","line":47,"updated":"2015-06-10 22:57:26.000000000","message":"This isn\u0027t valid given there is no equivalent operation that I can find in Neutron LBaaS. I don\u0027t think this spec should be written such that this proposal only works on one vendor\u0027s cloud.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"d0d2ec32018076956d00056e0b9a1232c129e7d5","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":46,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_a4b317e9","line":47,"in_reply_to":"3afb71cf_01365db4","updated":"2015-06-11 17:28:55.000000000","message":"I disagree that its fundamentally different. Its just a matter of which LB implementation to use upstream vs what Rackspace would use in its deployment.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"8f7e8a1eba54a3bfce3ddd5613251dcf6ac7d9b0","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":46,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_01365db4","line":47,"in_reply_to":"3afb71cf_4ec7e464","updated":"2015-06-11 17:03:40.000000000","message":"Sure.\n\nThe fact that the Openstack upstream feature is so different than Rackspace feature of LBs, I don\u0027t think it makes sense to consider this spec to address both.\n\nI will create another spec to discuss how the feature can be implemented using Neutron.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"76aa99bc29a6c4e0823b5927d912cd068fa4ec52","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":46,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_4ec7e464","line":47,"in_reply_to":"3afb71cf_5378ae2b","updated":"2015-06-11 16:50:28.000000000","message":"I don\u0027t think this is the place to discuss vendor modifications/extensions. I\u0027ll leave that up to the team, but it seems like this is a generally useful feature and should be proposed here in a generally useable manner.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":46,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_5378ae2b","line":47,"in_reply_to":"3afb71cf_89485db4","updated":"2015-06-11 16:15:28.000000000","message":"Fair point.\n\nI haven\u0027t researched what capabilities are available in Neutron LBaaS. Having said that, it is clear from our offline discussions that Rackspace CLB is very different than upstream. In this spec I want to focus on how we can use Rackspace CLB to achieve non-destructive app updates.\n\nI can create a directory named \u0027rackspace\u0027 in the specs directory and include this spec there..\n\nThoughts?","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"},{"line_number":51,"context_line":"   status can be queried and it is set to \u0027DRAINED\u0027 after all current connections have been"},{"line_number":52,"context_line":"   handled correctly. -- Need to verify)"},{"line_number":53,"context_line":"3) Update the stack to delete the old server. This will remove it from the LB pool."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_29e729ad","line":50,"updated":"2015-06-10 22:57:26.000000000","message":"I don\u0027t think this reliably happens anyway and isn\u0027t valid if using OpenStack services.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"},{"line_number":51,"context_line":"   status can be queried and it is set to \u0027DRAINED\u0027 after all current connections have been"},{"line_number":52,"context_line":"   handled correctly. -- Need to verify)"},{"line_number":53,"context_line":"3) Update the stack to delete the old server. This will remove it from the LB pool."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_53854eab","line":50,"in_reply_to":"3afb71cf_29e729ad","updated":"2015-06-11 16:15:28.000000000","message":"Ok, in that case when should we delete the old server?\n\nWe could use some upper bound timeout.. but what should it be?\n\nPer documentation of Rackspace CLB, the CLB will stop accepting new connections on a node which is set to \u0027DRAINING\u0027 state. It will only service all the outstanding connections after that. The connections will be completely done only after all the clients have closed their side of the connection. In general we would not know when the clients would close their connections. There may be clients who have long running sessions with the node.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"76aa99bc29a6c4e0823b5927d912cd068fa4ec52","unresolved":false,"context_lines":[{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"},{"line_number":51,"context_line":"   status can be queried and it is set to \u0027DRAINED\u0027 after all current connections have been"},{"line_number":52,"context_line":"   handled correctly. -- Need to verify)"},{"line_number":53,"context_line":"3) Update the stack to delete the old server. This will remove it from the LB pool."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_8ec95c5d","line":50,"in_reply_to":"3afb71cf_53854eab","updated":"2015-06-11 16:50:28.000000000","message":"I think a configurable timeout sounds reasonable in the general case.\n\nAs far as any Rackspace proprietary service extensions, I think the timeout suffices here as well given the reliablilty of the info we have at hand. Some connections may be unexpectedly terminated, but the app itself remains intact and uninterrupted in the larger sense.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"8f7e8a1eba54a3bfce3ddd5613251dcf6ac7d9b0","unresolved":false,"context_lines":[{"line_number":47,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":48,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the HOT for the"},{"line_number":49,"context_line":"   old server to \u0027DRAINING\u0027."},{"line_number":50,"context_line":"2) Monitor the old server\u0027s status for reaching the \u0027DRAINED\u0027 status (Assuming here that the node\u0027s"},{"line_number":51,"context_line":"   status can be queried and it is set to \u0027DRAINED\u0027 after all current connections have been"},{"line_number":52,"context_line":"   handled correctly. -- Need to verify)"},{"line_number":53,"context_line":"3) Update the stack to delete the old server. This will remove it from the LB pool."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_a144291b","line":50,"in_reply_to":"3afb71cf_8ec95c5d","updated":"2015-06-11 17:03:40.000000000","message":"Yep.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":60,"context_line":"Correctness properties"},{"line_number":61,"context_line":"-----------------------"},{"line_number":62,"context_line":"We want the update protocol to satisfy following correctness conditions."},{"line_number":63,"context_line":"1) The protocol should guarantee zero downtime application update."},{"line_number":64,"context_line":"2) The protocol is correct in the presence of multiple deployers."},{"line_number":65,"context_line":"Specifically, it is not possible for a stack to contain more than two servers at any time."},{"line_number":66,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_c98775b3","line":63,"updated":"2015-06-10 22:57:26.000000000","message":"Define \"zero downtime\" because as proposed, this could still result in users with existing connections to get unexpected or broken behavior (temporarily) from the running application.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":60,"context_line":"Correctness properties"},{"line_number":61,"context_line":"-----------------------"},{"line_number":62,"context_line":"We want the update protocol to satisfy following correctness conditions."},{"line_number":63,"context_line":"1) The protocol should guarantee zero downtime application update."},{"line_number":64,"context_line":"2) The protocol is correct in the presence of multiple deployers."},{"line_number":65,"context_line":"Specifically, it is not possible for a stack to contain more than two servers at any time."},{"line_number":66,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_93b9867c","line":63,"in_reply_to":"3afb71cf_c98775b3","updated":"2015-06-11 16:15:28.000000000","message":"Sure.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":64,"context_line":"2) The protocol is correct in the presence of multiple deployers."},{"line_number":65,"context_line":"Specifically, it is not possible for a stack to contain more than two servers at any time."},{"line_number":66,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"},{"line_number":67,"context_line":"be in the \u0027DRAINING\u0027 or \u0027DRAINED\u0027 condition."},{"line_number":68,"context_line":"3) When there are code updates made in quick succession the latest (last) code update"},{"line_number":69,"context_line":"is reflected in the deployed app."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_89a4dd4a","line":67,"updated":"2015-06-10 22:57:26.000000000","message":"Again, this is specific to one vendor\u0027s cloud and unsuitable as a general solution IMO.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"76aa99bc29a6c4e0823b5927d912cd068fa4ec52","unresolved":false,"context_lines":[{"line_number":64,"context_line":"2) The protocol is correct in the presence of multiple deployers."},{"line_number":65,"context_line":"Specifically, it is not possible for a stack to contain more than two servers at any time."},{"line_number":66,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"},{"line_number":67,"context_line":"be in the \u0027DRAINING\u0027 or \u0027DRAINED\u0027 condition."},{"line_number":68,"context_line":"3) When there are code updates made in quick succession the latest (last) code update"},{"line_number":69,"context_line":"is reflected in the deployed app."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_aeead8aa","line":67,"in_reply_to":"3afb71cf_1354761f","updated":"2015-06-11 16:50:28.000000000","message":"IMO, I think that\u0027s a mistake at least in this venue.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":64,"context_line":"2) The protocol is correct in the presence of multiple deployers."},{"line_number":65,"context_line":"Specifically, it is not possible for a stack to contain more than two servers at any time."},{"line_number":66,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"},{"line_number":67,"context_line":"be in the \u0027DRAINING\u0027 or \u0027DRAINED\u0027 condition."},{"line_number":68,"context_line":"3) When there are code updates made in quick succession the latest (last) code update"},{"line_number":69,"context_line":"is reflected in the deployed app."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_1354761f","line":67,"in_reply_to":"3afb71cf_89a4dd4a","updated":"2015-06-11 16:15:28.000000000","message":"Agreed.\n\nI would like to make this spec focused on solving the Rackspace case. So I would request evaluating the proposal from that point of view.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":72,"context_line":"Correctness property enforcement"},{"line_number":73,"context_line":"---------------------------------"},{"line_number":74,"context_line":"Zero downtime property can be considered to be made of two parts. First, the application URL"},{"line_number":75,"context_line":"does not change. Second, existing connections are handled properly."},{"line_number":76,"context_line":"The existence of the load balancer will guarantee that the application URL is never inaccessible."},{"line_number":77,"context_line":"Setting of the condition on the previous server to \u0027DRAINING\u0027 will ensure that existing connections"},{"line_number":78,"context_line":"are handled properly."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_74ca941c","line":75,"updated":"2015-06-10 22:57:26.000000000","message":"The second isn\u0027t easy or even possible to do in a reliable way AFIAK.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":72,"context_line":"Correctness property enforcement"},{"line_number":73,"context_line":"---------------------------------"},{"line_number":74,"context_line":"Zero downtime property can be considered to be made of two parts. First, the application URL"},{"line_number":75,"context_line":"does not change. Second, existing connections are handled properly."},{"line_number":76,"context_line":"The existence of the load balancer will guarantee that the application URL is never inaccessible."},{"line_number":77,"context_line":"Setting of the condition on the previous server to \u0027DRAINING\u0027 will ensure that existing connections"},{"line_number":78,"context_line":"are handled properly."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_933e26d9","line":75,"in_reply_to":"3afb71cf_74ca941c","updated":"2015-06-11 16:15:28.000000000","message":"Fair enough.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":105,"context_line":"Other deployer impact"},{"line_number":106,"context_line":"---------------------"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_14ea4074","line":108,"updated":"2015-06-10 22:57:26.000000000","message":"As proposed, this would require a deployer to run Heat configured to only work with Rackspace Cloud.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":105,"context_line":"Other deployer impact"},{"line_number":106,"context_line":"---------------------"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_eb020209","line":108,"in_reply_to":"3afb71cf_14ea4074","updated":"2015-06-11 16:15:28.000000000","message":"Good point. This will be a downstream patch.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"86d7cccfc03505de61017d9c505bdafef9eb21b5","unresolved":false,"context_lines":[{"line_number":105,"context_line":"Other deployer impact"},{"line_number":106,"context_line":"---------------------"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_39b509d0","line":108,"in_reply_to":"3afb71cf_4ef12495","updated":"2015-06-11 19:55:38.000000000","message":"So how much of this can be generalized and kept out of a downstream patch? Can we focus on those features, and maybe reshape the spec to match?\n\nI think the process, discussion, and these notes are useful enough to share. Even if a lot of vendor-specific details aren\u0027t relevant to the general case, there may be equivalent tooling available in the future in one form or another.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"76aa99bc29a6c4e0823b5927d912cd068fa4ec52","unresolved":false,"context_lines":[{"line_number":105,"context_line":"Other deployer impact"},{"line_number":106,"context_line":"---------------------"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"None"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Developer impact"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_4ef12495","line":108,"in_reply_to":"3afb71cf_eb020209","updated":"2015-06-11 16:50:28.000000000","message":"Again, then it is my opinion that this be proposed internally and not as part of OpenStack. That being said, this feature would seem to have a solution that doesn\u0027t rely on any vendor specific services and seems to have general merit.","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"9409ce5ec4d6dee906b0730ef275175feed8d888","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"Work Items"},{"line_number":128,"context_line":"----------"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"- Develop the update_heat_stack method"},{"line_number":131,"context_line":"- Develop the heat templates"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_b4fb6c46","line":128,"updated":"2015-06-10 22:57:26.000000000","message":"Unit/Functional tests?","commit_id":"2da64532db7682f615b83360f35695107750fe94"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"95ed0266c6c5991339e29b4f7f02531fa7bd4665","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"Work Items"},{"line_number":128,"context_line":"----------"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"- Develop the update_heat_stack method"},{"line_number":131,"context_line":"- Develop the heat templates"}],"source_content_type":"text/x-rst","patch_set":5,"id":"3afb71cf_8b126e57","line":128,"in_reply_to":"3afb71cf_b4fb6c46","updated":"2015-06-11 16:15:28.000000000","message":"Yes. Those two too.","commit_id":"2da64532db7682f615b83360f35695107750fe94"}],"specs/liberty/rackspace-app-update.rst":[{"author":{"_account_id":668,"name":"Adrian Otto","email":"aotto@aotto.com","username":"aotto"},"change_message_id":"c00c7619cf2600b69fe07f683394345426b3271f","unresolved":false,"context_lines":[{"line_number":5,"context_line":" http://creativecommons.org/licenses/by/3.0/legalcode"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":8,"context_line":"Non-destructive app update on Rackspace"},{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This specification outlines an approach to perform application code updates in Solum"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba3cc151_9c1a6416","line":8,"updated":"2015-09-08 20:51:38.000000000","message":"Where is the blueprint for this feature?","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":668,"name":"Adrian Otto","email":"aotto@aotto.com","username":"aotto"},"change_message_id":"c00c7619cf2600b69fe07f683394345426b3271f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"This specification outlines an approach to perform application code updates in Solum"},{"line_number":12,"context_line":"that preserve application\u0027s URL using Rackspace\u0027s cloud load balancer [1]."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Problem description"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ba3cc151_46ae4d99","line":12,"updated":"2015-09-08 20:51:38.000000000","message":"Is there a way to implement this that\u0027s not specific to RAX? Could it also work with Neutron LB?","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"One approach to keep the app URL constant across app deployments is to use a heat template"},{"line_number":27,"context_line":"that has two resources, a load balancer and a server, and the load balancer connected to the server."},{"line_number":28,"context_line":"To ensure that the application\u0027s URL does not change across multiple deployments, the idea"},{"line_number":29,"context_line":"is to perform a heat stack update in which we create the new server, add it to the load balancer,"},{"line_number":30,"context_line":"and delete the old server when the new server is up."}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_010e4be5","line":27,"updated":"2015-06-19 19:19:01.000000000","message":"might I suggest\n\n    that has two resources: a load balancer connected to a server.","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":29,"context_line":"is to perform a heat stack update in which we create the new server, add it to the load balancer,"},{"line_number":30,"context_line":"and delete the old server when the new server is up."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"One way to effect the above change is to follow a two step protocol as outlined below."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Step 1 will be to issue heat stack-update call with a template in which"},{"line_number":35,"context_line":"the new server is added. Note that it may happen that step 1 may throw an exception if there"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_c11f0308","line":32,"updated":"2015-06-19 19:19:01.000000000","message":"affect","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"4ffb432ecbe9ffad652e4e7709f6c697ddc9d275","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"Using Rackspace\u0027s cloud load balancer, the details of the protocol are as follows:"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"This leads to the following protocol (app update protocol):"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":48,"context_line":"   - Add new server (node) to the LB pool."}],"source_content_type":"text/x-rst","patch_set":7,"id":"1af86dd1_9b4dff74","line":45,"updated":"2015-06-16 16:01:03.000000000","message":"This sentence sounds redundant. Also, not to beat a dead horse, but it does sound like this could be written in a more general sense in terms of template modifications (add the new node, disable the original node, etc) and stack-update calls.","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":2506,"name":"devdatta-kulkarni","email":"kulkarni.devdatta@gmail.com","username":"devdatta-kulkarni"},"change_message_id":"2f1d97d7588599a7ae1ee5e58146edd4b336b6fa","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":48,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":49,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":50,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the old server"},{"line_number":51,"context_line":"   to \u0027DRAINING\u0027 in the updated HOT."},{"line_number":52,"context_line":"2) Update the stack to delete the old server after a configurable timeout."}],"source_content_type":"text/x-rst","patch_set":7,"id":"1af86dd1_955f030e","line":49,"updated":"2015-06-12 21:19:32.000000000","message":"Looks like the \u0027DRAINING\u0027 property is not allowed to be set.\n\nHere is the error that I saw:\n\nStackValidationFailed: Property error : lb.Properties.nodes[0].condition: \"DRAINING\" is not an allowed value [ENABLED, DISABLED]","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"4ffb432ecbe9ffad652e4e7709f6c697ddc9d275","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"1) As an atomic unit perform the following actions:"},{"line_number":48,"context_line":"   - Add new server (node) to the LB pool."},{"line_number":49,"context_line":"   - Set the status of the old server to \u0027DRAINING\u0027. In Rackspace\u0027s cloud load balancer"},{"line_number":50,"context_line":"   resource [1] this will be done by setting the \u0027condition\u0027 property in the old server"},{"line_number":51,"context_line":"   to \u0027DRAINING\u0027 in the updated HOT."},{"line_number":52,"context_line":"2) Update the stack to delete the old server after a configurable timeout."}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_6aec7d8f","line":49,"in_reply_to":"1af86dd1_955f030e","updated":"2015-06-16 16:01:03.000000000","message":"This sounds good then, because that kinda matches the neutron lb api for \"nodes\" (admin_state_up: true/false). As I understand it, DISABLED for RCLB and admin_state_up\u003dFalse for Neutron LBaaS both drain connections.","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":62,"context_line":"We want the update protocol to satisfy following correctness conditions."},{"line_number":63,"context_line":"1) The protocol is correct in the presence of multiple deployers."},{"line_number":64,"context_line":"Specifically, it should not be possible for a stack to contain more than two servers at any time."},{"line_number":65,"context_line":"Moreoever, of the two servers, one will be in the \u0027ENABLED\u0027 condition and another will"},{"line_number":66,"context_line":"be in the \u0027DRAINING\u0027 or \u0027DRAINED\u0027 condition."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"2) When there are code updates made in quick succession the latest (last) code update"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_81f01bcb","line":65,"updated":"2015-06-19 19:19:01.000000000","message":"Moreover, ... condition and the other will","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":74,"context_line":"because these will be satisfied with a single deployer. With more than one deployers, we"},{"line_number":75,"context_line":"want to ensure that the system guarantees what it can guarantee with a single deployer."},{"line_number":76,"context_line":"Said differently, to consumers of Solum (application developer), the behavior of Solum"},{"line_number":77,"context_line":"should be consistent whether it uses a single deployer or multiple deployers."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Correctness property enforcement"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_a19bdf71","line":77,"updated":"2015-06-19 19:19:01.000000000","message":"I like this last sentence. We seek to guarantee the consistency in spite of varied setups.","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"Correctness property enforcement"},{"line_number":81,"context_line":"---------------------------------"},{"line_number":82,"context_line":"a) Atmost two servers:"},{"line_number":83,"context_line":"The atomic update action performed in step 1 will guarante property 1."},{"line_number":84,"context_line":"When there are two (almost) simultaneous requests from two deployers to heat, only the first one"},{"line_number":85,"context_line":"will be picked up by heat and second request will fail."}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_618cf735","line":82,"updated":"2015-06-19 19:19:01.000000000","message":"At most","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":101,"context_line":"will set the \u0027deployment in progress\u0027 column and proceed with executing the app update protocol."},{"line_number":102,"context_line":"This \u0027check-and-set\u0027 procedure will be done in a transactional context."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Consider two almost simulatenous code updates done at times t1 and t2 (where t2 \u003e t1)."},{"line_number":105,"context_line":"Suppose t1 is picked by deployer d1 and t2 is picked by d2."},{"line_number":106,"context_line":"Suppose that d2 is faster than d1 and has already started executing the app update protocol."},{"line_number":107,"context_line":"When its d1\u0027s time to initiate the app update protocol, it will find that there is already"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_21726fae","line":104,"updated":"2015-06-19 19:19:01.000000000","message":"simultaneous","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":104,"context_line":"Consider two almost simulatenous code updates done at times t1 and t2 (where t2 \u003e t1)."},{"line_number":105,"context_line":"Suppose t1 is picked by deployer d1 and t2 is picked by d2."},{"line_number":106,"context_line":"Suppose that d2 is faster than d1 and has already started executing the app update protocol."},{"line_number":107,"context_line":"When its d1\u0027s time to initiate the app update protocol, it will find that there is already"},{"line_number":108,"context_line":"a more recent DU\u0027s deployment in progress and it will abort."},{"line_number":109,"context_line":"This will guarantee that only DU from d2 is deployed."},{"line_number":110,"context_line":"On the other hand, if d1 is the first one to start the app update protocol, when d2\u0027s time"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_a1b51f32","line":107,"updated":"2015-06-19 19:19:01.000000000","message":"it\u0027s","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":109,"context_line":"This will guarantee that only DU from d2 is deployed."},{"line_number":110,"context_line":"On the other hand, if d1 is the first one to start the app update protocol, when d2\u0027s time"},{"line_number":111,"context_line":"comes to initiate the protocol, it will go ahead with it. But since that heat update will"},{"line_number":112,"context_line":"be initiated after the update from d1 is complete, eventually only d2\u0027s DU will be the deployed DU."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"This proves that using the database as a coordination mechanism will guarantee that the"},{"line_number":115,"context_line":"\u0027latest code update wins\u0027 property is satisifed."}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_e147a71b","line":112,"updated":"2015-06-19 19:19:01.000000000","message":"I wonder if we can\u0027t cook up a pair of diagrams and embed them here?","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"},{"author":{"_account_id":1375,"name":"Ed Cranford","email":"ed.cranford@gmail.com","username":"ed--cranford"},"change_message_id":"f6c16f62d569915bfc9fd4ea854fb83b746dfd19","unresolved":false,"context_lines":[{"line_number":111,"context_line":"comes to initiate the protocol, it will go ahead with it. But since that heat update will"},{"line_number":112,"context_line":"be initiated after the update from d1 is complete, eventually only d2\u0027s DU will be the deployed DU."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"This proves that using the database as a coordination mechanism will guarantee that the"},{"line_number":115,"context_line":"\u0027latest code update wins\u0027 property is satisifed."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"(Thanks to James Li (yueli.m@gmail.com) for the suggestion of using database for coordination"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fa32b979_41dc5318","line":114,"updated":"2015-06-19 19:19:01.000000000","message":"Your implementation relies on a direct connection to a consistent database, right? How much of this can we still guarantee if we use solum-conductor, or we distribute the database in a weird way, or we just throw a cache in front of the db?","commit_id":"98a5bbd5d3bfbf9f9171e3161ef6596afcb02354"}]}
